MySQL Group Replication(MGR)的核心工作原理在于它实现了 ​​基于 Paxos 变种协议(组通信系统引擎XCom)的、原子广播(Atomic Broadcast)的多主/单主强同步复制机制​​。它将传统的异步主从复制提升到了一个​​多节点协同、高一致性的分布式系统​​层级。

以下是其工作原理的关键环节:

  1. ​组成员(Group Membership):​

    • 多个 MySQL 服务器(通常至少3个)组成一个 ​​“组”(Group)​​。每个节点都运行着 Group Replication 插件。
    • 组内成员​​自动管理加入和退出​​。每个成员都知道组内其他所有成员的状态(ONLINE,RECOVERING,UNREACHABLE, OFFLINE, ERROR等)。
    • 成员之间通过专用网络通道进行通信(组复制通信栈)。
  2. ​组通信引擎(XCom):​

    • 这是 MGR 的底层核心组件,实现了确保消息可靠、有序传递的​​分布式共识协议(基于Paxos变种)​​。
    • ​关键功能:​​ 负责在整个组内对消息(主要是二进制日志事务事件)进行​​原子广播(Atomic Broadcast)​​。这意味着:
      • ​全有或全无:​​ 消息要么被成功传递到组内的每个 ONLINE 节点,要么任何节点都未成功传递(提供原子性)。
      • ​可靠有序:​​ 消息以​​完全相同的全局顺序​​传递到所有 ONLINE 节点(提供一致性)。即使出现网络中断或节点故障,只要通信恢复后重新达成共识,新消息也会按相同的总序追加。
    • XCom 利用 ​​“多数派原则(Quorum)”​​ 来达成共识。任何事务要在组内提交,必须获得大多数(N/2+1,N为组大小)节点的投票确认。这确保了网络分区时最多只有一个多数派子组能够继续工作(避免“脑裂”),并提供了​​容错能力​​(例如,3节点容忍1个节点故障,5节点容忍2个节点故障)。
  3. ​事务生命周期(以单主模式写Primary节点为例):​

    1. ​本地执行与写入日志:​​ 客户端发起一个写事务,在​​当前的主节点(Primary)​​ 上执行SQL语句。和单机一样,数据首先在引擎层面修改并生成 Undo/Redo 日志。
    2. ​Prepare & Write Binlog:​​ 事务准备提交时(进入提交阶段),​​主节点将其对应的所有修改事件(Binary Log Events)写入本地的 binlog 文件(写入 Page Cache)​​。此时事务数据​​尚未持久化​​(sync_binlog=0)到磁盘(为了性能)。
    3. ​广播 & 收集认证(Certification):​
      • 主节点将通过 Group Replication Channel 将包含这些 binlog events 的消息​​广播​​给组内所有其他节点(包括自己)。
      • 所有节点收到消息后,首先进行 ​​“冲突检测(Certification)”​​:
        • 将接收到的事务标识符(包括主节点的server_uuid和该节点的事务序列号seq_no)与本地的 ​​“已认证事务集”​​ 进行比对。
        • 检查该事务修改的数据是否与当前节点上已经提交的​​并发(时间段有重叠)​​ 事务修改了相同的行(Row-Level),但来自不同的节点(依赖写入集WRITESETgtid_executed)。
        • ​若无冲突:​​ 该事务在该节点上获得​​预认证通过​​,计入“已认证事务集”。
        • ​若有冲突:​​ 该事务被标记为失败(会在主节点上回滚)。
    4. ​达成共识 & 投票:​
      • 所有节点(包括主节点自己)在完成本地的冲突检测后,会独立地对广播消息(事务是否可应用)进行​​投票​​(通常是“准备就绪”或“有冲突”)。
      • ​XCom 引擎负责收集这些投票​​。
      • 当主节点收到 ​​超过半数组成员(包括主节点自己)​​ 的“准备就绪”确认消息时,意味着该事务在组内​​达成了共识​​(多数派节点认为事务无冲突且可以应用)。此时主节点知道该事务可以安全地在组内提交。
    5. ​主节点提交(Commit):​
      • 主节点收到足够多的投票后,执行真正的事务提交操作(COMMIT)。
      • 确保 Binlog Event 和 数据更改通过 fsync ​​持久化​​到磁盘(此时 sync_binlog 设置才生效,但 MGR 依赖内部保障)。
      • 向客户端返回“事务成功”信息。​​注意:客户端在收到成功响应时,意味着事务已在组内达成共识并持久化在主节点上,但尚未在所有从节点上持久化。​
    6. ​从节点应用(Apply):​
      • 其他节点(副本节点,Secondary)在本地冲突检测通过后,就已经将事务对应的 binlog events ​​写入本地的 relay log 文件(写入 Page Cache)​​。
      • 当它们收到主节点“已达成共识”的指示(隐含在协议的推进中),就知道该事务在主节点已提交。
      • 副本节点上的​​回放线程(Applier Thread)​​ 开始读取并应用 relay log 中的事件,将这些更改写入本地数据库(在数据页和引擎层持久化)。​​这通常是异步发生的​​,但 MGR 的一致性级别设置可影响应用的时机。
    7. ​最终一致性保证:​​ 因为事务是​​按全局一致、全序(binlog event order)​​ 到达每个节点的,并且应用过程是串行的,所以所有在线且稳定的节点最终都会拥有​​一致的状态​​(相同的数据和事务提交顺序)。
  4. ​自动故障转移(Failure Detection & Failover - 单主模式下):​

    • 组内成员​​持续相互监控​​(通过心跳消息)。
    • 如果某个成员(尤其是主节点)长时间没有心跳或被多数派判断为失效,它会被​​自动驱逐(Expelled)​​ 出组。
    • 如果失效的是主节点,剩余的在线节点(需要构成多数派)会自动协商并​​触发一次新的选举​​。
    • ​选举算法基于 server_uuid + 事务序列号(seq_no)排序​​:选择具有最新状态(拥有最高 seq_no,即最多已提交事务)的节点为新主(Primary)。如果多个节点具有相同的 seq_no,则选择 server_uuid 最小的节点。这样确保了新主拥有所有已提交事务。
    • ​自动重新配置:​​ 组拓扑自动更新,所有剩余节点和连接到此组的 Router 都会感知到新的主节点是谁。
    • 客户端(通过 Router)​​透明地重定向​​到新的主节点。

