首批通过分布式安全可靠测评,为关键业务系统打造
租户预扩容
更新时间:2026-04-15 17:16:58
为了进一步实现租户的平滑扩缩容,OceanBase 数据库实现了预扩容功能。该功能是通过配置租户从缩容到扩容所需的扩容系数(ls_scale_out_factor),提前产生足够多的日志流,使日志流的状态和位置与扩容后均能匹配的情况下,再开始租户的扩容或缩容操作,从而达到平滑扩缩容的目的。
背景信息
在 V4.x 之前版本中,OceanBase 数据库仅支持租户的同构 Zone 模式,同构 Zone 模式下,租户下各 Zone 的 UNIT_NUM 必须相同。在 V4.2.5 版本中,OceanBase 数据库从 V4.2.5 BP5 版本开始,支持租户的异构 Zone 模式。异构 Zone 模式下,租户下各 Zone 的 UNIT_NUM 可以相同也可以不同,但一个租户的所有 Zone 最多只能有两种 UNIT_NUM。
本文主要以同构 Zone 模式的租户为例,提供租户预扩容的操作指导。对于异构 Zone 模式的租户,建议使用异构 Zone 的运维方式来实现平滑扩缩容。通过异构 Zone 实现平滑扩缩容的使用案例,参见 平滑扩缩容应用案例。
使用限制
对于 V4.2.5 版本,从 V4.2.5 BP1 版本开始支持预扩容功能。
扩容系数介绍
在之前的版本中,一个租户在一个节点上有且仅有一个日志流提供服务,如果一个节点内有足够多的日志流提供服务,就可以在扩容时直接触发日志流位置的重分布,而不需要再通过 Transfer 来分裂日志流。
为了定义扩容前已经有足够多的日志流,OceanBase 数据库引入了扩容系数(ls_scale_out_factor)的概念。扩容系数定义的是,为了达到后续的扩容需求,一个日志流所需拆分出的日志流个数。
扩容系数的计算公式
在 OceanBase 数据库中,对于同构 Zone 模式的租户,各 Unit Group 上租户的正常日志流个数(不含系统日志流和广播日志流)为:租户 UNIT_NUM 的个数(U)* 租户 PRIAMRY_ZONE 第一优先级的个数(P)。
假设在扩容前,租户的 UNIT_NUM 个数为 U1,租户的 PRIAMRY_ZONE 第一优先级的个数为 P1;扩容后,租户的 UNIT_NUM 个数为 U2,租户的 PRIAMRY_ZONE 第一优先级的个数为 P2。则扩容系数(ls_scale_out_factor)的计算公式如下:
ls_scale_out_factor = LCM(U1 * p1 , U2 * P2 )/ (U1 * P1)
即,(U1 * p1)与 (U2 * P2) 这两个值的最小公倍数再除以 (U1 * P1),就能得到该租户的扩容系数。
预扩容
假设当前有一同构 Zone 模式下的租户 mq_t1,其 Locality 为 F@zone1, F@zone2, F@zone3,每个 Zone 上有 1 个 Unit,PRIMARY_ZONE 打散在 zone1 和 zone2上,后续期望将租户的 UNIT_NUM 调整为 2,且租户的 PRIMARY_ZONE 第一优先级的个数不变,则对该租户进行预扩容的操作如下。
使用
root用户登录到集群的 sys 租户。连接示例如下:
obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -A查看租户
mq_t1的TENANT_ID、UNIT_NUM以及PRIAMRY_ZONE等信息。obclient> SELECT * FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mq_t1';查询结果如下:
+-----------+-------------+-------------+----------------------------+----------------------------+---------------------+---------------------------------------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+----------+-------------------------+------------+-----------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | CREATE_TIME | MODIFY_TIME | PRIMARY_ZONE | LOCALITY | PREVIOUS_LOCALITY | COMPATIBILITY_MODE | STATUS | IN_RECYCLEBIN | LOCKED | TENANT_ROLE | SWITCHOVER_STATUS | SWITCHOVER_EPOCH | SYNC_SCN | REPLAYABLE_SCN | READABLE_SCN | RECOVERY_UNTIL_SCN | LOG_MODE | ARBITRATION_SERVICE_STATUS | UNIT_NUM | ZONE_UNIT_NUM_LIST | COMPATIBLE | MAX_LS_ID | +-----------+-------------+-------------+----------------------------+----------------------------+---------------------+---------------------------------------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+----------+-------------------------+------------+-----------+ | 1002 | mq_t1 | USER | 2024-11-22 15:35:13.392880 | 2024-11-22 15:35:31.923530 | zone1,zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | NULL | MYSQL | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | 1732261018646683000 | 1732261018646683000 | 1732261018646683000 | 4611686018427387903 | NOARCHIVELOG | DISABLED | 1 | zone1:1,zone2:1,zone3:1 | 4.2.5.5 | 1002 | +-----------+-------------+-------------+----------------------------+----------------------------+---------------------+---------------------------------------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+----------+-------------------------+-----------+-----------+ 1 row in set计算扩容系数 ls_scale_out_factor 的值,并配置租户的扩容系数。
在本示例中,租户
mq_t1扩容前的UNIT_NUM个数为 1,PRIAMRY_ZONE第一优先级的个数为 2;扩容后,租户的UNIT_NUM个数 2,PRIMARY_ZONE第一优先级的个数不变仍为 2,根据扩容系数的计算公式,其扩容系数为LCM(2 * 1 , 2 * 2)/(2 * 1) = 2。根据计算出的扩容系数,设置配置项 ls_scale_out_factor 的值。
obclient> ALTER SYSTEM SET ls_scale_out_factor = 2 TENANT = mq_t1;将租户级配置项 enable_rebalance 和 enable_transfer 的值均设置为开启状态(
True),以便让租户下可以产生足够多的日志流。obclient> ALTER SYSTEM SET enable_rebalance = True TENANT = mq_t1;obclient> ALTER SYSTEM SET enable_transfer = True TENANT = mq_t1;等待租户产生足够多的日志流后,查询当前租户下
NORMAL状态的日志流个数是否符合预期。根据扩容系数的公式,扩容后当前租户下
NORMAL状态(不含系统日志流和广播日志流)的日志流个数应该为:扩容前租户的UNIT_NUM数(U1)* 扩容前租户的PRIAMRY_ZONE第一优先级的个数(P1)* 扩容系数(ls_scale_out_factor),即当前租户下日志流个数应为1 * 2 * 2 = 4。obclient> SELECT TENANT_ID, STATUS, COUNT(*) FROM oceanbase.CDB_OB_LS WHERE TENANT_ID = 1002 AND FLAG = '' AND LS_ID != 1 GROUP BY STATUS;查询结果的示例如下:
+-----------+--------+----------+ | TENANT_ID | STATUS | COUNT(*) | +-----------+--------+----------+ | 1002 | NORMAL | 4 | +-----------+--------+----------+ 1 row in set确认待扩容的租户下不再有负载均衡任务。
obclient> SELECT * FROM oceanbase.CDB_OB_BALANCE_JOBS WHERE TENANT_ID = 1002;如果查询结果为空,则表示本次预扩容操作完成。
后续操作
完成预扩容操作后,用户可以根据业务需要,按照预期的扩容方案进行扩缩容操作: