基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
RPC 检测 hung 导致 RS 队列满
更新时间:2026-06-04 09:56
问题现象
所有的 server 操作不能在内部表生效,例如 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 每隔 2s 就会检查有没有 server 下线,如果存在下线 server 就会提交一个异步任务,并且不会判定异步任务是否存在。如果每个异步任务都因为 dead_socket_detection_timeout 设置的比较大,而耗时很久的话,长时间积累下来,异步队列就会打满,从而导致异步队列积压。
所有 OBServer 相关的操作和变更,例如 add server,stop server 等都是先修改内存,然后提交一个异步任务,在异步任务中更新内部表。
如果异步队列积压的情况,server 所有的操作都不会在内部表中被看到。
问题的风险及影响
所有的 server 操作可以在内存中记录,但是内部表中看不到,例如 OBServer 启动后,可能 OBServer 已经
start_service了,但是start_service_time汇报不到内部表中,那这个 OBServer 就会被 OCP 或者 proxy 认为没启动成功。异步队列积压,RS 这边很多任务都是借助异步队列执行的,不确定有什么未知的风险。
影响租户
影响 OceanBase 数据库中的 SYS 租户,对于 Oracle 租户和 MySQL 租户无影响。
影响版本
OceanBase 数据库企业版 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本。
解决方法
解决方法一:
- 升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V2.2.77 BP17 Hotfix1(oceanbase-2.2.77-117010012023061611)、V2.2.77 BP17 Hotfix2(oceanbase-2.2.77-117020032023072119)、V2.2.77 BP17 Hotfix3(oceanbase-2.2.77-117030032023091117)、V2.2.77 BP17 Hotfix4(oceanbase-2.2.77-117040012023091916)、V2.2.77 BP17 Hotfix5(oceanbase-2.2.77-117050012023111617)、V2.2.77 BP17 Hotfix6(oceanbase-2.2.77-117060012024040216)、V2.2.77 BP17 Hotfix7(oceanbase-2.2.77-117070022024071510)、V2.2.77 BP19(oceanbase-2.2.77-119000122024060513)及之后版本、V3.2.3 BP11(oceanbase-3.2.3.3-111000032024070822)及之后版本、V3.2.4 BP4(oceanbase-3.2.4.4-104000052023062021)及之后版本。
解决方法二:
调小
dead_socket_detection_timeout是必须要做的。然后切换 RS,或者重启 RS。(如果不可以操作 RS,只能采用非常规手段使用
debug_sync,让offlineTask暂时不生成,请联系 OceanBase 技术支持处理。)
规避方式
如果存在宕机的 OBServer,就尽快把 server 踢掉。
dead_socket_detection_timeout这个配置项要尽可能的设置小一点,让 RPC 可以尽快失败掉。