首批通过分布式安全可靠测评,为关键业务系统打造
仲裁相关问题排查
更新时间:2025-06-23 06:56
OceanBase 数据库从 V4.1.x 版本开始提供仲裁高可用方案,该方案通过仲裁副本保证集群在发生网络分区或其他故障情况下继续提供服务。本文介绍仲裁服务相关的一些常见问题及排查思路。
仲裁副本任务管理线程相关
仲裁副本任务管理线程是启动在 SYS 或 Meta 租户 1 号日志流 Leader 上的一个高可用服务,负责添加仲裁副本、删除仲裁副本、替换仲裁副本的工作,所以首先需要确认仲裁副本任务的管理线程是否正常工作。找到当时那个时刻对应租户 1 号日志流的 Leader 节点,在该节点上的 observer.log 中查找 [ARB_SERVICE] 关键字,命令如下:
fgrep "[ARB_SERVICE] arbitration service finish one round" rootservice.log* | grep "tenant_id=$tenant_id"
如果没有上述日志,说明仲裁服务没有正常对外提供服务,可以考虑以下几个方面:
执行如下命令,确认仲裁副本任务管理线程是否启动。
fgrep "[ARB_SERVICE] ObArbitrationService init" rootservice.log* | grep "tenant_id=$tenant_id" fgrep "[ARB_SERVICE] ObArbitrationService start" rootservice.log* | grep "tenant_id=$tenant_id" fgrep "[ARB_SERVICE] ObArbitrationService destroy" rootservice.log* | grep "tenant_id=$tenant_id"确认版本号推高到 4.1,如果没推高到 4.1,打开 trace 日志可以搜到如下日志。
fgrep "arb service can not run" rootservice.log*
租户仲裁状态相关
查看租户初始仲裁状态
创建租户的时候可以指定 enable_arbitration_service=true或 false,如果不指定则默认租户是不带仲裁服务的,因此可以通过 show create tenant 查看租户创建的初始仲裁状态。
obclient> show create tenant mysql;
+--------+------------------------------------------------------------------------
| Tenant | Create Tenant
+--------+------------------------------------------------------------------------
| mysql | CREATE TENANT mysql charset=utf8mb4, replica_num=2, zone_list('z1', 'z2'), primary_zone='z1;z2', locality='FULL{1}@z1, FULL{1}@z2', enable_arbitration_service=true, resource_pool_list('pool_1') |
+--------+------------------------------------------------------------------------
1 row in set (0.01 sec)
查看租户仲裁状态变化历史
其次,租户创建完成后,可以通过 alter tenant 语句 enable 或 disable 租户的仲裁状态,可以通过指定 module 名称 arb_service 查询 DBA_OB_ROOTSERVICE_EVENT_HISTORY 确定租户的仲裁状态变化,虽然这张表的信息可能会丢失,但一定程度上可以帮助定位某个时刻租户的仲裁状态。最准确的还是要结合具体的问题,分析相关日志来确定租户当时的仲裁状态,可联系技术支持排查。
obclient> select * from DBA_OB_ROOTSERVICE_EVENT_HISTORY where module like "%arb \G
*************************** 1. row ***************************
gmt_create: 2022-12-27 19:21:07.064309
module: arb_service
event: admin_add_arbitration_service
name1: ret
value1: 0
name2: arg
value2: {arbitration_service_:"100.xx.xxx.xxx:12397"}
name3:
value3:
name4:
value4:
name5:
value5:
name6:
value6:
extra_info:
rs_svr_ip: 100.xx.xxx.xxx
rs_svr_port: 60000
*************************** 2. row ***************************
gmt_create: 2022-12-27 19:22:19.950353
module: arb_service
event: promote_arbitration_service_status
name1: ret
value1: 0
name2: tenant_id
value2: 1002
name3: old_status
value3: ENABLING
name4: new_status
value4: ENABLED
name5:
value5:
name6:
value6:
extra_info:
rs_svr_ip: 100.xx.xxx.xxx
rs_svr_port: 60000
*************************** 3. row ***************************
gmt_create: 2022-12-27 19:23:10.111505
module: arb_service
event: enable_tenant_arbitration_service
name1: ret
value1: 0
name2: arg
value2: tenant_name:"sys", new_status:{status:0}
name3: current_status
value3: DISABLED
name4: new_status
value4: ENABLING
name5:
value5:
name6:
value6:
extra_info:
rs_svr_ip: 100.xx.xxx.xxx
rs_svr_port: 60000
*************************** 4. row ***************************
gmt_create: 2022-12-27 19:23:13.990808
module: arb_service
event: promote_arbitration_service_status
name1: ret
value1: 0
name2: tenant_id
value2: 1
name3: old_status
value3: ENABLING
name4: new_status
value4: ENABLED
name5:
value5:
name6:
value6:
extra_info:
rs_svr_ip: 100.xx.xxx.xxx
rs_svr_port: 60000
*************************** 5. row ***************************
gmt_create: 2022-12-27 19:23:25.877721
module: arb_service
event: disable_tenant_arbitration_service
name1: ret
value1: 0
name2: arg
value2: tenant_name:"sys", new_status:{status:2}
name3: current_status
value3: ENABLED
name4: new_status
value4: DISABLING
name5:
value5:
name6:
value6:
extra_info:
rs_svr_ip: 100.xx.xxx.xxx
rs_svr_port: 60000
对上述的查询结果做如下说明:
- 其中
event名称为admin_add_arbitration_service的记录表明,这是一个给集群添加仲裁服务地址的操作,相对应的,可能还会有admin_remove_arbitration_service和admin_replace_arbitration_service分别表示删除仲裁服务地址和替换仲裁服务地址的操作。 - 其中
event名称为enable_tenant_arbitration_service的记录表明,这是一个用户通过alter tenant enable arbitration service发起的开启租户仲裁服务的命令,同时记录了新旧仲裁服务状态。 - 其中
event名称为disable_tenant_arbitration_service的记录表明,这是一个用户通过alter tenant disable arbitration service发起的关闭租户仲裁服务的命令,同时记录了新旧仲裁服务状态。 - 其中
event名称为promote_arbitration_service_status的记录表明,这是一个系统自动推进租户仲裁状态的操作,这里只可能存在两种情况,即将disabling推成disabled,或者将enabling推成enabled。
仲裁副本任务调度
查看正在执行中的任务
如果发现租户的仲裁副本不符合预期,可以通过 CDB_OB_LS_ARB_REPLICA_TASKS 表查看是否有正在运行中的仲裁副本任务。
select * from CDB_OB_LS_ARB_REPLICA_TASKS where tenant_id = $tenant_id and ls_id = $ls_id;
查看任务执行历史
任务执行完成后就会从 CDB_OB_LS_ARB_REPLICA_TASKS 表中删除,并记录这次的任务到 history 表,所以可以检索 CDB_OB_LS_ARB_REPLICA_TASK_HISTORY 查看任务执行历史,关注其中的 execute_result,其中 ret 表示这次任务的执行结果,elapsed 表示这次任务的执行时长。如果发现某次任务执行失败了,可以拿 trace_id 去搜相关的日志,具体失败原因可以找技术支持排查。
obclient> select * from CDB_OB_LS_ARB_REPLICA_TASK_HISTORY \G
*************************** 1. row ***************************
gmt_create: 2022-12-27 19:23:13.783609
gmt_modified: 2022-12-27 19:23:13.783609
tenant_id: 1
ls_id: 1
task_id: 1672140193665391
execute_result: [ret:0; elapsed:113574;]
create_time: 2022-12-27 19:23:13.668097
finish_time: 2022-12-27 19:23:13.781671
trace_id: YEA6064586BD4-0005F0CD6B534A62-0-0
task_type: ADD REPLICA
arbitration_service: 100.88.xxx.xxx:12397
arbitration_service_type: ADDR
comment: add arbitration replica service replica
*************************** 2. row ***************************
gmt_create: 2022-12-27 19:23:34.112663
gmt_modified: 2022-12-27 19:23:34.112663
tenant_id: 1
ls_id: 1
task_id: 1672140214036627
execute_result: [ret:0; elapsed:73896;]
create_time: 2022-12-27 19:23:34.038993
finish_time: 2022-12-27 19:23:34.112889
trace_id: YEA6064586BD4-0005F0CD6B534A64-0-0
task_type: REMOVE REPLICA
arbitration_service: 100.xx.xxx.xxx:12397
arbitration_service_type: ADDR
comment: remove arbitration replica service replica
2 rows in set (0.00 sec)
查看仲裁副本任务未生成原因
可以在 rootservice 的日志中搜索 [ARB_TASK] 关键字,查看与仲裁副本任务相关的信息。
fgrep "[ARB_TASK]" rootservice.log*
下面对可能检索出来的日志做下说明:
如果有以下日志,说明开启了一轮任务检查,检查是否需要生成对应的任务。
[ARB_TASK] check whether need to generate task如果有如下两条日志,说明检测到了需要生成补副本或者删副本的任务。
[ARB_TASK] find a remove replica task to build [ARB_TASK] find a add replica task to build如果有以下日志,说明构建相关任务信息或者任务执行失败了。
[ARB_TASK] fail to construct and execute add replica task [ARB_TASK] fail to construct and execute remove replica task如果有以下日志,说明切主以后,从内部表中读取的那些旧 Leader 生成并持久化的任务,已经没有再执行的必要了,比如一个补副本任务,但是租户的仲裁状态已经处于
disabling了,这个补副本任务就不需要执行了。[ARB_TASK] no need to execute this task如果有以下日志,说明执行从内部表中读取的任务失败了。
[ARB_TASK] fail to execute task如果有以下日志,说明相关的任务执行成功了。
[ARB_TASK] success to execute a add replica task [ARB_TASK] success to execute a remove replica task