MySQL 高可用

核心概念

MySQL 高可用(High Availability, HA)核心目标是保障数据库服务持续在线、数据不丢失,通过冗余设计与故障自动转移消除单点故障,核心指标:

RTO(Recovery Time Objective):故障恢复时间,越短越好(通常秒级~分钟级)

RPO(Recovery Point Objective):故障后数据丢失量,越接近 0 越好

二、主流高可用方案总览

  1. 官方原生方案

主从复制(Replication):基础异步 / 半同步复制,一切 HA 方案基石

MySQL Group Replication(MGR):官方原生组复制,基于 Paxos,强一致、自动故障转移

InnoDB Cluster:MGR+MySQL Shell+MySQL Router 一体化集群,生产级标准方案

InnoDB ClusterSet:跨地域多集群级联,实现异地容灾

  1. 第三方开源方案

MHA(Master High Availability):经典主从自动切换工具,兼容旧版 MySQL

MMM(Master-Master Replication Manager):双主复制管理,早期常用、维护停滞

PXC/Galera Cluster:同步多主集群,强一致、高并发写入

三、方案详解(含原理、配置、优缺点、场景)

方案 1:主从复制(异步 / 半同步)

原理

主库(Master)记录二进制日志(Binlog),从库(Slave)通过 I/O 线程拉取、SQL 线程重放,实现数据复制。

异步复制(默认):主库写成功即返回,不等待从库确认,性能高、有数据丢失风险

半同步复制(MySQL 5.7+):主库事务提交前,等待至少 1 个从库 ACK,降低数据丢失风险

关键配置(my.cnf)

主库

ini

mysqld

server-id=1

log_bin=mysql-bin

binlog_format=ROW

gtid_mode=ON

enforce_gtid_consistency=ON

从库

ini

mysqld

server-id=2

relay_log=relay-bin

log_slave_updates=ON

read_only=ON

gtid_mode=ON

enforce_gtid_consistency=ON

优缺点

✅ 优点:架构简单、兼容性强、性能损耗小、易部署

❌ 缺点:故障转移需人工 / 第三方工具、无自动选主、存在脑裂风险

适用场景

读多写少、对一致性要求不极高的业务

读写分离、数据备份、读写扩展

方案 2:MGR(MySQL Group Replication)

原理

基于Paxos 分布式共识协议,多 MySQL 节点组成复制组,通过分布式事务认证保证强一致,支持单主模式(推荐)、多主模式。

单主:1 个 Primary 读写,其余 Secondary 只读,自动选主

多主:所有节点可写,内置冲突检测

核心要求

MySQL 5.7.17+ / 8.0+

仅支持 InnoDB、必须有主键

GTID=ON、binlog_format=ROW

奇数节点(3/5/7),防脑裂

关键配置(my.cnf)

ini

mysqld

server-id=1

gtid_mode=ON

enforce_gtid_consistency=ON

binlog_format=ROW

log_slave_updates=ON

binlog_checksum=NONE

transaction_write_set_extraction=XXHASH64

plugin_load_add=group_replication.so

group_replication_group_name="UUID"

group_replication_local_address="IP:33061"

group_replication_group_seeds="IP1:33061,IP2:33061,IP3:33061"

group_replication_single_primary_mode=ON # 单主模式

group_replication_enforce_update_everywhere_checks=OFF

优缺点

✅ 优点:官方原生、强一致、自动故障转移(秒级)、无第三方依赖、支持读写分离

❌ 缺点:仅支持 InnoDB、多主性能损耗、网络要求高、节点数有限(≤9)

适用场景

金融、电商等强一致、高可靠核心业务

云原生、微服务架构的标准 MySQL 集群

方案 3:InnoDB Cluster(MGR 企业级封装)

架构

三大组件:

MGR:数据复制与高可用底层

MySQL Shell:集群管理、部署、监控工具

MySQL Router:轻量中间件,流量路由、读写分离、故障透明

部署步骤(MySQL Shell)

检查实例配置

shell

dba.checkInstanceConfiguration('root@node1:3306')

dba.configureInstance('root@node1:3306')

创建集群

shell

var cluster = dba.createCluster('myCluster')

添加从节点

shell

cluster.addInstance('root@node2:3306')

cluster.addInstance('root@node3:3306')

部署 Router

shell

dba.deployRouter('root@router-host')

优缺点

