
MySQL高可用架构MHA、MGR与InnoDB Cluster的技术演进与选型一、引言MySQL高可用方案经历了从外部管理器到原生组复制的演进。MHAMaster High Availability代表了第一代基于外部监控和日志补齐的切换方案MGRMySQL Group Replication是MySQL 5.7引入的原生组复制协议InnoDB Cluster则是在MGR之上封装了MySQL Shell和MySQL Router的一体化方案。三种方案在故障检测机制、数据一致性保证、网络分区处理和运维复杂度上存在本质差异。选择不当可能导致切换后数据丢失或脑裂双写等灾难性后果。timeline title MySQL高可用方案演进 2011 : MHA诞生 : 基于外部Manager监控 : 通过relay log补齐实现准同步 2016 : MGR (MySQL 5.7.17 GA) : 原生Paxos组复制协议 : 多主/单主模式 2017 : InnoDB Cluster : MGR MySQL Shell Router : 一键部署与故障切换 2020 : InnoDB ReplicaSet : 轻量级异步复制方案 : 面向读扩展场景二、三种方案的故障切换机制2.1 MHA外部监控驱动MHA由Manager节点和Node节点组成。Manager持续监控Master的存活状态当检测到故障时通过SSH连接到各Node执行切换逻辑。sequenceDiagram participant M as MHA Manager participant O as 原Master (宕机) participant S1 as Slave-1 participant S2 as Slave-2 participant VIP as VIP/Proxy M-O: 心跳检测3秒超时 O--xM: 无响应确认故障 M-S1: 检查relay log位置 M-S2: 检查relay log位置 M-S1: 应用差异relay log Note over M: 选择relay log最新的Slave M-S1: 提升为新Master S1-S1: reset master; set read_only0 M-S2: change master to S1 M-VIP: 漂移到S1 M-O: 如果SSH可达尝试保存binlogMHA的核心缺陷在于切换依赖Manager自身的高可用且在网络分区场景下Manager可能错误判断Master宕机而触发不必要的切换。2.2 MGRPaxos驱动的组复制MGR基于Paxos协议的变体组内每个节点参与共识决策。事务提交前需要在组内达成多数派确认-- MGR关键配置示例 -- my.cnf [mysqld] # 组复制基础配置 plugin-load-addgroup_replication.so loose-group_replication_group_nameaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee loose-group_replication_start_on_bootOFF loose-group_replication_local_address192.168.1.10:33061 loose-group_replication_group_seeds192.168.1.10:33061,192.168.1.11:33061,192.168.1.12:33061 # 单主模式推荐生产环境 loose-group_replication_single_primary_modeON loose-group_replication_enforce_update_everywhere_checksOFF # 流控配置防止从节点落后过多 loose-group_replication_flow_control_applier_threshold25000 # 待应用事务数阈值 loose-group_replication_flow_control_certifier_threshold25000 loose-group_replication_flow_control_modeQUOTAMGR的故障检测基于组通信层的超时机制。当节点在5秒内未响应组通信消息时被怀疑为故障节点触发多数派驱逐。2.3 InnoDB Cluster一体化方案InnoDB Cluster通过MySQL Shell提供声明式的集群管理内部使用MGR的组复制但在运维层面大大简化了操作// MySQL Shell - 创建InnoDB Cluster // 连接到种子节点 \connect rootnode1:3306 // 创建集群自动配置MGR var cluster dba.createCluster(prodCluster, { memberWeight: 50, expelTimeout: 10, consistency: BEFORE_ON_PRIMARY_FAILOVER }); // 添加节点 cluster.addInstance(rootnode2:3306, {memberWeight: 50}); cluster.addInstance(rootnode3:3306, {memberWeight: 50}); // 查看集群状态 cluster.status(); // 输出 // { // clusterName: prodCluster, // defaultReplicaSet: { // primary: node1:3306, // status: OK, // topology: { // node1:3306: {mode: R/W, role: PRIMARY}, // node2:3306: {mode: R/O, role: SECONDARY}, // node3:3306: {mode: R/O, role: SECONDARY} // } // } // }三、数据一致性与网络分区处理维度MHAMGRInnoDB Cluster同步模式半同步复制AFTER_SYNC基于Paxos的多数派确认同MGR可配置consistency级别数据丢失风险存在未同步的binlog可能丢失多数派确认后提交零丢失同MGR脑裂处理无原生支持依赖外部Fencing少数派自动驱逐拒绝写入同MGR网络分区恢复手动补齐数据自动增量同步基于GTID自动MySQL Clone或增量恢复单机故障恢复手动重建自动重新加入分布式恢复一键RebootClusterFromCompleteOutageMGR的流控机制是保证一致性的关键-- 查看流控状态 SELECT * FROM performance_schema.replication_group_member_stats; -- 重点关注以下指标 -- COUNT_TRANSACTIONS_IN_QUEUE: 待应用的冲突检测队列长度 -- COUNT_TRANSACTIONS_CHECKED: 已完成冲突检测的事务数 -- COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE: 待应用的远程事务数 -- 如果 COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE 持续增长 -- 说明从节点处理能力不足流控将自动限制主节点写入速度四、性能损耗实测对比在相同硬件条件下16C/64G/SSD使用sysbench oltp_read_write脚本进行基准测试方案TPS (256并发)平均延迟 (ms)P99延迟 (ms)与单机对比单机MySQL 8.012,84719.848.5基准MHA (1主2从)12,10321.152.3-5.8%MGR 单主 (3节点)9,43227.068.7-26.6%InnoDB Cluster9,28527.571.2-27.7%MGR的性能损耗主要来源于两阶段提交的组通信开销。当节点间网络延迟超过1ms时损耗会进一步放大。这也是为什么MGR推荐同机房部署跨机房部署时建议使用异步复制而非组复制。五、总结MHA适合MySQL 5.6/5.7的存量系统团队对切换过程有完全控制需求且可以接受秒级的数据丢失风险。不推荐新建系统采用因为MHA已停止维护且不支持MySQL 8.0的新特性。MGR适合对数据一致性要求极高的场景如金融交易系统可以接受约25%的写入性能损耗且团队具备MySQL内核级排查能力。部署必须采用奇数节点≥3且所有节点应在同一数据中心。InnoDB Cluster适合大多数新建MySQL 8.0系统的默认选择。在运维简便性和功能完整性之间取得了最佳平衡。MySQL Router的自动读写分离进一步降低了应用层的改造成本。核心决策原则如果零数据丢失是不可妥协的硬性要求选择MGR或InnoDB Cluster如果绝对性能是首要目标且可以接受秒级数据丢失考虑MHA或异步复制手动切换方案。