适用版本
OceanBase 数据库所有版本。
问题现象
OCP 告警 easy_connection_on_timeout_conn,对应 observer.log 内容如下。
[2023-04-14 07:17:29.145046] ERROR easy_connection_on_timeout_conn (easy_connection.c:2368) [28685][0][Y0-0000000000000000] [lt=14] [dc=0] Failed to do check_ack_timeout, and will destroy connection(10.xxx.x.xxx:48302_10.xxx.xx.xx:2882_3351_0x7efbd5572df0 tp=1 t=0-1681427838673865 s=0 r=167 io=10816890/321165867 sq=321055686). BACKTRACE:0xd70b878 0xd6f3309 0x3513371 0xd619d11 0xd61c1e5 0xd8290cb 0xda8ef48 0x3393152 0x33a6fbb 0x33d283d 0xda
问题原因
排查过程:
通过历史遇到的连接失败问题排查,发现大多都是网络问题,于是优先排查网络 通过
tsar --tcp来判断网络是否有重传。观察到其中有一个节点的重传率在这个时间段已经到了 0.10,0.12,并且其他最高的有 0.18 。这个重传已经是非常高了,判断此节点告警主要原因就是网络重传较高,需要业务侧网工介入排查。分析日志,正常情况下 先通过在 OBServer 日志上找到相对应的日志,并找到 proxyssesid,再去 proxy 日志过滤分析两个日志。
failed to do check_ack_timeout and will destroy connection问题触发逻辑:无论是 OceanBase 数据库与 OceanBase 数据库之间的 RPC 请求还是 OceanBase 数据库与客户端之间的查询请求,都会进行 ack_timeout 的探测。
- 针对 RPC 类的请求,OceanBase 数据库的 ack_timeout 时间为 10 秒,超过 10 秒,就会断开链接。
- 针对 SQL 类的请求,OceanBase 数据库的 ack_timeout 时间为 60 秒,但是在 V2.2.77 版本上,OceanBase 数据库已经取消了对 SQL 类 ack_timeout 超时的断链操作。
- ack_timeout 可以理解为:源端 OceanBase 数据库无法往对端发送数据,对应 TCP 链接的滑动窗口长时间处于不滑动的状态。
所以具体原因是:
通过理解问题触发逻辑和 OBServer 日志发现,easy_connection_on_timeout_conn 连接超时是基于服务端 to 服务端的,也就是 A 节点 和 B 节点之间建立连接超时,通过 tsar 的信息判断是由于双端中有一端的网络重传较高,从而导致连接超时并报错 easy_connection_on_timeout_conn。
解决方法
需要业务侧网络部门具体排查。