闪断避免指的是 ODP 与 OBServer 节点的 Server Session 异常不会被客户端感知,客户端与 ODP 之间的 Client Session 正常,客户端能够正常的读写数据。需要处理 Server Session 异常的情况如下:
OBServer 节点发生 Leader 切换,ODP 还没有获取到新的 Leader。这种情况主要由 OBServer 节点来处理,Leader 切换一定要保证将正在处理的事务都完成,ODP 只是尽力保证将请求发送给数据所在的 OBServer 节点,OBServer 节点发生了 Leader 切换,那么即使数据不在该 OBServer 节点上,该节点也需要负责处理该请求,并把结果返回给 ODP。
OBServer 节点发生宕机,那么 ODP 与该 OBServer 节点的连接就会断开。如果该 Server Session 正在处理事务中,那么 ODP 需要发送一个错误响应给客户端;如果该 Server Session 处于空闲状态,只需将该 Server Session 从其对应的 Client Session 中标记删除即可。新的请求将不再使用该 Server Session 转发请求。
ODP 与 OBServer 节点通信超时,MySQL 协议本没有超时机制,但 OBServer 节点有超时机制,所以 OBserver 节点超时会通知 ODP,ODP 将错误通知给客户端。如果 OBServer 节点发现 Server Session 长时间不活动,也会 Kill 该 Session,这种情况的处理参考第 2 项的处理方式。
ODP 与 OBServer 节点之间的网络连接断开或发生网络分区,这种情况处理参考第 2 项,即使发生网络分区,如果 Server Session 上有事务正在执行,OBServer 在一段时间后终止该 Session,所以 ODP 在 Server Session 断开一段时间后,给客户端报错,结束未完成的事务,避免 Session 长时间被挂住。
ODP 升级,新启动的 ODP 将负责客户端发起的新 Session,旧 ODP 上的 Session 数量会越来越少,当旧 ODP 上的 Session 数量低于某个阈值时,需要将旧 ODP 上的 Session 全部都终止掉(当然要保证正在处理的事务完成,长事务需要等一段时间,超时仍然没有完成也只能强制 Kill 掉),然后停止旧 ODP。这个过程无法完全避免客户端连接闪断。
ODP 宕机,这种情况下,ODP 上的连接都会断掉,可能很快 ODP 被重新启动,或者该 ODP 负责的连接被其它的 ODP 处理,闪断无法避免。
使用 ODP 能够避免大部分异常情况下的连接闪断,特别是在 OBServer 节点发生 Leader 切换、主备集群切换、ODP 升级等后端维护的情况下,能保持客户端连接正常,对客户端的影响比较小。