​关键特性总结:​

  • ​分布式一致性:​​ 保证组内所有节点在稳定状态下拥有​​完全相同的数据视图​​和​​严格一致的提交顺序​​。

  • ​基于共识的高可用:​​ 使用多数派原则(Paxos-like)达成共识,提供自动化的成员管理和主节点选举。

  • ​内置冲突检测(多主模式):​​ 检测并解决不同节点并发修改同一行数据引起的冲突。

  • ​故障容错:​​ 可以容忍 (N-1)/2 个节点的失败(N为总节点数)。

  • ​灵活模式:​​ 支持​​单主模式(推荐)​​(一个节点处理所有写)和​​多主模式​​(所有节点可读写,需小心冲突处理)。

  • ​性能折衷:​​ 强一致性通过同步通信(消息广播、冲突检测、等待多数派投票)实现,相对于异步复制会带来额外的​​网络延迟开销​​。网络性能和稳定性对 MGR 的效率和可用性至关重要。

​核心流程简化记忆:​

客户端写操作 -> 主节点执行 -> 主节点写binlog -> 广播事务到组 -> 所有节点进行冲突检测(Certification) -> 所有节点对事务投票 -> 主节点收集投票 -> 达到多数派同意 -> 主节点提交(持久化) -> 返回客户端成功 -> 从节点异步应用更改

理解 XCom 引擎的原子广播协议和分布式共识、内置的冲突检测/解决机制(Certification)、以及基于多数派决策的故障转移机制,是掌握 MySQL Group Replication 工作原理的核心。

posted on 2025-06-10 09:30  LeeHang  阅读(179)  评论(0)    收藏  举报