首批通过分布式安全可靠测评,为关键业务系统打造
租户预扩容
更新时间:2026-06-17 11:27:22
为了进一步实现租户的平滑扩缩容,OceanBase 数据库实现了预扩容功能。该功能是通过配置租户从缩容到扩容所需的扩容系数(ls_scale_out_factor),提前产生足够多的日志流,使日志流的状态和位置与扩容后均能匹配的情况下,再开始租户的扩容或缩容操作,从而达到平滑扩缩容的目的。
背景信息
在当前版本中,OceanBase 数据库支持租户的同构 Zone 模式和异构 Zone 模式:
同构 Zone 模式下,要求租户下各 Zone 的
UNIT_NUM必须相同。异构 Zone 模式下,租户下各 Zone 的
UNIT_NUM可以相同也可以不同,但一个租户的所有 Zone 最多只能有两种UNIT_NUM。
本文主要以同构 Zone 模式的租户为例,提供租户预扩容的操作指导。对于异构 Zone 模式的租户,建议使用异构 Zone 的运维方式来实现平滑扩缩容。通过异构 Zone 实现平滑扩缩容的使用案例,参见 平滑扩缩容应用案例。
扩容系数介绍
在之前的版本中,一个租户在一个节点上有且仅有一个日志流提供服务,如果一个节点内有足够多的日志流提供服务,就可以在扩容时直接触发日志流位置的重分布,而不需要再通过 Transfer 来分裂日志流。
为了定义扩容前已经有足够多的日志流,OceanBase 数据库引入了扩容系数(ls_scale_out_factor)的概念。扩容系数定义的是,为了达到后续的扩容需求,一个日志流所需拆分出的日志流个数。
扩容系数的计算公式
在 OceanBase 数据库中,租户的正常日志流个数(不含系统日志流和广播日志流)为:租户 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),就能得到该租户的扩容系数。
预扩容
假设当前有一租户 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(root@sys)[oceanbase]> SELECT TENANT_ID, TENANT_NAME, TENANT_TYPE, PRIMARY_ZONE, LOCALITY, UNIT_NUM FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mq_t1';查询结果如下:
+-----------+-------------+-------------+-------------------+---------------------------------------------+----------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE | LOCALITY | UNIT_NUM | +-----------+-------------+-------------+-------------------+---------------------------------------------+----------+ | 1002 | mq_t1 | USER | zone1,zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | 1 | +-----------+-------------+-------------+-------------------+---------------------------------------------+----------+ 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(root@sys)[oceanbase]> ALTER SYSTEM SET ls_scale_out_factor = 2 TENANT = mq_t1;将租户级配置项 enable_rebalance 和 enable_transfer 的值均设置为开启状态(
True),以便让租户下可以产生足够多的日志流。obclient(root@sys)[oceanbase]> ALTER SYSTEM SET enable_rebalance = True TENANT = mq_t1;obclient(root@sys)[oceanbase]> 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(root@sys)[oceanbase]> 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(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_BALANCE_JOBS WHERE TENANT_ID = 1002;如果查询结果为空,则表示本次预扩容操作完成。
后续操作
完成预扩容操作后,用户可以根据业务需要,按照预期的扩容方案进行扩缩容操作: