首批通过分布式安全可靠测评,为关键业务系统打造
通过调整 Unit Number 实现租户扩缩容
更新时间:2026-02-26 19:51:08
租户扩容和缩容本质上是提高和降低租户的服务能力,包括计算能力和存储容量。可以通过提高单节点的服务能力达成,也可以通过增加服务节点达成。本文介绍如何通过修改 Unit Number,从而增加或减少服务节点,达到租户总服务能力的提升或降低,实现租户的扩容或缩容。
修改 Unit Number 包括调大或调小 Unit Number。从 V4.0.0 版本开始,OceanBase 数据库要求租户内每个 Zone 的 Unit 个数必须保持一致。为了方便统一管理各个 Zone 的 Unit,系统引入了 Unit Group 机制,即不同 Zone 之间相同编号(UNIT_GROUP_ID)的 Unit 属于同一个 Unit Group。调大或调小 Unit Number 本质上是以 Unit Group 为单位创建和删除 Unit。
前提条件
在进行租户的扩容和缩容操作前,需要进行以下操作:
设置租户内的负载均衡策略
租户内的负载均衡策略由租户级配置项
enable_rebalance和enable_transfer共同控制。配置项
enable_rebalance在系统租户下用于控制是否进行租户间的负载均衡,在用户租户下用于控制是否进行租户内均衡。对租户进行扩缩容操作时,需要开启租户内的均衡。有关租户间均衡策略与租户内均衡策略的详细介绍,参见 数据负载均衡最佳实践。该配置项的默认值为true,表示开启均衡,设置后不需要重启 OBServer 节点,立即生效。配置项
enable_transfer用于控制是否开启租户下的 Transfer 功能,默认值为true,设置后不需要重启 OBServer 节点,立即生效。其中:当配置项
enable_rebalance的值为false时,无论配置项enable_transfer的值为true还是false,系统均不会进行自动负载均衡。当配置项
enable_rebalance的值为true且enable_transfer的值为true时,表示在进行租户扩缩容操作时,系统会自动调整分区分布,实现负载均衡。当配置项
enable_rebalance的值为true且enable_transfer的值为false时,表示在进行租户扩缩容操作时,系统不能发起 Transfer 操作,只能通过日志流迁移实现有限的均衡。
具体设置方法如下:
系统租户设置指定租户的负载均衡策略
系统租户开启指定租户的租户内负载均衡和租户下的 Transfer 功能
ALTER SYSTEM SET enable_rebalance = true TENANT = 'tenant_name';ALTER SYSTEM SET enable_transfer = true TENANT = 'tenant_name';以上语句表示仅指定租户下的配置项
enable_rebalance和enable_transfer的值为true。系统租户开启所有用户租户(不含
sys租户和 Meta 租户)的租户内负载均衡和租户下的 Transfer 功能ALTER SYSTEM SET enable_rebalance = true TENANT = all_user;ALTER SYSTEM SET enable_transfer = true TENANT = all_user;或者
ALTER SYSTEM SET enable_rebalance = true TENANT = all;ALTER SYSTEM SET enable_transfer = true TENANT = all;以上语句表示所有用户租户下配置项
enable_rebalance和enable_transfer的值为true。说明
OceanBase 数据库从 V4.2.1 版本开始,
TENANT = all_user与TENANT = all语义相同,在需要生效范围为所有用户租户时,推荐使用TENANT = all_user,后续TENANT = all将废弃不再使用。
用户租户设置本租户的负载均衡策略
MySQL 模式Oracle 模式MySQL 租户开启本租户的租户内负载均衡和租户下的 Transfer 功能的语句如下:
ALTER SYSTEM SET enable_rebalance = true;ALTER SYSTEM SET enable_transfer = true;Oracle 租户开启本租户的租户内负载均衡和租户下的 Transfer 功能的语句如下:
ALTER SYSTEM SET enable_rebalance = 'true';ALTER SYSTEM SET enable_transfer = 'true';
更多配置项
enable_rebalance和enable_transfer的详细说明,请参见 enable_rebalance 和 enable_transfer。由于空闲的资源池会被计算为占用的资源,故在扩容前,如果有租户被删除,建议与租户对应的资源池也一并删除,以便释放资源。
删除资源池的相关操作,参见 删除资源池。
进行租户缩容前,建议进行一轮转储以便释放租户正在使用的内存。
手动触发转储的相关操作,参见 手动触发转储。
执行租户扩缩容操作前,建议先进行租户的资源规划,以便更好地达到预期效果。
有关租户扩缩容资源规划的详细操作,参见租户扩缩容资源规划。
调大 Unit Number
下面以调大租户 mysql001 的 Unit Number 为例来介绍操作方法。
使用
root用户登录到集群的sys租户。obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -A进入
oceanbase数据库。obclient(root@sys)[(none)]> use oceanbase;查看租户
mysql001信息,获取其TENANT_ID。obclient(root@sys)[oceanbase]> SELECT TENANT_ID, TENANT_NAME, TENANT_TYPE, PRIMARY_ZONE, LOCALITY, TENANT_ROLE, UNIT_NUM FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mysql001';查询结果如下:
+-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE | LOCALITY | TENANT_ROLE | UNIT_NUM | +-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+ | 1006 | mysql001 | USER | zone1;zone2,zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | PRIMARY | 1 | +-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+ 1 row in set查询结果中,租户的
TENANT_ID为 1006,且UNIT_NUM的值为 1,表示该租户的 Unit Number 数为 1。查看租户
mysql001所拥有的 Unit。obclient(root@sys)[oceanbase]> SELECT UNIT_ID, TENANT_ID, STATUS, RESOURCE_POOL_ID, UNIT_GROUP_ID, ZONE, UNIT_CONFIG_ID FROM oceanbase.DBA_OB_UNITS WHERE TENANT_ID = 1006;查询结果如下:
+---------+-----------+--------+------------------+---------------+-------+----------------+ | UNIT_ID | TENANT_ID | STATUS | RESOURCE_POOL_ID | UNIT_GROUP_ID | ZONE | UNIT_CONFIG_ID | +---------+-----------+--------+------------------+---------------+-------+----------------+ | 1017 | 1006 | ACTIVE | 1003 | 1007 | zone1 | 1002 | | 1019 | 1006 | ACTIVE | 1003 | 1007 | zone2 | 1002 | | 1021 | 1006 | ACTIVE | 1003 | 1007 | zone3 | 1002 | +---------+-----------+--------+------------------+---------------+-------+----------------+ 3 rows in set根据查询结果可知,租户
mysql001的每个 Zone 均有 1 个 Unit,且这 3 个 Unit 属于同一个 Unit Group。把租户
mysql001的UNIT_NUM修改为 2。obclient(root@sys)[oceanbase]> ALTER RESOURCE TENANT mysql001 UNIT_NUM = 2;查看调大 Unit Number 任务的执行状态。
obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE='ALTER_RESOURCE_TENANT_UNIT_NUM' AND TENANT_ID=1006;查询结果如下:
+--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+---------------------------------------------+--------------------+----------------+-------------+ | JOB_ID | JOB_TYPE | JOB_STATUS | RESULT_CODE | PROGRESS | START_TIME | MODIFY_TIME | TENANT_ID | SQL_TEXT | EXTRA_INFO | RS_SVR_IP | RS_SVR_PORT | +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+---------------------------------------------+--------------------+----------------+-------------+ | 6 | ALTER_RESOURCE_TENANT_UNIT_NUM | SUCCESS | 0 | 100 | 2023-09-25 18:38:05.889876 | 2023-09-25 18:38:25.531461 | 1006 | ALTER RESOURCE TENANT mysql001 UNIT_NUM = 2 | FROM: '1', TO: '2' | xxx.xx.xxx.196 | 2882 | | 7 | ALTER_RESOURCE_TENANT_UNIT_NUM | SUCCESS | 0 | 100 | 2023-09-26 09:37:32.367076 | 2023-09-26 09:39:05.651200 | 1006 | ALTER RESOURCE TENANT mysql001 UNIT_NUM = 1 | FROM: '2', TO: '1' | xxx.xx.xxx.196 | 2882 | | 8 | ALTER_RESOURCE_TENANT_UNIT_NUM | SUCCESS | 0 | 100 | 2023-09-26 09:57:45.028091 | 2023-09-26 09:58:00.412204 | 1006 | ALTER RESOURCE TENANT mysql001 UNIT_NUM = 2 | FROM: '1', TO: '2' | xxx.xx.xxx.196 | 2882 | +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+---------------------------------------------+--------------------+----------------+-------------+ 6 rows in set查询结果中,根据以下字段,找到对应的任务记录:
START_TIME:任务的发起时间。SQL_TEXT:任务对应的 SQL 语句。EXTRA_INFO:变更前后的 Unit Number 数。
当对应变更记录中
JOB_STATUS的值为SUCCESS时,表示调大 Unit Number 的任务执行成功。有关视图
DBA_OB_TENANT_JOBS的详细字段说明,请参见 DBA_OB_TENANT_JOBS。查看租户
mysql001修改后的 Unit。obclient(root@sys)[oceanbase]> SELECT UNIT_ID, TENANT_ID, STATUS, RESOURCE_POOL_ID, UNIT_GROUP_ID, ZONE, UNIT_CONFIG_ID FROM oceanbase.DBA_OB_UNITS WHERE TENANT_ID = 1006;查询结果如下:
+---------+-----------+--------+------------------+---------------+-------+----------------+ | UNIT_ID | TENANT_ID | STATUS | RESOURCE_POOL_ID | UNIT_GROUP_ID | ZONE | UNIT_CONFIG_ID | +---------+-----------+--------+------------------+---------------+-------+----------------+ | 1017 | 1006 | ACTIVE | 1003 | 1007 | zone1 | 1003 | | 1019 | 1006 | ACTIVE | 1003 | 1007 | zone2 | 1003 | | 1021 | 1006 | ACTIVE | 1003 | 1007 | zone3 | 1003 | | 1028 | 1006 | ACTIVE | 1003 | 1010 | zone1 | 1003 | | 1029 | 1006 | ACTIVE | 1003 | 1010 | zone2 | 1003 | | 1030 | 1006 | ACTIVE | 1003 | 1010 | zone3 | 1003 | +---------+-----------+--------+------------------+---------------+-------+----------------+ 6 rows in set
通过上述示例,将租户 mysql001 的 Unit Number 从 1 变更为 2。变更前租户在每个 Zone 的 Unit 个数为 1;变更后租户在每个 Zone 的 Unit 个数为 2,从而实现了租户扩容。
调小 Unit Number
下面以调小租户 mysql001 的 Unit Number 为例来介绍操作方法。
使用
root用户登录到集群的sys租户。obclient -h172.xxx.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -A进入
oceanbase数据库。obclient(root@sys)[(none)]> use oceanbase;查看租户
mysql001信息,获取其TENANT_ID。obclient(root@sys)[oceanbase]> SELECT TENANT_ID, TENANT_NAME, TENANT_TYPE, PRIMARY_ZONE, LOCALITY, TENANT_ROLE, UNIT_NUM FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mysql001';查询结果如下:
+-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE | LOCALITY | TENANT_ROLE | UNIT_NUM | +-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+ | 1006 | mysql001 | USER | zone1;zone2,zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | PRIMARY | 2 | +-----------+-------------+-------------+--------------------+---------------------------------------------+-------------+----------+ 1 row in set查询结果中,租户的
TENANT_ID为 1006,且UNIT_NUM的值为2,表示该租户的 Unit Number 数为 2。查看租户
mysql001所拥有的 Unit。obclient(root@sys)[oceanbase]> SELECT UNIT_ID, TENANT_ID, STATUS, RESOURCE_POOL_ID, UNIT_GROUP_ID, ZONE, UNIT_CONFIG_ID FROM oceanbase.DBA_OB_UNITS WHERE TENANT_ID = 1006;查询结果如下:
+---------+-----------+--------+------------------+---------------+-------+----------------+ | UNIT_ID | TENANT_ID | STATUS | RESOURCE_POOL_ID | UNIT_GROUP_ID | ZONE | UNIT_CONFIG_ID | +---------+-----------+--------+------------------+---------------+-------+----------------+ | 1016 | 1006 | ACTIVE | 1003 | 1006 | zone1 | 1002 | | 1017 | 1006 | ACTIVE | 1003 | 1007 | zone1 | 1002 | | 1018 | 1006 | ACTIVE | 1003 | 1006 | zone2 | 1002 | | 1019 | 1006 | ACTIVE | 1003 | 1007 | zone2 | 1002 | | 1020 | 1006 | ACTIVE | 1003 | 1006 | zone3 | 1002 | | 1021 | 1006 | ACTIVE | 1003 | 1007 | zone3 | 1002 | +---------+-----------+--------+------------------+---------------+-------+----------------+ 6 rows in set根据查询结果可知,租户
mysql001的每个 Zone 均有 2 个 Unit。其中,UNIT_ID为1016、1018、1020的 Unit 属于同一个 Unit Group,且其UNIT_GROUP_ID为1006;UNIT_ID为1017、1019、1021的 Unit 属于另一个 Unit Group,且其UNIT_GROUP_ID为1007。把租户
mysql001的UNIT_NUM修改为 1。通过随机删除
UNIT_GROUP的方式来调小UNIT_NUM的数量。obclient(root@sys)[oceanbase]> ALTER RESOURCE TENANT mysql001 UNIT_NUM = 1;该语句执行后,对于每个 Zone 上 2 个 Unit 的场景,系统会随机指定一个 Unit Group,并将该 Unit Group 上的数据重新分布到其他 Unit Group 上后,再删除该 Unit Group。
通过删除指定
UNIT_GROUP的方式来调小UNIT_NUM的数量obclient(root@sys)[oceanbase]> ALTER RESOURCE TENANT mysql001 UNIT_NUM = 1 DELETE UNIT_GROUP =(1006);该语句执行后,对于每个 Zone 上 2 个 Unit 的场景,系统会将指定 Unit Group 上的数据重新分布到其他 Unit Group 上后,再删除该 Unit Group。
查看调小 Unit Number 任务的执行状态。
obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE='ALTER_RESOURCE_TENANT_UNIT_NUM' AND TENANT_ID=1006;查询结果如下:
+--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+---------------------------------------------+--------------------+----------------+-------------+ | JOB_ID | JOB_TYPE | JOB_STATUS | RESULT_CODE | PROGRESS | START_TIME | MODIFY_TIME | TENANT_ID | SQL_TEXT | EXTRA_INFO | RS_SVR_IP | RS_SVR_PORT | +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+---------------------------------------------+--------------------+----------------+-------------+ | 6 | ALTER_RESOURCE_TENANT_UNIT_NUM | SUCCESS | 0 | 100 | 2023-09-25 18:01:30.069506 | 2023-09-25 18:01:45.068740 | 1006 | ALTER RESOURCE TENANT mysql001 UNIT_NUM = 2 | FROM: '1', TO: '2' | xxx.xx.xxx.196 | 2882 | | 7 | ALTER_RESOURCE_TENANT_UNIT_NUM | SUCCESS | 0 | 100 | 2023-09-26 09:37:32.367076 | 2023-09-26 09:39:05.651200 | 1006 | ALTER RESOURCE TENANT mysql001 UNIT_NUM = 1 | FROM: '2', TO: '1' | xxx.xx.xxx.196 | 2882 | +--------+--------------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+---------------------------------------------+--------------------+----------------+-------------+ 2 rows in set查询结果中,根据以下字段,找到对应的任务记录:
START_TIME:任务的发起时间。SQL_TEXT:任务对应的 SQL 语句。EXTRA_INFO:变更前后的 Unit Number 数。
当对应任务记录中
JOB_STATUS的值为SUCCESS时,表示调小 Unit Number 的任务执行成功。有关视图
DBA_OB_TENANT_JOBS的详细字段说明,请参见 DBA_OB_TENANT_JOBS。查看租户
mysql001修改后的 Unit。obclient(root@sys)[oceanbase]> SELECT UNIT_ID, TENANT_ID, STATUS, RESOURCE_POOL_ID, UNIT_GROUP_ID, ZONE, UNIT_CONFIG_ID FROM oceanbase.DBA_OB_UNITS WHERE TENANT_ID = 1006;查询结果如下:
+---------+-----------+--------+------------------+---------------+-------+----------------+ | UNIT_ID | TENANT_ID | STATUS | RESOURCE_POOL_ID | UNIT_GROUP_ID | ZONE | UNIT_CONFIG_ID | +---------+-----------+--------+------------------+---------------+-------+----------------+ | 1017 | 1006 | ACTIVE | 1003 | 1007 | zone1 | 1002 | | 1019 | 1006 | ACTIVE | 1003 | 1007 | zone2 | 1002 | | 1021 | 1006 | ACTIVE | 1003 | 1007 | zone3 | 1002 | +---------+-----------+--------+------------------+---------------+------+-----------------+ 3 rows in set
通过上述示例,将租户 mysql001 的 Unit Number 从 2 变更为 1。变更前租户在每个 Zone 的 Unit 个数为 2;变更后租户在每个 Zone 的 Unit 个数为 1,从而实现了租户缩容。