【SOP 系列 06】手动扩容 OceanBase 集群

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/12Gsystem_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_ipmigrate_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 为准。

666

2 个赞

很详细,学习了~

1 个赞

很详细,学习了~

1 个赞

都是对unit操作

很详细,学习了~

非常好的学习材料