首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase 数据库 V4.x 版本日志流副本运维命令使用的相关问题
更新时间:2024-07-03 09:51
通过 SQL 运维命令发起的容灾任务是异步执行的,任务执行过程大致分为两个步骤,第一步是一些前置的检查:语法检查、各个参数的格式检查、命令是否合法合理(例如补副本命令对应 server 上是否有资源,是否已经有副本),如果通过了该步骤的各种检查,则构造任务发送给底层进行执行,底层异步的执行任务,此时运维命令就已经返回结果了,因此运维命令返回成功与否不代表最终的执行结果,只代表该任务是否已经成功的下发给底层。第二个主要步骤即为底层异步执行具体的任务的过程。
任务是否成功触发
运维命令的返回结果即可反应任务是否成功触发(是否下发到了底层去执行),如果运维命令返回成功,则该任务已经成功下发到了底层,如果运维命令执行失败,可以参考查询相关错误原因。 另外,可以查看视图 DBA_OB_ROOTSERVICE_EVENT_HISTORY,该视图记录了所有手动执行的副本运维命令的执行结果(是否成功触发任务,而不是任务本身是否成功)。
obclient> select * from oceanbase.DBA_OB_ROOTSERVICE_EVENT_HISTORY where MODULE = "admin_alter_ls_replica"\G
返回结果如下:
*************************** 1. row ***************************
TIMESTAMP: 2024-02-27 10:39:59.684333
MODULE: admin_alter_ls_replica
EVENT: ADD_LS_REPLICA
NAME1: ret_code
VALUE1: 0
NAME2: tenant_id
VALUE2: 1002
NAME3: ls_id
VALUE3: 1002
NAME4: target_replica
VALUE4: "xxx.xxx.xxx.xxx:5078"
NAME5: replica_type
VALUE5: REPLICA_TYPE_FULL
NAME6:
VALUE6: 0
EXTRA_INFO: data_source: 0.0.0.0:0, paxos_replica_num: 5
RS_SVR_IP: xxx.xxx.xxx.xxx
RS_SVR_PORT: 5070
任务是否正在执行或者已经完成
通过容灾相关视图
查看视图 DBA_OB_LS_REPLICA_TASKS,该视图记录了正在执行中的容灾任务,任务执行开始会在该表中插入一列,任务结束即将任务从该表中删除。如果该视图为空,任务可能已经执行完了或者没有开始执行。 可以根据日志流 ID 和租户的 ID 和运维命令相关信息从该表中找到对应的任务。如果该表中没有对应任务,说明任务可能已经执行完成,此时可以查看 DBA_OB_LS_REPLICA_TASK_HISTORY 视图。
DBA_OB_LS_REPLICA_TASK_HISTORY 记录了容灾任务执行的历史,在任务执行完之后将会在该表中插入一列信息。如果任务也不存在于该表中,说明该任务还没有执行完(正在执行)或者没有开始执行。
obclient> select * from oceanbase.DBA_OB_LS_REPLICA_TASK_HISTORY\G
返回结果如下:
*************************** 1. row ***************************
LS_ID: 1
TASK_TYPE: REMOVE PAXOS REPLICA
TASK_ID: Y13CE64586BD4-00061253D8BCD678-0-0
TASK_STATUS: COMPLETED
PRIORITY: HIGH
TARGET_REPLICA_SVR_IP: xxx.xxx.xxx.xxx
TARGET_REPLICA_SVR_PORT: 5072
TARGET_PAXOS_REPLICA_NUMBER: 5
TARGET_REPLICA_TYPE: FULL
SOURCE_REPLICA_SVR_IP: NULL
SOURCE_REPLICA_SVR_PORT: 0
SOURCE_PAXOS_REPLICA_NUMBER: 5
SOURCE_REPLICA_TYPE: NULL
DATA_SOURCE_SVR_IP: NULL
DATA_SOURCE_SVR_PORT: NULL
IS_MANUAL: FALSE
TASK_EXEC_SVR_IP: xxx.xxx.xxx.xxx
TASK_EXEC_SVR_PORT: 5070
CREATE_TIME: 2024-02-27 10:42:05
START_TIME: 2024-02-27 10:42:05
MODIFY_TIME: 2024-02-27 10:42:05
FINISH_TIME: 2024-02-27 10:42:04
EXECUTE_RESULT: ret:0, OB_SUCCESS; elapsed:82964;
COMMENT: remove permanent offline replica
通过 DBA_OB_ROOTSERVICE_EVENT_HISTORY 视图
可以通过 DBA_OB_ROOTSERVICE_EVENT_HISTORY 视图查看任务执行的阶段,在容灾任务下发到底层之前(同时是在持久化到视图 DBA_OB_LS_REPLICA_TASKS 之前),会在 DBA_OB_ROOTSERVICE_EVENT_HISTORY 视图中插入一列,该列的 EVENT 以 start 开头,表示任务即将开始。在任务执行完成之后,会在该视图中再插入一列,该列的EVENT列以finish开头,表示任务已经执行完成。
obclient> select * from oceanbase.DBA_OB_ROOTSERVICE_EVENT_HISTORY where module like "%disaster%" limit 2 \G
*************************** 1. row ***************************
TIMESTAMP: 2024-02-27 10:39:59.613698
MODULE: disaster_recovery
EVENT: start_add_ls_replica
NAME1: tenant_id
VALUE1: 1002
NAME2: ls_id
VALUE2: 1002
NAME3: task_id
VALUE3: Y13CE64586BD4-00061253E51CD4B9-0-0
NAME4: destination
VALUE4: "xxx.xxx.xxx.xxx:5078"
NAME5: data_source
VALUE5: "0.0.0.0:0"
NAME6: comment
VALUE6: add replica by manual
EXTRA_INFO:
RS_SVR_IP: xxx.xxx.xxx.xxx
RS_SVR_PORT: 5070
*************************** 2. row ***************************
TIMESTAMP: 2024-02-27 10:40:03.150092
MODULE: disaster_recovery
EVENT: finish_add_ls_replica
NAME1: tenant_id
VALUE1: 1002
NAME2: ls_id
VALUE2: 1002
NAME3: task_id
VALUE3: Y13CE64586BD4-00061253E51CD4B9-0-0
NAME4: destination
VALUE4: "xxx.xxx.xxx.xxx:5078"
NAME5: data_source
VALUE5: "0.0.0.0:0"
NAME6: execute_result
VALUE6: ret:0, OB_SUCCESS; elapsed:3536442;
EXTRA_INFO: add replica by manual
RS_SVR_IP: xxx.xxx.xxx.xxx
RS_SVR_PORT: 5070
2 rows in set (0.00 sec)
如果查出该任务只有 EVENT 列是 start 开头的这一行,说明任务还在执行中,或者可能任务卡住了,可以通过继续排查。如果还有 EVENT 列是 finish 开头的记录,说明任务执行完了,可以看 VALUE6 来确认执行结果,如果是错误码的话,也可以通过迁移复制的排查思路继续排查。
通过日志排查
RS 日志
查看一个副本运维命令的语法解析是否成功。
grep -rni 'resolve add replica parse tree over' observer.log*查看一个副本运维命令的请求是否成功抵达到 RS 端。
grep -rni 'receive alter ls replica request' rootservice.log*查看一个副本运维命令执行结果(是否成功下发到底层)。
grep -rni 'ObDRWorker do add ls replica task' rootservice.log* grep -rni 'ObDRWorker do remove ls replica task' rootservice.log* grep -rni 'ObDRWorker do migrate ls replica task' rootservice.log* grep -rni 'ObDRWorker do modify ls replica task' rootservice.log* grep -rni 'ObDRWorker do modify ls paxos_replica_num task' rootservice.log* grep -rni 'ObDRWorker do cancel ls replica task over' rootservice.log*
OBSERVER 日志
通过视图 DBA_OB_ROOTSERVICE_EVENT_HISTORY、DBA_OB_LS_REPLICA_TASKS 或者 DBA_OB_LS_REPLICA_TASK_HISTORY 可以拿到容灾任务的 ID:task_id。在对应的 observer 上,使用了 task_id 作为日志的 trace_id,因此可以使用该 ID 当作 trace_id 去对应的 observer 上查询日志。
不同类型的容灾任务对应的 observer 节点不同,如下:
- add replica -> 目标 server(想要补副本的 observer)
- remove replica -> 日志流 leader 所在 observer
- migrate replica -> 目标 server(想要迁移到的目标observer)
- modify replica -> 目标 server (副本所在的observer)
- modify paxos_replica_num -> 日志流 leader 所在 observer