OceanBase 数据库切主强制停止正在进行的事务的原因及规避方法是什么?

OceanBase 数据库切主时可能会强制停止正在进行的事务。本文介绍了停止事务的原因以及规避的方法。

适用版本

OceanBase 数据库 V2.X 版本

触发切主的场景

OceanBase 数据库中,会触发切主的场景包括:

  • RootService 的常规切主服务:包括修改 Primary Zone、轮转升级、副本搬迁、执行

    STOP SERVER

    STOP ZONE

    命令导致的切主。

  • clog 模块触发的切主:clog 滑动窗口超时导致 Leader 卸任,其触发场景如 clog 写入超时、网络抖动丢包、clog 回放挂起、日志空间满等。

发生切主时,OceanBase 数据库会首先停止在 partition 的写入,之后 50 ms 等待 active 事务结束。在这之后的 100 ms 内,OceanBase 数据库会尝试把未完成的事务通过 clog 持久化到新的主所在的 Leader 上。100 ms 后,如果还有事务未完成持久化,这些事务会被强制停止。

切主时停止正在执行的事务的原因如下:

  • 对于 clog 模块主动卸任 Leader 的场景,会导致无法进行活动事务迁移的动作,事务会被强制停止。
  • 活动大事务在活动事务迁移过程中,由于 clog 量大,导致 100 ms 内无法完成迁移,这些事务只能回滚。
  • Leader 改选之前开启的事务,并且在改选发生时还没有执行结束的,并且未进入两阶段提交的事务会被强制停止。

规避方法

  1. 关闭负载均衡相关的切主行为,相关的配置项包括

    enable_rebalance

    enable_merge_by_turn

    enable_auto_leader_switch

  • enable_rebalance

    用于设置是否开启自动负载均衡的功能,默认为 true,表示开启。

  • enable_merge_by_turn

    用于设置是否开启轮转合并策略,默认为 true,表示开启。

  • enable_auto_leader_switch

    用于设置是否开启自动切主,默认为 true,表示开启。

obclient> ALTER SYSTEM SET enable_rebalance=FALSE; obclient> ALTER SYSTEM SET enable_merge_by_turn enable_merge_by_turn=FALSE; obclient> ALTER SYSTEM SET enable_auto_leader_switch=FALSE;

  1. 关闭 clog 日志同步失败导致的切主行为,相关的配置项为

    _ob_clog_timeout_to_force_switch_leader

  2. _ob_clog_timeout_to_force_switch_leader

    用于当日志同步被阻塞时,设置最长等待时间,超过该时间值之后废除原主。默认为 10s,取值范围为 [0,60m],设置为 0 时表示关闭 clog 日志同步失败导致的切主动作。

obclient> ALTER SYSTEM SET _ob_clog_timeout_to_force_switch_leader=0;

  1. 控制单个事务的 clog 大小,控制大事务的使用。有关大事务的详细信息,请参见 如何检查大查询整体情况
  2. 在业务层增加重连尝试的机制。

把涂老师发布的这些知识问题整理成文,对理解和掌握OB有大的提升。

应该可以发到专栏里,开专门的栏目