Skip to content

MGR GTID Diverged 处理

故障描述

当执行 dba.rebootClusterFromCompleteOutage() 重新引导完全中断的 MGR 集群时,出现 GTID 集不可兼容错误:

mysqlsh root@helmbroker-mysql-0:3306
dba.rebootClusterFromCompleteOutage()
ERROR: RuntimeError: The instance 'helmbroker-mysql-2:3306' has an incompatible GTID set with the seed instance 'helmbroker-mysql-0:3306' (GTIDs diverged).
If you wish to proceed, the 'force' option must be explicitly set.

在 helmbroker-mysql-0 上无法正常恢复集群。

分析

问题原因

该错误表示 MGR 集群在灾难期间发生了数据分叉 (split brain)——各节点的 GTID 集合不再共享共同的前缀序列,处于不可合并的分歧状态。常见场景包括:

  • 网络分区后多个节点继续服务:quorum 丧失后独立接受写请求导致数据分裂
  • NO_QUORUM 状态下仍写入:切换到 single-instance 模式处理后又被其他非同一数据源节点加入
  • 灾难后的错误操作:备份恢复顺序错误或误删重要信息

这是严重的脑裂后果,意味着已有永久性数据分叉发生。

MGR 全局状态对照表

集群状态 状态说明
OK 所有节点 ONLINE,可容忍至少一个以上故障
OK_PARTIAL 有节点不可用,但仍可容忍部分故障
OK_NO_TOLERANCE 节点充足但无冗余(如三节点只剩两节点)
NO_QUORUM 无法定人数,只能读取不能写入
OK_DIVERGED 各节点数据已分裂分叉
UNAVAILABLE 所有节点均为 OFFLINE

诊断方法

通过执行以下命令确认是否存在 GTID 分歧:

-- 在所有集群成员节点执行
SELECT @@GLOBAL.GTID_EXECUTED;

若发现各节点的 Executed_GTID_Set 完全没有交集且无法追溯到一个共同的祖先序列,则表示已发生数据分叉。

解决方案

步骤 1:选择最新的种子节点

检查各个节点的 GTID 执行情况,找出其中事务最新的那台机器作为恢复入口点(例如 helmbroker-mysql-2)。

步骤 2:在新的种子上恢复集群

# SSH 登录到选定节点
ssh root@helmbroker-mysql-2

# 进入 mysqlsh 并执行恢复流程
mysqlsh --user=root localhost
JavaScript version: 15.x
---------------------------------------------------------

Connecting as user: root
Successfully connected via SSL/TLS

# 执行 cluster recovery - 这次能顺利通过!
dba.rebootFromCompleteOutage()
✔ Cluster successfully rebooted

### 步骤 3:验证集群恢复状态

```javascript
// 验证 cluster 状态
var clus = dba.getCluster();
clus.status();

正常情况下应看到大部分节点的 readWriteStatus 为 ONLINE。