在 OceanBase 数据库 V4.x 初始的版本中,OceanBase 数据库仅支持租户的 同构 Zone 模式。也就是说一个租户在多个可用区,可以有不同 unit 规格,但是,租户下各 Zone 的 unit_num 数量必须相同。
从 V4.2.5 BP5 版本、V4.4.2 版本开始,OceanBase 支持租户的异构 Zone 模式。异构 Zone 模式下,租户下各 Zone 的 UNIT_NUM 可以相同也可以不同,但一个租户的所有 Zone 最多只能有两种 UNIT_NUM。
租户的同构 Zone 模式中,要求同一个租户所有 Zone 的 Unit 个数相同。
系统为每个 Zone 的 Unit 进行了编号,不同 Zone 之间相同编号(UNIT_GROUP_ID)的 Unit 组成一个 Unit Group。
Unit Group 具有以下特性:
-
每个 Unit Group 分配唯一 ID,系统租户通过 oceanbase.DBA_OB_UNITS 视图的 UNIT_GROUP_ID 字段可以查看该 ID。 sys租户下,通过oceanbase.DBA_OB_UNITS视图可以查询所有的 Unit,及其所归属的 Unit Group。例如:
obclient(root@sys)[oceanbase]> select TENANT_ID,UNIT_ID,UNIT_GROUP_ID,ZONE,SVR_IP from dba_ob_units-> where tenant_id in (1002,1004) order by tenant_id,UNIT_GROUP_ID,ZONE;+-----------+---------+---------------+-------+-------------+| TENANT_ID | UNIT_ID | UNIT_GROUP_ID | ZONE | SVR_IP |+-----------+---------+---------------+-------+-------------+| 1002 | 1002 | 1001 | zone1 | 172.18.8.79 || 1002 | 1003 | 1001 | zone2 | 172.18.8.80 || 1002 | 1001 | 1001 | zone3 | 172.18.8.81 || 1002 | 1005 | 1002 | zone1 | 172.18.8.76 || 1002 | 1006 | 1002 | zone2 | 172.18.8.77 || 1002 | 1004 | 1002 | zone3 | 172.18.8.78 || 1004 | 1007 | 1003 | zone1 | 172.18.8.79 || 1004 | 1011 | 1003 | zone2 | 172.18.8.80 || 1004 | 1009 | 1003 | zone3 | 172.18.8.81 || 1004 | 1008 | 1004 | zone1 | 172.18.8.76 || 1004 | 1012 | 1004 | zone2 | 172.18.8.77 || 1004 | 1010 | 1004 | zone3 | 172.18.8.78 |+-----------+---------+---------------+-------+-------------+12 rows in set (0.828 sec)
obclient(root@sys)[oceanbase]> select TENANT_ID,TENANT_NAME,PRIMARY_ZONE,UNIT_NUM,LOCALITY from dba_ob_tenants where TENANT_NAME='ob_t1';+-----------+-------------+-------------------+----------+---------------------------------------------+| TENANT_ID | TENANT_NAME | PRIMARY_ZONE | UNIT_NUM | LOCALITY |+-----------+-------------+-------------------+----------+---------------------------------------------+| 1002 | ob_t1 | zone1,zone2,zone3 | 2 | FULL{1}, FULL{1}, FULL{1} |+-----------+-------------+-------------------+----------+---------------------------------------------+1 row in set (0.146 sec)
租户ob_t1 配置为 unit_num =2,primary_zone ='Z1,Z2,Z3',则该租户定义了 2 个 Unit Group、2 个 日志流组和 6 个日志流。
obclient(root@sys)[oceanbase]> select TENANT_ID,LS_ID,PRIMARY_ZONE,UNIT_GROUP_ID,LS_GROUP_ID,UNIT_LIST from cdb_ob_ls where TENANT_ID in (1002,1004);+-----------+-------+-------------------+---------------+-------------+----------------+| TENANT_ID | LS_ID | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID | UNIT_LIST |+-----------+-------+-------------------+---------------+-------------+----------------+| 1002 | 1 | zone1;zone2,zone3 | 0 | 0 | || 1002 | 1001 | zone1;zone2,zone3 | 0 | 1001 | 1001,1002,1003 || 1002 | 1002 | zone2;zone1,zone3 | 0 | 1001 | 1001,1002,1003 || 1002 | 1003 | zone3;zone1,zone2 | 0 | 1001 | 1001,1002,1003 || 1002 | 1004 | zone1;zone2,zone3 | 0 | 1002 | 1004,1005,1006 || 1002 | 1005 | zone2;zone1,zone3 | 0 | 1002 | 1004,1005,1006 || 1002 | 1006 | zone3;zone1,zone2 | 0 | 1002 | 1004,1005,1006 || 1004 | 1 | zone1;zone2;zone3 | 0 | 0 | || 1004 | 1001 | zone1;zone2;zone3 | 0 | 1001 | 1007,1009,1011 || 1004 | 1002 | zone1;zone2;zone3 | 0 | 1002 | 1008,1010,1012 |+-----------+-------+-------------------+---------------+-------------+----------------+10 rows in set (1.772 sec)obclient(root@sys)[oceanbase]>
obclient(root@sys)[oceanbase]> select TENANT_ID,LS_ID,SVR_IP,ZONE,ROLE,MEMBER_LIST from cdb_ob_ls_locations where tenant_id in (1002,1004);+-----------+-------+-------------+-------+----------+-------------------------------------------------------------------------------------------------------+| TENANT_ID | LS_ID | SVR_IP | ZONE | ROLE | MEMBER_LIST |+-----------+-------+-------------+-------+----------+-------------------------------------------------------------------------------------------------------+| 1002 | 1 | 172.18.8.79 | zone1 | LEADER | 172.18.8.79:2882:1,172.18.8.80:2882:1,172.18.8.81:2882:1 || 1002 | 1 | 172.18.8.80 | zone2 | FOLLOWER | NULL || 1002 | 1 | 172.18.8.81 | zone3 | FOLLOWER | NULL || 1002 | 1001 | 172.18.8.79 | zone1 | LEADER | 172.18.8.79:2882:1,172.18.8.80:2882:1,172.18.8.81:2882:1 || 1002 | 1001 | 172.18.8.80 | zone2 | FOLLOWER | NULL || 1002 | 1001 | 172.18.8.81 | zone3 | FOLLOWER | NULL || 1002 | 1002 | 172.18.8.79 | zone1 | FOLLOWER | NULL || 1002 | 1002 | 172.18.8.80 | zone2 | LEADER | 172.18.8.79:2882:1,172.18.8.80:2882:1,172.18.8.81:2882:1 || 1002 | 1002 | 172.18.8.81 | zone3 | FOLLOWER | NULL || 1002 | 1003 | 172.18.8.79 | zone1 | FOLLOWER | NULL || 1002 | 1003 | 172.18.8.80 | zone2 | FOLLOWER | NULL || 1002 | 1003 | 172.18.8.81 | zone3 | LEADER | 172.18.8.79:2882:1,172.18.8.80:2882:1,172.18.8.81:2882:1 || 1002 | 1004 | 172.18.8.76 | zone1 | LEADER | 172.18.8.76:2882:1775300963493505,172.18.8.77:2882:1775300993356110,172.18.8.78:2882:1775301004887633 || 1002 | 1004 | 172.18.8.77 | zone2 | FOLLOWER | NULL || 1002 | 1004 | 172.18.8.78 | zone3 | FOLLOWER | NULL || 1002 | 1005 | 172.18.8.76 | zone1 | FOLLOWER | NULL || 1002 | 1005 | 172.18.8.77 | zone2 | LEADER | 172.18.8.76:2882:1775300963493752,172.18.8.77:2882:1775300993356312,172.18.8.78:2882:1775301008323303 || 1002 | 1005 | 172.18.8.78 | zone3 | FOLLOWER | NULL || 1002 | 1006 | 172.18.8.76 | zone1 | FOLLOWER | NULL || 1002 | 1006 | 172.18.8.77 | zone2 | FOLLOWER | NULL || 1002 | 1006 | 172.18.8.78 | zone3 | LEADER | 172.18.8.76:2882:1775300963493842,172.18.8.77:2882:1775300974038511,172.18.8.78:2882:1775300993356497 || 1004 | 1 | 172.18.8.79 | zone1 | LEADER | 172.18.8.79:2882:1,172.18.8.80:2882:1,172.18.8.81:2882:1 || 1004 | 1 | 172.18.8.80 | zone2 | FOLLOWER | NULL || 1004 | 1 | 172.18.8.81 | zone3 | FOLLOWER | NULL || 1004 | 1001 | 172.18.8.79 | zone1 | LEADER | 172.18.8.79:2882:1,172.18.8.80:2882:1,172.18.8.81:2882:1 || 1004 | 1001 | 172.18.8.80 | zone2 | FOLLOWER | NULL || 1004 | 1001 | 172.18.8.81 | zone3 | FOLLOWER | NULL || 1004 | 1002 | 172.18.8.76 | zone1 | LEADER | 172.18.8.76:2882:1,172.18.8.77:2882:1,172.18.8.78:2882:1 || 1004 | 1002 | 172.18.8.77 | zone2 | FOLLOWER | NULL || 1004 | 1002 | 172.18.8.78 | zone3 | FOLLOWER | NULL |+-----------+-------+-------------+-------+----------+-------------------------------------------------------------------------------------------------------+30 rows in set (1.811 sec)
【同构 zone 模式特殊场景局限性】
模拟 observer 服务器宕机 下线,2-2-2 集群中删除一台有硬件故障的服务器。
尝试 OCP 云平台 白屏执行 删除操作,报错。
所以此时需要 修改所有租户、所有 zone unit_num 改为1 。
同构 zone 模式下,比如3-3-3的集群,多个业务租户unit_num=3。
假如其中一个zone的一台observer 服务器有硬件故障宕机,如果有可以替换的硬件服务器,可以先添加服务器,进行替换。
假如没有可替换的机器,需要 delete server 下线故障机器进行维修,然后重新加回来。就需要把其他租户的unit_num也一起缩容 unit_num=2 才可以成功。这个过程会导致 分区的 transfer 和 unit 的迁移。 本身租户扩缩容是可以在线完成的,但是对于高度敏感的业务,还是需要尽量避免高峰期此类操作。
主机硬件维修完成后添加回来,还需要重新调整unit_num 扩容回去。把一个zone的observer故障恢复影响到所有zone。
【异构zone模式】
一些对于响应时间高度敏感的业务,在执行租户的扩缩容时,需要严格限制日志流 Leader 所在的节点执行的负载均衡操作,这些负载均衡操作包括 Transfer 任务、日志流副本的迁移复制、Leader 切主等。
可以借助异构 Zone,避免业务高峰期切主和 Leader 副本迁移的发生,使整个扩缩容过程更加平稳。
hetero( homogeneous异构 Zone 模式)。
homo(同构 Zone 模式)。
OCP 云平台
直接修改业务租户 ob_t1 配置项 zone_deploy_mode = hetero
ob_t1 业务租户设置 zone_deploy_mode=hetero 开启了 异构zone模式后,OCP云平台(V4.4.1版本) 白屏租户概率界面,已经可以对单个zone 修改 unit_number 进行 租户单个zone 的水平扩缩容了。
单个zone,可以手动进行 删除副本 或者 删除unit 的操作。
对单个zone , 执行 删除 unit 操作,本质上就是当前zone 进行 unit_num 缩容。
查看异构zone模式下 unit 分布
obclient(root@sys)[oceanbase]> select TENANT_ID,UNIT_ID,UNIT_GROUP_ID,ZONE,SVR_IP from dba_ob_units-> where tenant_id in (1002,1004) order by TENANT_ID,UNIT_GROUP_ID,zone;+-----------+---------+---------------+-------+-------------+| TENANT_ID | UNIT_ID | UNIT_GROUP_ID | ZONE | SVR_IP |+-----------+---------+---------------+-------+-------------+| 1002 | 1002 | 1001 | zone1 | 172.18.8.79 || 1002 | 1005 | 1002 | zone1 | 172.18.8.76 || 1002 | 1006 | 1005 | zone2 | 172.18.8.77 || 1002 | 1001 | 1005 | zone3 | 172.18.8.81 || 1004 | 1007 | 1003 | zone1 | 172.18.8.79 || 1004 | 1011 | 1003 | zone2 | 172.18.8.80 || 1004 | 1009 | 1003 | zone3 | 172.18.8.81 || 1004 | 1008 | 1004 | zone1 | 172.18.8.76 || 1004 | 1012 | 1004 | zone2 | 172.18.8.77 || 1004 | 1010 | 1004 | zone3 | 172.18.8.78 |+-----------+---------+---------------+-------+-------------+10 rows in set (0.110 sec)
obclient(root@sys)[oceanbase]> select TENANT_ID,TENANT_NAME,PRIMARY_ZONE,UNIT_NUM,ZONE_UNIT_NUM_LIST-> from dba_ob_tenants where tenant_id in (1,1002,1004);+-----------+-------------+-------------------+----------+-------------------------+| TENANT_ID | TENANT_NAME | PRIMARY_ZONE | UNIT_NUM | ZONE_UNIT_NUM_LIST |+-----------+-------------+-------------------+----------+-------------------------+| 1 | sys | RANDOM | 1 | zone1:1,zone2:1,zone3:1 || 1002 | ob_t1 | zone1,zone2,zone3 | 1 | zone1:2,zone2:1,zone3:1 || 1004 | ob_t2 | zone1;zone2;zone3 | 2 | zone1:2,zone2:2,zone3:2 |+-----------+-------------+-------------------+----------+-------------------------+3 rows in set (0.138 sec)
obclient(root@sys)[oceanbase]> select TENANT_ID,LS_ID,PRIMARY_ZONE,UNIT_GROUP_ID,LS_GROUP_ID,UNIT_LIST-> from cdb_ob_ls where tenant_id in (1002,1004);+-----------+-------+-------------------+---------------+-------------+----------------+| TENANT_ID | LS_ID | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID | UNIT_LIST |+-----------+-------+-------------------+---------------+-------------+----------------+| 1002 | 1 | zone1;zone2,zone3 | 0 | 0 | || 1002 | 1001 | zone1;zone2,zone3 | 0 | 1001 | 1001,1002,1006 || 1002 | 1002 | zone2;zone1,zone3 | 0 | 1001 | 1001,1002,1006 || 1002 | 1003 | zone3;zone1,zone2 | 0 | 1001 | 1001,1002,1006 || 1002 | 1004 | zone1;zone2,zone3 | 0 | 1002 | 1001,1005,1006 || 1002 | 1005 | zone2;zone1,zone3 | 0 | 1002 | 1001,1005,1006 || 1002 | 1006 | zone3;zone1,zone2 | 0 | 1002 | 1001,1005,1006 || 1004 | 1 | zone1;zone2;zone3 | 0 | 0 | || 1004 | 1001 | zone1;zone2;zone3 | 0 | 1001 | 1007,1009,1011 || 1004 | 1002 | zone1;zone2;zone3 | 0 | 1002 | 1008,1010,1012 |+-----------+-------+-------------------+---------------+-------------+----------------+10 rows in set (3.866 sec)
obclient(root@sys)[oceanbase]> select TENANT_ID,LS_ID,SVR_IP,ZONE,ROLE,MEMBER_LIST from cdb_ob_ls_locations where tenant_id in (1002,1004);+-----------+-------+-------------+-------+----------+-------------------------------------------------------------------------------------------------------+| TENANT_ID | LS_ID | SVR_IP | ZONE | ROLE | MEMBER_LIST |+-----------+-------+-------------+-------+----------+-------------------------------------------------------------------------------------------------------+| 1002 | 1 | 172.18.8.77 | zone2 | FOLLOWER | NULL || 1002 | 1 | 172.18.8.79 | zone1 | LEADER | 172.18.8.77:2882:1775344430894410,172.18.8.79:2882:1,172.18.8.81:2882:1 || 1002 | 1 | 172.18.8.81 | zone3 | FOLLOWER | NULL || 1002 | 1001 | 172.18.8.77 | zone2 | FOLLOWER | NULL || 1002 | 1001 | 172.18.8.79 | zone1 | LEADER | 172.18.8.77:2882:1775314171928777,172.18.8.79:2882:1,172.18.8.81:2882:1 || 1002 | 1001 | 172.18.8.81 | zone3 | FOLLOWER | NULL || 1002 | 1002 | 172.18.8.77 | zone2 | LEADER | 172.18.8.77:2882:1775314171928971,172.18.8.79:2882:1,172.18.8.81:2882:1 || 1002 | 1002 | 172.18.8.79 | zone1 | FOLLOWER | NULL || 1002 | 1002 | 172.18.8.81 | zone3 | FOLLOWER | NULL || 1002 | 1003 | 172.18.8.77 | zone2 | FOLLOWER | NULL || 1002 | 1003 | 172.18.8.79 | zone1 | FOLLOWER | NULL || 1002 | 1003 | 172.18.8.81 | zone3 | LEADER | 172.18.8.77:2882:1775314173423457,172.18.8.79:2882:1,172.18.8.81:2882:1 || 1002 | 1004 | 172.18.8.76 | zone1 | LEADER | 172.18.8.76:2882:1775300963493505,172.18.8.77:2882:1775300993356110,172.18.8.81:2882:1775346288243475 || 1002 | 1004 | 172.18.8.77 | zone2 | FOLLOWER | NULL || 1002 | 1004 | 172.18.8.81 | zone3 | FOLLOWER | NULL || 1002 | 1005 | 172.18.8.76 | zone1 | FOLLOWER | NULL || 1002 | 1005 | 172.18.8.77 | zone2 | LEADER | 172.18.8.76:2882:1775300963493752,172.18.8.77:2882:1775300993356312,172.18.8.81:2882:1775346288243651 || 1002 | 1005 | 172.18.8.81 | zone3 | FOLLOWER | NULL || 1002 | 1006 | 172.18.8.76 | zone1 | FOLLOWER | NULL || 1002 | 1006 | 172.18.8.77 | zone2 | FOLLOWER | NULL || 1002 | 1006 | 172.18.8.81 | zone3 | LEADER | 172.18.8.76:2882:1775300963493842,172.18.8.77:2882:1775300974038511,172.18.8.81:2882:1775346288243725 || 1004 | 1 | 172.18.8.79 | zone1 | LEADER | 172.18.8.79:2882:1,172.18.8.80:2882:1,172.18.8.81:2882:1 || 1004 | 1 | 172.18.8.80 | zone2 | FOLLOWER | NULL || 1004 | 1 | 172.18.8.81 | zone3 | FOLLOWER | NULL || 1004 | 1001 | 172.18.8.79 | zone1 | LEADER | 172.18.8.79:2882:1,172.18.8.80:2882:1,172.18.8.81:2882:1 || 1004 | 1001 | 172.18.8.80 | zone2 | FOLLOWER | NULL || 1004 | 1001 | 172.18.8.81 | zone3 | FOLLOWER | NULL || 1004 | 1002 | 172.18.8.76 | zone1 | LEADER | 172.18.8.76:2882:1,172.18.8.77:2882:1,172.18.8.78:2882:1 || 1004 | 1002 | 172.18.8.77 | zone2 | FOLLOWER | NULL || 1004 | 1002 | 172.18.8.78 | zone3 | FOLLOWER | NULL |+-----------+-------+-------------+-------+----------+-------------------------------------------------------------------------------------------------------+30 rows in set (1.239 sec)obclient(root@sys)[oceanbase]>
异构 Zone 模式下:
系统按照 Unit 的粒度控制各日志流的分布。
在租户同一个 Zone 内部,每个 Unit 上的日志流个数相等。
不同 Zone 之间,Unit 上的日志流个数可以不相同。
日志流组内所有日志流分布在对应的 UNIT_LIST 上,日志流 Leader 打散在 Primary Zone 上。
如上图实验查询结果,租户ob_t1 有 3个 Zone,配置为 zone1 unit_num =2,zone2 和 zone 3 unit_num =1,且 primary_zone ='zone1,zone2,zone3',在均衡状态下,用户日志流总数为 6。
当前实验环境:
zone 3的 unit 1001 和 zone2 unit 1006 上,有6个日志流。
zone1 的 unit 1002 和 unit 1005 上,各有3个日志流。
异构 Zone 下,日志流在各个 Zone 内的副本的分布聚合方式是可以不同的。
obclient(root@sys)[oceanbase]> select RESOURCE_POOL_ID,NAME,TENANT_ID,UNIT_COUNT,UNIT_CONFIG_ID,ZONE_LIST from dba_ob_resource_pools where tenant_id = 1002 order by zone_list;+------------------+----------------------+-----------+------------+----------------+-----------+| RESOURCE_POOL_ID | NAME | TENANT_ID | UNIT_COUNT | UNIT_CONFIG_ID | ZONE_LIST |+------------------+----------------------+-----------+------------+----------------+-----------+| 1002 | pool_ob_t1_zone1_xuh | 1002 | 2 | 1006 | zone1 || 1003 | pool_ob_t1_zone2_qzi | 1002 | 1 | 1005 | zone2 || 1001 | pool_ob_t1_zone3_hot | 1002 | 1 | 1007 | zone3 |+------------------+----------------------+-----------+------------+----------------+-----------+3 rows in set (0.656 sec)
【alter resource pool】
alter resource pool 修改租户资源池属性是:
单条语句只能修改一个属性,如果需要同时修改 UNIT、UNIT_NUM、ZONE_LIST 中两条及以上的属性,需要分多条语句执行。
修改 ZONE_LIST 时,每次仅支持添加或删除一个 Zone。
alter resource pool / alter resource tenant 修改租户资源池
修改租户资源池unit_num
【同构 Zone 模式 】
如果资源池创建后未分配给租户使用,可以使用 alter resource pool语句进行修改;
如果该资源池已经被租户使用,需要使用 ALTER RESOURCE TENANT 语句进行修改。
【异构 Zone 模式】
如果资源池已经分配给租户使用,既可以使用 alter resource pool语句进行修改,也可以使用 alter resource tenant 语句进行修改。
但修改时,要求一个租户下多个资源池最多只能有两种不同的 UNIT_NUM。
【异构zone模式 平滑扩缩容】
有了异构zone模式,对于响应时间比较敏感的业务,进行扩缩容时,可以采用按zone扩容。 先把 follower 副本所在的 zone 扩缩容完成。然后修改 primary zone 进行 leader 切换。
依此类推,逐一调整所有 zone。业务在整个扩缩容过程中,只会在极短的时间内感知到 leader 切换的影响。副本迁移在 follower 副本所在的 zone 进行,业务几乎不感知。
END
瑞蓝创 OceanBase OBCP V4 精英训练营
点击下方图片立即了解详情


▼ 点击「阅读原文」,了解更多产品技术文章


