首批通过分布式安全可靠测评,为关键业务系统打造
修改 Locality
更新时间:2023-11-10 12:00:48
本文介绍如何修改租户的 Locality 属性。
Locality 应用场景
Locality 的设置通常用于租户的副本数增加、减少或调整副本分布:
租户副本数增加
对集群中的某个租户,增加租户的副本数,一次只能增加一个。例如,租户从 1 副本变为 3 副本,需要将 Locality 由
F@z1变更为F@z1,F@z2,再将 Locality 由F@z1,F@z2变更为F@z1,F@z2,F@z3,具体操作请参见 增加副本。注意
租户从 3 副本变为 5 副本时,可以直接操作,不需要先变更为 4 副本,再变更为 5 副本。
租户副本数减少
对集群内的某个租户,减少租户的副本数,一次只能减少一个。例如,租户从 3 副本变为 2 副本,租户从 5 副本变为 3 副本。具体操作请参见 减少副本。
注意
- 不支持租户从 2 副本变成 1 副本。
- 租户从 5 副本变为 3 副本时,可以直接操作,不需要先变更为 4 副本,再变更为 3 副本。
租户副本分布调整
对集群内的某个租户通过若干次 Locality 变更,调整租户的机房分布。例如,租户原来的 Locality 为
F@z1,F@z2,F@z3,由于 z3 机房到期,需要调整为 z4,Locality 需要变更为F@z1,F@z2,F@z4,需要做两次 Locality 变更,从F@z1,F@z2,F@z3变更为F@z1,F@z2,F@z3,F@z4,再由F@z1,F@z2,F@z3,F@z4变更为F@z1,F@z2,F@z4。具体操作请参见 调整副本分布。
前提条件
变更 Locality 之前,需要确认待变更的 Zone 上资源单元和资源池的状态。如果 Zone 上的节点资源不足导致无法存放租户需要的资源单元,将导致无法进行 Locality 变更。
有关 Zone 上资源单元和资源池的状态的检查方法,参见 查看集群的资源信息。
注意事项
租户的 Locality 不可以为空。
当租户的 Locality 发生变更时,在该租户下,所有表的副本分布情况也会随之变化。
在旧一轮租户 Locality 没有完成变更时,新一轮的租户 Locality 变更不允许被执行。
Locality 变更一次只能执行一个动作,例如把 Zone3 替换为 Zone4,不能直接替换,可以先增加一个 Zone4,然后再减少一个 Zone3。
修改 Locality 时需要关注对 Primary Zone 的影响,建议提前调整 Primary Zone。
例如:
需要减少 zone3,如果 zone3 属于第一优先级的 Primary Zone,则调整 Locality 过程会影响租户读写服务。
增加 zone4 时,如果 Primary Zone 为 RANDOM,那么后续 zone4 也会提供读写服务。
Locality 变更涉及到 Paxos 成员的变更和数据的拷贝,需要评估对稳定性和性能的影响。对于 Paxos 成员变更的影响,需要评估清楚变更对节点故障的容忍度的影响。对于副本分布的变化,需要评估是否会打破部署架构对机房故障和城市故障的 SLA 设计。对于数据拷贝,变更过程中需要观察数据拷贝对同节点上其他租户的影响,尽量放在业务低峰期进行,并提前做好应急预案。
Locality 变更过程不应该降低对节点故障的预期容忍度,例如:三副本部署的集群,机房替换场景,需要先增加副本,再减少副本,以保证变更过程中不降低对节点故障的预期容忍度。因此变更过程中发生单副本异常,理论上不会影响服务连续性,如果有影响,恢复数据库可用是第一要务,应该首先尝试恢复硬件异常。
操作步骤
示例:将租户 mq_t1 的 Locality 由 FULL{1}@sa128_obv4_1,FULL{1}@sa128_obv4_2 修改为 F{1}@sa128_obv4_1,F{1}@sa128_obv4_2,F{1}@sa128_obv4_3。
使用 root 用户登录到集群的 sys 租户。
obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -A进入
oceanbase数据库。obclient>use oceanbase;查看修改前的 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 | sa128_obv4_2;sa128_obv4_1,sa128_obv4_3 | FULL{1}@sa128_obv4_1, FULL{1}@sa128_obv4_2, FULL{1}@sa128_obv4_3 | | 1001 | META$1002 | META | sa128_obv4_2;sa128_obv4_1,sa128_obv4_3 | FULL{1}@sa128_obv4_1, FULL{1}@sa128_obv4_2, FULL{1}@sa128_obv4_3 | | 1002 | midas0_3790 | USER | sa128_obv4_2;sa128_obv4_1,sa128_obv4_3 | FULL{1}@sa128_obv4_1, FULL{1}@sa128_obv4_2, FULL{1}@sa128_obv4_3 | | 1003 | META$1004 | META | sa128_obv4_1,sa128_obv4_2 | FULL{1}@sa128_obv4_1, FULL{1}@sa128_obv4_2 | | 1004 | mq_t1 | USER | sa128_obv4_1,sa128_obv4_2 | FULL{1}@sa128_obv4_1, FULL{1}@sa128_obv4_2 | +-----------+-------------+-------------+----------------------------------------+------------------------------------------------------------------+修改租户
mq_t1的 Locality。obclient>ALTER TENANT mq_t1 locality="F{1}@sa128_obv4_1,F{1}@sa128_obv4_2,F{1}@sa128_obv4_3";查看 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 | 0 | 100 | 2023-01-05 19:33:46.730319 | 2023-01-05 19:33:46.920111 | 1002 | ALTER TENANT mq_t1 locality="F{1}@sa128_obv4_1,F{1}@sa128_obv4_2,F{1}@sa128_obv4_3" | FULL{1}@sa128_obv4_1, FULL{1}@sa128_obv4_2 | xx.xx.xx.xx | 2882 | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------------+---------------------------------------------+----------------+-------------+当
JOB_STATUS为SUCCESS时,则说明 Locality 变更任务执行成功。查看修改后的 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 | PREVIOUS_LOCALITY | +-----------+-------------+-------------+----------------------------------------+------------------------------------------------------------------+--------------------+ | 1 | sys | SYS | sa128_obv4_2;sa128_obv4_1,sa128_obv4_3 | FULL{1}@sa128_obv4_1, FULL{1}@sa128_obv4_2, FULL{1}@sa128_obv4_3 | null | | 1001 | META$1002 | META | sa128_obv4_2;sa128_obv4_1,sa128_obv4_3 | FULL{1}@sa128_obv4_1, FULL{1}@sa128_obv4_2, FULL{1}@sa128_obv4_3 | null | | 1002 | midas0_3790 | USER | sa128_obv4_2;sa128_obv4_1,sa128_obv4_3 | FULL{1}@sa128_obv4_1, FULL{1}@sa128_obv4_2, FULL{1}@sa128_obv4_3 | null | | 1003 | META$1004 | META | sa128_obv4_1,sa128_obv4_2 | FULL{1}@sa128_obv4_1, FULL{1}@sa128_obv4_2, FULL{1}@sa128_obv4_3 | null | | 1004 | mq_t1 | USER | sa128_obv4_1,sa128_obv4_2 | FULL{1}@sa128_obv4_1, FULL{1}@sa128_obv4_2, FULL{1}@sa128_obv4_3 | null | +-----------+-------------+-------------+----------------------------------------+------------------------------------------------------------------+--------------------+通过查询可知,
mq_t1的 Locality 已变更为F{1}@sa128_obv4_1,F{1}@sa128_obv4_2,F{1}@sa128_obv4_3,此时PREVIOUS_LOCALITY为空,说明变更成功,如果PREVIOUS_LOCALITY不为空,说明正在变更中。