1、给已有的 zone 添加 OBServer
集群级别的扩容通常可以通过增加 OBServer 服务器来完成,扩容可以增加整个集群的资源数量,可以分配更多的资源给租户。通常在租户资源占满当前集群的情况下如需新加租户,或者租户扩容,此时需要集群级别的扩容。
1.1 按 unit 纬度统计资源情况
mysql> select unit_config_name,resource_pool_name,zone,tenant_name,svr_ip,
-> svr_port,max_cpu,min_cpu,round(max_memory/1024/1024/1024,2) as max_memory,
-> round(min_memory/1024/1024/1024,2) as min_memory from gv$unit
-> order by tenant_id;
+------------------+--------------------+-------+-------------+----------------+----------+---------+---------+------------+------------+
| unit_config_name | resource_pool_name | zone | tenant_name | svr_ip | svr_port | max_cpu | min_cpu | max_memory | min_memory |
+------------------+--------------------+-------+-------------+----------------+----------+---------+---------+------------+------------+
| sys_unit_config | sys_pool | zone1 | sys | 172.30.199.109 | 2882 | 3 | 3 | 3.00 | 3.00 |
| sys_unit_config | sys_pool | zone2 | sys | 172.30.199.110 | 2882 | 3 | 3 | 3.00 | 3.00 |
| sys_unit_config | sys_pool | zone3 | sys | 172.30.199.111 | 2882 | 3 | 3 | 3.00 | 3.00 |
| u1 | pool1 | zone1 | test1 | 172.30.199.109 | 2882 | 2 | 2 | 3.00 | 3.00 |
| u1 | pool1 | zone2 | test1 | 172.30.199.110 | 2882 | 2 | 2 | 3.00 | 3.00 |
| u1 | pool1 | zone3 | test1 | 172.30.199.111 | 2882 | 2 | 2 | 3.00 | 3.00 |
| u2 | pool2 | zone1 | test2 | 172.30.199.109 | 2882 | 3 | 3 | 2.00 | 2.00 |
| u2 | pool2 | zone2 | test2 | 172.30.199.110 | 2882 | 3 | 3 | 2.00 | 2.00 |
| u2 | pool2 | zone3 | test2 | 172.30.199.111 | 2882 | 3 | 3 | 2.00 | 2.00 |
+------------------+--------------------+-------+-------------+----------------+----------+---------+---------+------------+------------+
9 rows in set (0.01 sec)
1.2 按 zone 纬度统计资源情况
mysql> select zone,
-> sum(cpu_total) as zone_cpu_total,
-> sum(cpu_capacity) as zone_cpu_capacity,
-> sum(cpu_assigned) as zone_cpu_assigned,
-> sum(leader_count) as zone_leader_count,
-> sum(round(mem_total/1024/1024/1024,2)) as zone_mem_total,
-> sum(round(mem_capacity/1024/1024/1024,2)) as zone_mem_capacity,
-> sum(round(mem_assigned/1024/1024/1024,2)) as zone_mem_assigned
-> from __all_virtual_server_stat group by zone;
+-------+----------------+-------------------+-------------------+-------------------+----------------+-------------------+-------------------+
| zone | zone_cpu_total | zone_cpu_capacity | zone_cpu_assigned | zone_leader_count | zone_mem_total | zone_mem_capacity | zone_mem_assigned |
+-------+----------------+-------------------+-------------------+-------------------+----------------+-------------------+-------------------+
| zone1 | 14 | 14 | 8 | 3810 | 8.00 | 8.00 | 8.00 |
| zone2 | 14 | 14 | 8 | 2613 | 8.00 | 8.00 | 8.00 |
| zone3 | 14 | 14 | 8 | 2492 | 8.00 | 8.00 | 8.00 |
+-------+----------------+-------------------+-------------------+-------------------+----------------+-------------------+-------------------+
3 rows in set (0.01 sec)
1.3 按 host 纬度统计资源情况
mysql> select u.zone,u.svr_ip,u.svr_port,
-> max(s.cpu_total),
-> sum(u.max_cpu) as assigned_max_cpu,
-> max(s.cpu_total)-sum(u.max_cpu) as free_cpu,
-> round(max(s.mem_total/1024/1024/1024),2) as memory_total,
-> round(sum(u.max_memory/1024/1024/1024),2) as assigned_max_memory,
-> round(max(s.mem_total/1024/1024/1024),2)-round(sum(u.max_memory/1024/1024/1024),2) as free_memory,
-> max(s.leader_count)
-> from oceanbase.gv$unit u, oceanbase.__all_virtual_server_stat s
-> where s.svr_ip=u.svr_ip and s.svr_port=u.svr_port
-> group by u.zone,u.svr_ip,u.svr_port
-> order by zone;
+-------+----------------+----------+------------------+------------------+----------+--------------+---------------------+-------------+---------------------+
| zone | svr_ip | svr_port | max(s.cpu_total) | assigned_max_cpu | free_cpu | memory_total | assigned_max_memory | free_memory | max(s.leader_count) |
+-------+----------------+----------+------------------+------------------+----------+--------------+---------------------+-------------+---------------------+
| zone1 | 172.30.199.109 | 2882 | 14 | 8 | 6 | 8.00 | 8.00 | 0.00 | 3810 |
| zone2 | 172.30.199.110 | 2882 | 14 | 8 | 6 | 8.00 | 8.00 | 0.00 | 2613 |
| zone3 | 172.30.199.111 | 2882 | 14 | 8 | 6 | 8.00 | 8.00 | 0.00 | 2492 |
+-------+----------------+----------+------------------+------------------+----------+--------------+---------------------+-------------+---------------------+
3 rows in set (0.01 sec)
扩容前有个 1-1-1 的 OceanBase 集群,每台机器规格 16c/12G
,system_memory=4G
,即实际租户可用的总内存只有 8G。
此时如果要扩容 test1/test2 租户或者新建一个 test3 租户,这里假设需要扩容 test2 租户,扩容后的如下所示,由于剩余内存为 0,所以需要扩容集群。
说明:
1、这里在一台机器上部署多个 OBServer 节点用来模拟不同的机器,实际线上环境建议一台机器部署一个 OBServer 节点。
2、本小节是介绍如何扩容集群,在后续的如何扩容租户中会进一步完成 test2 租户从 3c/2G,扩容到 6c/4G。
1.4 在新机器上部署并启动 OBServer
启动OBServer 请参考 手动部署 OceanBase 集群 步骤1 ~ 6。
说明:
1、机器的规划请以实际的为准。
2、目录结构可以参考扩容前的目录结构,尽可能保持一致,方便管理。
3、OBServer 启动命令中 -i
需要跟新扩容的机器的网卡名对应,-z
应根据第 1 步规划保持对应。
4、OBServer 启动命令中注意 -r,-n,-c
跟扩容前的 OceanBase 集群保持一致,查询方法依次如下:
show parameters like 'rootservice_list';
show parameters like 'cluster';
show parameters like 'cluster_id';
1.5 给每个已有的 zone 添加对应的 OBServer 节点
set ob_query_timeout=10000000000000;
alter system add server '172.30.199.109:12882' zone 'zone1';
alter system add server '172.30.199.110:12882' zone 'zone2';
alter system add server '172.30.199.111:12882' zone 'zone3';
说明:
1、这里的端口是 observer 的 rpc 端口,默认是 2882,由于测试环境 2882 已被占用,这里使用 12882 作为 rpc 的端口,且需要跟对应启动命令行中 -P(大写) 指定的端口,zone 的名字保持一致,
2、由于 enable_rebalance
参数默认是开启的,在执行 add server 后,会自动 rebalance,会根据当时的负载均衡将其中的 unit 迁移到同 zone 新扩容的机器上。
3、如果想手动控制指定 unit 迁移到新的机器上:
(1) 可以在执行 1.5 步骤前设置 alter system set enable_rebalance='False';
(2) 然后执行 add server
命令;
(3) alter system migrate unit ${unit_id} destination='目标observer_ip:目标observer_rpc_port';
这里的${unit_id}
对应 select unit_id from gv$unit where svr_ip='目标observer_ip' and svr_port=目标observer_rpc_port;
(4) alter system set enable_rebalance='True';
1.6 如何确认 unit 是否迁移完成
select @unit_id:=unit_id as unit_id,
@migrate_from_svr_ip:=if(migrate_from_svr_ip="",NULL,migrate_from_svr_ip) as migrate_from_svr_ip,
@migrate_from_svr_port:=if(migrate_from_svr_port="",NULL,migrate_from_svr_port) as migrate_from_svr_port
from __all_unit where migrate_from_svr_ip != "" or migrate_from_svr_port != "";
select
@migrate_from_svr_ip,
@migrate_from_svr_port,
count(*)
from __all_virtual_partition_table
where unit_id = (
select unit_id
from __all_unit
where migrate_from_svr_ip != ""
or migrate_from_svr_port != "")
and svr_ip = @migrate_from_svr_ip and svr_port=@migrate_from_svr_port;
1、当 migrate_from_svr_ip
和 migrate_from_svr_port
为空时候表示 unit 已完成迁移。
2、通过判断迁移的 unit 中的分区数来观察迁移的进度。
1.7 扩容期间和扩容完后验证
通过验证 1.1、1.2、1.3 查看集群资源。
2、创建新的 zone 并添加 observer
当集群的容灾需求发生变化时,可通过调整可用区数量,即增加或者减少 zone 的方式来提高或降低集群的容灾能力。
2.1 扩容前后对比
2.2 在新机器上部署并启动 OBServer
启动OBServer 请参考 手动部署 OceanBase 集群步骤1 ~ 6。
说明:
1、机器的规划请以实际的为准。
2、目录结构可以参考扩容前的目录结构,尽可能保持一致,方便管理。
3、observer 启动命令中 -i
需要跟新扩容的机器的网卡名对应,-z
应根据第 1 步规划保持对应。
4、observer 启动命令中注意 -r ,-n ,-c
跟扩容前的 OceanBase 集群保持一致,查询方法依次如下:
show parameters like 'rootservice_list';
show parameters like 'cluster';
show parameters like 'cluster_id';
示例:
cd ~/oceanbase-ce-2 && bin/observer -i eth0 -p 12881 -P 12882 -z zone4 -d ~/oceanbase-ce-2/store/obtest -r '172.30.199.123:2882:2881;172.30.199.124:2882:2881;172.30.199.125:2882:2881' -c 1 -n obtest -o "memory_limit=12G,cache_wash_threshold=1G,__min_full_resource_pool_memory=268435456,system_memory=4G,memory_chunk_cache_size=128M,cpu_count=16,net_thread_count=4,datafile_size=10G,stack_size=1536K"
2.3 添加并启动 zone
alter system add zone 'zone4';
alter system add zone 'zone5';
alter system start zone 'zone4';
alter system start zone 'zone5';
2.4 给新添加的 zone 下添加 OBServer
alter system add server '172.30.199.109:12882' zone 'zone4';
alter system add server '172.30.199.110:12882' zone 'zone5';
2.5 修改 resource pool
alter resource pool sys_pool zone_list=('zone1','zone2','zone3','zone4','zone5');
alter resource pool pool1 zone_list=('zone1','zone2','zone3','zone4','zone5');
alter resource pool pool2 zone_list=('zone1','zone2','zone3','zone4','zone5');
2.6 修改租户副本
每次只能在原来的基础上增加一个 zone 的副本,这里以 test1 租户为例,其他的替换租户名和租户 id,副本类型和副本位置根据实际规划进行调整。
ALTER TENANT test1 LOCALITY='F@zone1,F@zone2,F@zone3,F@zone4';
ALTER TENANT test1 LOCALITY='F@zone1,F@zone2,F@zone3,F@zone4,F@zone5';
2.7 如何确认副本是否调整完成
可以通过 __all_virtual_replica_task
虚拟表来观察添加副本的进度,当查询为空说明已完成对应租户的副本调整任务(不是很准确)。
select * from __all_virtual_replica_task where tenant_id = 1001;
还可以通过统计新的 zone下分区个数(副本)来评估。
select count(*),zone from gv$partition where tenant_id=1001 group by zone;
说明具体执行时候,应根据实际的租户 id 为准。