MySQL Group Replication (MGR) 主节点故障自动切换和选举过程
MySQL Group Replication (MGR) 在主节点(单主模式下)故障时,其自动故障切换(Failover) 的核心在于其分布式故障检测机制和基于最新数据的共识选举协议。整个过程高度自动化,旨在最小化人工干预和停机时间。
以下是主节点故障自动切换的实现细节和选举过程:
一、触发条件:故障检测
持续心跳监控 (Failure Detector):
- 组内每个成员会定期(默认每秒)通过专用的组通信网络通道向其他成员发送心跳消息(包含自身状态和最新事务信息)。
- 每个成员都会监听来自其他成员的心跳。
超时判定故障:
- 如果某个成员(比如当前的Primary,称为
Node_A)在预设的超时时间(如 5秒,由参数group_replication_member_expel_timeout控制)内未收到来自某个特定成员(比如Node_B)的任何消息(包括心跳和应用进度等有效消息)。
- 如果某个成员(比如当前的Primary,称为
嫌疑阶段(Suspicion Phase - 分布式检测):
- 超时后,检测到问题的成员(
Node_B)并不会立即宣布Node_A失效。 Node_B会向整个组广播一个怀疑消息,指出它认为Node_A可能失效了。(这是一种优化的“流言传播”或Gossip-like机制)
- 超时后,检测到问题的成员(
确认故障 (Expulsion):
- 组内其他成员收到
Node_B的怀疑消息后,会检查自己与Node_A的最后通信时间。 - 如果大多数在线成员(构成法定数量Quorum)都确认在
group_replication_member_expel_timeout时间内未收到Node_A的有效消息,那么这些成员将达成共识。 - 达成共识后,组会自动驱逐(Expel)
Node_A。Node_A的状态被标记为UNREACHABLE然后OFFLINE(或ERROR),并从组视图(group_replication_group_members)中移除。
- 组内其他成员收到
关键点:故障检测是分布式的,避免单点判断错误;驱逐需要多数派(Quorum)成员确认。
二、新主节点选举(Leader Election)
一旦确认旧主节点(Node_A)被驱逐,并且剩余的在线成员数量仍然超过半数(拥有 Quorum),集群会自动触发新主节点(Primary)的选举过程。
核心选举算法:基于“最高事务序列号(seq_no) + 唯一标识(server_uuid)”
MySQL MGR 的选举过程由底层 XCom 引擎驱动,遵循一个严格的、基于分布式共识的顺序规则来选择新主:
收集候选节点状态: 剩余的在线节点(构成 Quorum 的成员)会交换和比较彼此的状态信息,最关键的两个值是:
-
last_applied_seq_no(或类似的最高事务序列号): 每个节点上已应用的最高事务的序列号(通常直接取自 GTID Executed Set 中的内部序号,或事务计数器)。这个值代表了节点上数据的相对“新旧”程度。数值越大,数据越新。 -
server_uuid: 每个 MySQL 服务器实例的唯一标识符(全局唯一字符串)。
-
比较规则:
- 第一优先级:
last_applied_seq_no(值更高者优先)- 目标:选择具有最新数据(拥有最多已提交事务)的节点作为新主。这最大限度地避免了数据丢失(因为新主理论上包含了旧主最后提交的所有事务)。
- 第二优先级:
server_uuid(字典序更小者优先)- 在出现多个节点拥有 完全相同的 最高的
last_applied_seq_no值的情况时(通常只发生在完美同步或启动时),选举算法会回退到比较server_uuid,选择字典序更小的(即server_uuid字符串排序更靠前)的节点作为新主。这是一种确定性的最终解决机制。
- 在出现多个节点拥有 完全相同的 最高的
- 第一优先级:
达成共识:
- XCom 引擎负责协调这个比较和决策过程。
- 剩余的每个在线节点独立应用上述比较规则,最终在所有节点上达成完全一致的选举结果。这个过程基于共识协议(类似 Paxos),确保所有在线节点都选出同一个新主节点。
角色切换:
- 被选中的节点(如
Node_C)自动将其角色从SECONDARY切换为PRIMARY。 - 其他剩余节点(如
Node_B,Node_D)保持为SECONDARY(只读)角色,并准备接受来自新主Node_C的复制数据。
- 被选中的节点(如
核心原则:选数据最新的节点当新主!
last_applied_seq_no是选择的核心依据,server_uuid用于处理平局。
三、集群视图更新与服务恢复
更新元数据:
- 组内形成新的成员视图(删除了故障节点
Node_A,并包含了新主Node_C)。 - 新的视图(
group_replication_group_members)信息通过共识协议自动同步给所有剩余节点。
- 组内形成新的成员视图(删除了故障节点
MySQL Router 重定向:
- MySQL Router 实例在后台定期轮询集群元数据(
mysql_innodb_cluster_metadataschema 或 performance_schemagroup_replication_group_members)。 - 当 Router 检测到集群视图更新(
ROLE列显示新的PRIMARY是Node_C)时,它会立即更新内部路由表。 - 对于新连接: 所有新到达的读写请求自动路由到新主
Node_C。 - 对于现有连接: Router 会尝试关闭或终止指向旧主
Node_A的会话(通常在旧连接下次发生读写操作时返回错误或自动重连到 Router,由 Router 重定向到Node_C)。
- MySQL Router 实例在后台定期轮询集群元数据(
应用恢复(Applier 继续):
- SECONDARY 节点上的 Applier 线程继续从新的 PRIMARY (
Node_C) 接收并应用 binlog events,追赶数据。
- SECONDARY 节点上的 Applier 线程继续从新的 PRIMARY (
四、故障切换流程图(简版)

总结关键点
前提:剩余节点构成 Quorum( > N/2 )。
故障检测:基于心跳超时 + 分布式投票驱逐。
选举核心:
last_applied_seq_no(选数据最新者)。平局处理:
server_uuid(小者优先)。自动化:整个过程(检测 -> 驱逐 -> 选举 -> 切换 -> 视图更新)由 MGR 自动完成。
切换时间:通常在旧主失效被确认(
group_replication_member_expel_timeout时间已过)后,选举本身非常快(毫秒级),加上通知Router和应用重建连接,客户端感知的中断时间通常在 20-60 秒**。透明性:应用通过 MySQL Router 连接,Router 会自动重定向流量到新主。
因此,MGR 通过可靠的分布式故障检测机制和基于最新数据优先的共识选举协议,实现了高可用的自动故障切换(Failover)。
MySQL Group Replication (MGR) 主节点故障自动切换和选举过程的更多相关文章
- Mysql Group Replication 简介及单主模式组复制配置【转】
一 Mysql Group Replication简介 Mysql Group Replication(MGR)是一个全新的高可用和高扩张的MySQL集群服务. 高一致性,基于原生复制及p ...
- 使用ProxySQL实现MySQL Group Replication的故障转移、读写分离(一)
导读: 在之前,我们搭建了MySQL组复制集群环境,MySQL组复制集群环境解决了MySQL集群内部的自动故障转移,但是,组复制并没有解决外部业务的故障转移.举个例子,在A.B.C 3台机器上搭建了组 ...
- 使用ProxySQL实现MySQL Group Replication的故障转移、读写分离(二)
在上一篇文章<使用ProxySQL实现MySQL Group Replication的故障转移.读写分离(一) > 中,已经完成了MGR+ProxySQL集群的搭建,也测试了ProxySQ ...
- mysql group replication 主节点宕机恢复
一.mysql group replication 生来就要面对两个问题: 一.主节点宕机如何恢复. 二.多数节点离线的情况下.余下节点如何继续承载业务. 在这里我们只讨论第一个问题.也就是说当主结点 ...
- Mysql 5.7 基于组复制(MySQL Group Replication) - 运维小结
之前介绍了Mysq主从同步的异步复制(默认模式).半同步复制.基于GTID复制.基于组提交和并行复制 (解决同步延迟),下面简单说下Mysql基于组复制(MySQL Group Replication ...
- MySQL Group Replication 介绍
2016-12-12,一个重要的日子,mysql5.7.17 GA版发布,正式推出Group Replication(组复制) 插件,通过这个插件增强了MySQL原有的高可用方案(原有的Replica ...
- mysql group replication观点及实践
一:个人看法 Mysql Group Replication 随着5.7发布3年了.作为技术爱好者.mgr 是继 oracle database rac 之后. 又一个“真正” 的群集,怎么做到“ ...
- MySQL Group Replication配置
MySQL Group Replication简述 MySQL 组复制实现了基于复制协议的多主更新(单主模式). 复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事 ...
- Percona XtraDB Cluster vs Galera Cluster vs MySQL Group Replication
Percona XtraDB Cluster vs Galera Cluster vs MySQL Group Replication Overview Galera Cluster 由 Coders ...
- MySQL group replication介绍
“MySQL group replication” group replication是MySQL官方开发的一个开源插件,是实现MySQL高可用集群的一个工具.第一个GA版本正式发布于MySQL5.7 ...
随机推荐
- 记一次ASP.NET CORE线上内存溢出问题与dotnet-dump的排查方法
前言 这周系统更新了一个版本,部署到线上. 客户反馈整个系统全部都卡顿,随即我们上服务器检查 发现整个服务器内存竟然达到了20-30G的占用..如图: 其中有一个订单服务,独自占用13-18G内存, ...
- 解决ZYNQ-7020开发板使用vitis编译uboot报错和无法正常调试的问题
整个学习过程是参考正点原子启明星开发板的2020.2版本嵌入式Linux开发指南,在学习uboot移植的时候遇到了问题. 新建工程和配置环境啥的和教程里都一样,就不罗嗦了,这里重点讲和教程不一样的地方 ...
- B1014 福尔摩斯的约会 && A1061 Dating
描述 大侦探福尔摩斯接到一张奇怪的字条: 我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm 大侦探很快就明白了, ...
- Windows平台调试器原理与编写05.内存断点
https://www.bpsend.net/thread-274-1-3.html 内存断点 访问断点 写入断点 内存写入断点 简介:当被调试进程访问,读或写指定内存的时候,程序能够断下来. 思考1 ...
- 我的Vue之旅(4)
2020-10-26 使用v-bind来绑定class属性主要是分成了两类,即对象语法与数组语法,其实在数组中也是可以混用对象语法的,但在Demo3中我没有 写出来,有兴趣的话可以自己试试.在HTML ...
- 使用 Linux 命令 curl 和 telnet 测试接口连通性
摘要:接口可用性诊断利器curl和Telnet. 综述 Linux 中的命令 curl 是利用 URL 语法在命令行模式下工作的开源文件传输工具,它可以被用于测试API接口,查看响应头和发出HTT ...
- CKA考试笔记
题目一:etcd升级 1.从内置快照中备份数据 ETCDCTL_API=3 etcdctl --endpoints=https://master:2379 \ --cert=/etc/kubernet ...
- springboot读取并映射额外的yml配置到bean
项目结构 userPermission.yml # 用户权限 user-permission: api: # 系统管理员 system_manager: - "*:*:*" # 应 ...
- 【2020.11.19提高组模拟】二次剩余two 题解
[2020.11.19提高组模拟]二次剩余two 题解 题目描述 有\(n\)个二次函数,每个二次函数可以用两个值\(m,k\)描述: \[f(x)=(x-m)^2+k \] 现在有\(q\)次操作: ...
- ElasticSearch介绍及单机版安装
概述 ElasticSearch官网:https://www.elastic.co/cn/elasticsearch GitHub地址:https://github.com/elastic/elast ...