✅ 优点:一体化部署、可视化管理、自动读写分离、应用透明、完善监控

❌ 缺点:架构较复杂、资源消耗高于普通主从

适用场景

生产环境标准首选方案(MySQL 8.0+)

企业级核心数据库集群

方案 4:MHA(经典第三方方案)

原理

基于主从复制,Manager 节点监控主库,故障时自动选最优从库升主、补全 Binlog、VIP 漂移、从库重定向。

架构

Manager:独立监控节点

Node:部署在所有 MySQL 节点

优缺点

✅ 优点:切换快(10~30s)、兼容所有引擎、数据丢失少

❌ 缺点:2018 年后停更、不兼容 MySQL 8.0 新特性、依赖 SSH 互信、运维复杂

适用场景

MySQL 5.7 及以下版本遗留系统

传统主从架构升级 HA

方案 5:PXC/Galera Cluster

原理

同步多主复制,事务在所有节点提交成功才返回,强一致、无延迟、全节点可写。

优缺点

✅ 优点:强一致、多主写入、无单点、自动扩容

❌ 缺点:性能损耗大、DDL 锁表、网络敏感、不支持大事务

适用场景

读写均衡、强一致、低延迟要求的业务

四、方案对比选型表

表格

方案 一致性 故障转移 多主 兼容引擎 维护状态 推荐度

主从复制 最终一致 手动 / 工具 ❌ 全部 活跃 ⭐⭐⭐

MGR 强一致 自动(秒级) ✅ InnoDB 活跃 ⭐⭐⭐⭐⭐

InnoDB Cluster 强一致 自动 ✅ InnoDB 活跃 ⭐⭐⭐⭐⭐

MHA 最终一致 自动(10~30s) ❌ 全部 停滞 ⭐⭐

PXC/Galera 强一致 自动 ✅ InnoDB 活跃 ⭐⭐⭐⭐

五、高可用关键技术要点

  1. GTID(全局事务 ID)

唯一标识事务,简化复制、故障切换、数据一致性校验

必须开启:gtid_mode=ON、enforce_gtid_consistency=ON

  1. 脑裂防护

奇数节点(3/5/7)+ 多数仲裁机制

网络分区时,仅多数派节点提供服务

  1. 读写分离

InnoDB Cluster:Router 自动读写分离

主从 + ProxySQL/Sharding-Proxy:自定义路由策略

  1. 监控与告警

关键指标:节点状态、复制延迟、事务成功率、连接数

工具:Prometheus+Grafana、MySQL Enterprise Monitor、Zabbix

六、生产环境最佳实践

首选方案:MySQL 8.0 + InnoDB Cluster(单主 MGR)

节点规划:3 节点(1 主 2 从),跨机架 / 机房部署

数据安全:开启半同步、Binlog 加密、定期全量 + 增量备份

性能优化:主从分离、从库读负载均衡、大事务拆分

故障演练:定期模拟主库宕机、网络分区、数据恢复

七、官方文档参考

MySQL Replication:https://dev.mysql.com/doc/refman/8.0/en/replication.html

MySQL Group Replication:https://dev.mysql.com/doc/refman/8.0/en/group-replication.html

InnoDB Cluster:https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-innodb-cluster.html

相关推荐
J2虾虾2 小时前
MySQL的基本操作
数据库·mysql
arvin_xiaoting3 小时前
OpenClaw学习总结_III_自动化系统_3:CronJobs详解
数据库·学习·自动化
杨云龙UP3 小时前
Oracle 中 NOMOUNT、MOUNT、OPEN 怎么理解? 在不同场景下如何操作?_20260402
linux·运维·数据库·oracle
jzwugang3 小时前
postgresql链接详解
数据库·postgresql
2601_949815333 小时前
MySQL输入密码后闪退?
数据库·mysql·adb
lifewange4 小时前
Redis的测试要点和测试方法
数据库·redis·缓存
_下雨天.4 小时前
MySQL高可用
数据库·mysql
刘~浪地球4 小时前
Redis 从入门到精通(六):列表操作详解
数据库·chrome·redis
颜颜yan_4 小时前
让数据库学会说“不“——金仓 SQL 防火墙深度解析
数据库·sql
霖霖总总4 小时前
[小技巧52]从 SQL 到结果:MySQL 8.0 查询执行全流程深度剖析
sql·mysql