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 改选之前开启的事务,并且在改选发生时还没有执行结束的,并且未进入两阶段提交的事务会被强制停止。
规避方法
-
关闭负载均衡相关的切主行为,相关的配置项包括
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;
-
关闭 clog 日志同步失败导致的切主行为,相关的配置项为
_ob_clog_timeout_to_force_switch_leader
。
-
_ob_clog_timeout_to_force_switch_leader
用于当日志同步被阻塞时,设置最长等待时间,超过该时间值之后废除原主。默认为 10s,取值范围为 [0,60m],设置为 0 时表示关闭 clog 日志同步失败导致的切主动作。
obclient> ALTER SYSTEM SET _ob_clog_timeout_to_force_switch_leader=0;
- 控制单个事务的 clog 大小,控制大事务的使用。有关大事务的详细信息,请参见 如何检查大查询整体情况。
- 在业务层增加重连尝试的机制。