首批通过分布式安全可靠测评,为关键业务系统打造
调整副本分布
更新时间:2025-12-30 11:03:58
本文介绍如何通过修改集群中某个租户的 Locality 来调整租户下 Partition 的副本分布。
有关修改 Locality 的详细操作和注意事项,参见 修改 Locality。
前提条件
变更 Locality 之前,需要确认待变更的 Zone 上资源单元和资源池的状态。如果 Zone 上的节点资源不足导致无法存放租户需要的资源单元,将导致无法进行 Locality 变更。
有关 Zone 上资源单元和资源池的状态的检查方法,参见 查看集群的资源信息。
注意事项
租户的 Locality 不可以为空。
当租户的 Locality 发生变更时,在该租户下,所有表的副本分布情况也会随之变化。
在旧一轮租户 Locality 没有完成变更时,新一轮的租户 Locality 变更不允许被执行。
Locality 变更一次只能执行一个动作,例如把 Zone3 替换为 Zone4,不能直接替换,可以先增加一个 Zone4,然后再减少一个 Zone3。
通过增加副本会导致租户 Locality 与 租户 Primary Zone 不匹配,如果增加的 Zone 参与切主,则需要修改 Primary Zone;如果增加的 Zone 不参与切主,则不需要修改 Primary Zone。
操作步骤
示例:通过修改租户 mysql001 的 Locality,由 FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 修改为 FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone4。
使用 root 用户登录到集群的 sys 租户。
obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -A进入
oceanbase数据库。obclient>use oceanbase;查看租户
mysql001修改前的 Locality。obclient> SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS; +-----------+-------------+-------------+-------------------+---------------------------------------------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE | LOCALITY | +-----------+-------------+-------------+-------------------+---------------------------------------------+ | 1 | sys | SYS | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1001 | META$1002 | META | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1002 | mysql001 | USER | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | +-----------+-------------+-------------+-------------------+---------------------------------------------+可以看到租户
mysql001分别在 zone1 、zone2 和 zone3 上有一个全能型副本。修改租户
mysql001的 Locality,增加一个 zone4 的副本。obclient>ALTER TENANT mysql001 locality="FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3, FULL{1}@zone4";查看 Locality 变更任务的执行状态。
obclient>SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE = 'ALTER_TENANT_LOCALITY'; +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------------+---------------------------------------------+----------------+-------------+ | 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 | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------------+---------------------------------------------+----------------+-------------+ | 1 | ALTER_TENANT_LOCALITY | SUCCESS | NULL | 0 | 2023-01-05 19:38:38.416011 | 2023-01-05 19:38:38.416011 | 1002 | ALTER TENANT mysql001 locality='FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3, FULL{1}@zone4' | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | xx.xx.xx.237 | 2882 | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------------+---------------------------------------------+----------------+-------------+当
JOB_STATUS为SUCCESS时,则说明 Locality 变更任务执行成功。修改租户
mysql001的 Locality,减少 zone3 的副本。obclient>ALTER TENANT mysql001 locality="FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone4";查看 Locality 变更任务的执行状态。
obclient>SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE = 'ALTER_TENANT_LOCALITY'; +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------------+---------------------------------------------+----------------+-------------+ | 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 | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------------+---------------------------------------------+----------------+-------------+ | 1 | ALTER_TENANT_LOCALITY | SUCCESS | NULL | 0 | 2023-01-05 19:38:38.416011 | 2023-01-05 19:38:38.416011 | 1002 | ALTER TENANT mysql001 locality='FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone4' | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3, FULL{1}@zone4 | xx.xx.xx.237 | 2882 | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------------+---------------------------------------------+----------------+-------------+当
JOB_STATUS为SUCCESS时,则说明 Locality 变更任务执行成功。查看租户
mysql001修改后的 Locality。obclient> SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS; +-----------+-------------+-------------+-------------------+---------------------------------------------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE | LOCALITY | +-----------+-------------+-------------+-------------------+---------------------------------------------+ | 1 | sys | SYS | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1001 | META$1002 | META | zone1;zone2 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone4 | | 1002 | mysql001 | USER | zone1;zone2 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone4 | +-----------+-------------+-------------+-------------------+---------------------------------------------+
通过步骤 3 与步骤 8 的查询比较, 租户 mysql001 的 Locality 由原来的 FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 变为 FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone4 ,租户 mysql001 在 zone1、zone2、zone4 上分别有一个全能型副本。
在步骤 4 执行过后,增加副本会导致租户 Locality 与租户 Primary Zone 不匹配,如果增加的 Zone 参与切主,则需要修改 Primary Zone,关于修改 Primary Zone 的操作,参见 调整 Primary Zone;如果增加的 Zone 不参与切主,则不需要修改 Primary Zone。