首批通过分布式安全可靠测评,为关键业务系统打造
OBServer 相关的操作不能在内部表生效并且 RS 异步队列满
更新时间:2026-06-04 01:56
问题现象
- 所有的 OBServer 操作不能在内部表生效,例如
delete server不能删除内部表,新加的机器无法在__all_server表里看到,或者不能设置start_service_time大于 0。 - RS 的异步队列积压,可以看到提交异步队列的任务都报错 4019。
- 存在下线很长的机器报错 4121。
问题原因
OBServer 会每隔 2s 会发送一次心跳给 RS,RS 如果 10s 都没有收到该 OBServer 的心跳,就会认为该 OBServer 下线了。OBServer 给 RS 发送心跳需要知道 RS 的位置,为了防止 OBServer 不知道 RS 的位置从而导致发送心跳失败,RS 会在检查到有 OBServer 下线的时候,提交一个异步任务,任务中会推送 rs_list 给到该 OBServer。
如果该 OBServer 和 RS 之间存在网络隔离,那这个 RPC 必然是会失败的,并且 dead_socket_detection_timeout 设置多少,这个 RPC 就会持续多久。
已知 RS 每隔 3s 就会检查有没有 OBServer 下线,如果存在下线的 OBServer 就会提交一个异步任务,并且不会判定异步任务是否存在。如果每个异步任务都因为 dead_socket_detection_timeout 设置的比较大而耗时很久的话,长时间积累下来,异步队列就会打满,从而导致异步队列积压。
所有 OBServer 相关的操作和变更,例如 add server,stop server 等都是先修改内存,然后提交一个异步任务,在异步任务中更新内部表。如果异步队列积压的情况,OBServer 所有的操作都不会在内部表中被看到。
问题的风险及影响
- 所有的 OBServer 操作可以在内存中记录,但是内部表中看不到,例如 OBServer 启动后,可能 OBServer 已经
start_service了,但是start_service_time汇报不到内部表中,那这个 OBServer 就会被 OCP 或者 proxy 认为没启动成功。 - 异步队列积压,RS 这边很多任务都是借助异步队列执行的,不确定有什么未知的风险。
影响版本
OceanBase 数据库企业版 V2.2.77 BP17 Hotfix1(oceanbase-2.2.77-117010012023061611)、V3.1.2 BP12、V3.2.3 BP11、V3.2.4 BP4(oceanbase-3.2.4.4-104000052023062021) 之前的所有版本。 OceanBase 数据库社区版 V3.1.5_CE(oceanbase-ce-3.1.5-100000252023041721) 之前的所有版本。
解决方法及规避方式
解决方法
升级到问题已修复版本:
- 目前已修复的版本包含 OceanBase 数据库企业版 V2.2.77 BP17 Hotfix1(oceanbase-2.2.77-117010012023061611)、V3.2.4 BP4(oceanbase-3.2.4.4-104000052023062021) 及之后版本。
- 目前已修复的版本包含 OceanBase 数据库社区版 V3.1.5_CE(oceanbase-ce-3.1.5-100000252023041721)及之后版本。
按照以下方法处理
- 调小
dead_socket_detection_timeout的值。 - 然后切换 RS 或者重启 RS。(如果不可以操作 RS,只能采用非常规手段,使用 debug_sync 让 offlineTask 暂时不生成。请联系 OceanBase 技术支持处理。)
- 调小
规避方式
- 如果存在宕机的 OBServer,需尽快让 server 下线。
dead_socket_detection_timeout配置项要尽可能的设置小一点,让 RPC 可以尽快失败掉。