首批通过分布式安全可靠测评,为关键业务系统打造
手动切主 Zone 到其他机房场景应急演练流程
更新时间:2026-06-12 04:01
本文讲述手动切主 Zone 到其他机房场景应急演练的具体流程。
适用版本
OceanBase 数据库 V2.x、V3.x 版本。
操作步骤
演练操作步骤如下。
演练开始前检查集群各 OBServer 状态,执行以下 SQL 查看。
obclient> SELECT zone, svr_ip, svr_port, inner_port, with_rootserver, status, gmt_create, CASE WHEN start_service_time = 0 THEN start_service_time ELSE usec_to_time(start_service_time) END start_service_time, CASE WHEN stop_time = 0 THEN stop_time ELSE usec_to_time(stop_time) END stop_time, substr(build_version, 1, instr(build_version, '-') -1) build_version FROM oceanbase.__all_server ORDER BY zone, svr_ip;当
status列显示active,同时start_service_time列有时间戳,且stop_time列为 0,则节点是正常状态。预期所有 OBServer 节点正常。
查询租户的 Primary Zone 情况,可执行以下 SQL 查看。
obclient> select tenant_id, tenant_name, primary_zone from oceanbase.__all_tenant;说明
建议保留该数据,以便回切时候确保状态与回退前一致。
检查业务租户表 leader 分布,可执行以下 SQL 查看。
obclient> SELECT now(), tent.tenant_id, tent.tenant_name, zone, svr_ip, role, count(*) cnt FROM oceanbase.__all_virtual_meta_table meta JOIN oceanbase.__all_tenant tent ON meta.tenant_id = tent.tenant_id WHERE 1 = 1 AND tent.tenant_id = < 业务租户id > AND role = 1 GROUP BY tent.tenant_id, zone, svr_ip, role ORDER BY tent.tenant_id, role,zone;预期 z1~z4 的 OBServer 节点上都有 leader,且分布均匀。
Clog 同步延迟检查。
obclient> SELECT /*+ READ_CONSISTENCY(WEAK), query_timeout(100000000) */ svr_ip, count(*) count FROM oceanbase.__all_virtual_clog_stat WHERE is_in_sync = 0 AND is_offline = 0 GROUP BY svr_ip HAVING count > 0;预期无结果。
保留日志。
保留 OBServer 节点服务相关日志。目录:
/home/admin/oceanbase/log。如果发生 core,保留 core 文件。目录:
/data/1/(core 文件存储放在数据文件目录下)。切主之前需要进行以下检查。
是否指定了表级别的 primary_zone。
obclient> SELECT primary_zone, tenant_id, table_id FROM oceanbase.__all_virtual_table WHERE primary_zone <> '';是否指定了数据库级级别的 primary_zone。
obclient> SELECT tenant_id, database_id, database_name, primary_zone FROM oceanbase.__all_virtual_database WHERE primary_zone is NOT null;是否指定了表组的 primary_zone。
obclient> SELECT tenant_id, tablegroup_name, primary_zone FROM oceanbase.__all_virtual_tablegroup WHERE primary_zone is NOT null;
以上三种情况默认为空。如果指定了以上三种优先级别的 Primary Zone,在切主之前需要将其设置为 default。
obclient> ALTER database 数据库名 set primary_zone=default; obclient> ALTER tablegroup 表组名 primary_zone=default; obclient> ALTER table 表名 set PRIMARY_ZONE=default;确认没有表、数据库、表组级别的 Primary Zone 设置后,修改 primary_zone list 实现手动切主。
通过 OCP 直接在租户页面进行 Zone 优先级的修改。
通过黑屏命令进行修改。
obclient> ALTER TENANT tenant_name PRIMARY_ZONE 'zone3,zone4;zone1,zone2;zone5';
查询租户的 Primary Zone 情况。
obclient> select tenant_id, tenant_name, primary_zone from oceanbase.__all_tenant;预期 Primary Zone 字段值为:
zone3,zone4;zone1,zone2;zone5。查询主副本分布情况,检查业务租户表 leader 分布。
obclient> SELECT now(), tent.tenant_id, tent.tenant_name, zone, svr_ip, role, count(*) cnt FROM oceanbase.__all_virtual_meta_table meta JOIN oceanbase.__all_tenant tent ON meta.tenant_id = tent.tenant_id WHERE 1 = 1 AND tent.tenant_id = < 业务租户id > AND role = 1 GROUP BY tent.tenant_id, zone, svr_ip, role ORDER BY tent.tenant_id, role, zone;预期低碳机房的 z1、z2 的 leader 会切换到 idc 机房的 z3 或 z4。
注意
手动切主会导致应用交易部分失败。
从低碳 leader 切到 idc 的动作可以通过历史 event 事件查询。
obclient> select * from oceanbase.__all_rootservice_event_history where event like '%switch%';Clog 同步延迟检查。
obclient> SELECT /*+ READ_CONSISTENCY(WEAK), query_timeout(100000000) */ svr_ip, count(*) count FROM oceanbase.__all_virtual_clog_stat WHERE is_in_sync = 0 AND is_offline = 0 GROUP BY svr_ip HAVING count > 0;预期无结果。
切主完成后,验证业务租户访问情况。
回切,与上述步骤一样,把租户的 Primary Zone 修改回之前的状态。
回切后做如下检查,检查 OBServer 节点状态。
obclient> SELECT zone, svr_ip, svr_port, inner_port, with_rootserver, status, gmt_create, CASE WHEN start_service_time = 0 THEN start_service_time ELSE usec_to_time(start_service_time) END start_service_time, CASE WHEN stop_time = 0 THEN stop_time ELSE usec_to_time(stop_time) END stop_time, substr(build_version, 1, instr(build_version, '-') -1) build_version FROM oceanbase.__all_server ORDER BY zone, svr_ip;status 列显示 active,同时 start_service_time 列有时间戳,且 stop_time 列为 0,则节点是正常状态。
预期所有 OBServer 节点正常。
Clog 同步延迟检查。
obclient> SELECT /*+ READ_CONSISTENCY(WEAK), query_timeout(100000000) */ svr_ip, count(*) count FROM oceanbase.__all_virtual_clog_stat WHERE is_in_sync = 0 AND is_offline = 0 GROUP BY svr_ip HAVING count > 0;预期无结果。
检查租户的 Primary Zone 情况。
obclient> select tenant_id, tenant_name, primary_zone from oceanbase.__all_tenant;预期与演练前查询结果一致。
检查业务租户表 leader 分布。
obclient> SELECT now(), tent.tenant_id, tent.tenant_name, zone, svr_ip, role, count(*) cnt FROM oceanbase.__all_virtual_meta_table meta JOIN oceanbase.__all_tenant tent ON meta.tenant_id = tent.tenant_id WHERE 1 = 1 AND tent.tenant_id = < 业务租户id > AND role = 1 GROUP BY tent.tenant_id, zone, svr_ip, role ORDER BY tent.tenant_id, role, zone;预期 z1~z4 的 OBServer 节点上都有 leader,且分布均匀。
演练结束。