基于MySQL8.0的MGR 高可用集群部署
一.为什么需要 MySQL MGR 架构
传统 MySQL 主从复制存在几个比较棘手的问题:主从节点间的数据一致性无法自动保证,容易出现复制延迟;当主节点发生故障时,无法自动从多个从节点中选举出新的主节点;即使采用半同步复制,从节点因负载或网络延迟未能及时确认,也会反过来阻塞主节点的事务提交。
MGR(MySQL Group Replication,即 MySQL 组复制) 正是为了解决这些痛点而生的。它基于 Paxos 协议实现组复制,事务提交前需要获得超过半数节点的确认,因此能真正做到数据零丢失,并在主节点故障时实现自动切换,无需人工干预。
二.MySQL MGR 架构简介/概念
MGR 是 MySQL 5.7.17 版本开始引入的一种基于 Paxos 协议的高可用与高扩展复制方案,以插件(Plugin)形式嵌入 MySQL 服务。
其核心架构包含三个关键组件:
| 组件 | 作用 |
| 组通信系统(GCS) | 负责节点间的消息传递,是 MGR 的通信引擎 |
| 冲突检测机制 | 多主模式下检测并拒绝冲突事务 |
| 自动故障切换 | 节点宕机时自动移除故障节点并选举新主 |
MGR 支持两种运行模式:
- 单主模式:只有一个节点可读写,其他节点只读,推荐生产环境使用
- 多主模式:所有节点均可读写,但对应用层冲突处理能力要求较高
三.MySQL MGR 架构作用
MGR 解决的核心问题是传统主从复制无法保证数据一致性、无法自动故障切换的困境。具体作用包括:
- 数据强一致性:事务提交前须经多数派节点确认,确保故障时数据不丢失
- 自动故障转移:节点宕机后,集群自动达成多数派共识,将故障节点踢出并选举新主节点,RTO(恢复时间目标)通常小于 30 秒
- 简化运维:内置管理接口,通过
performance_schema.replication_group_members即可查看集群状态,DBA 工作量大幅降低 - 在线扩缩容:支持在线添加或删除节点,无需停机
四.MySQL MGR 架构应用场景
MGR 适用于对数据一致性、高可用性要求极高的业务场景:
| 行业/场景 | 原因 |
| 金融核心交易系统 | 数据零丢失要求极高,故障切换不可接受数据损失 |
| 电商订单/支付系统 | 高并发写入 + 强一致性需求,RPO(数据恢复点目标)必须为 0 |
| 企业级核心业务数据库 | 需要自动故障切换,减少人工介入时间 |
从实际案例来看,某金融客户采用 5 节点 MGR 集群后,年度可用率提升至 99.995%。
五.MySQL MGR 架构特点
✅ 优势
| 特点 | 说明 |
| 强一致性保障 | 基于 Paxos 的多数派确认机制,99% 事务可在 100ms 内完成全局同步 |
| 自动故障检测与恢复 | 故障节点超时(默认 5 秒)未响应即触发多数派共识并自动踢出 |
| 原生支持 | MySQL 官方内置功能,无需第三方组件管理 |
| 多模式灵活选择 | 支持单主/多主两种模式,适配不同业务需求 |
⚠️ 限制与挑战
| 限制 | 说明 |
| 网络延迟敏感 | 跨机房部署延迟超 50ms 时性能下降约 30% |
| 仅支持 InnoDB | 表必须有显式主键,不支持外键约束 |
| 写扩展性瓶颈 | 多主模式下热点表冲突检测会导致性能下降 |
| 流控机制 | 从节点回放跟不上时,MGR 会自动限速主节点写入,需提前规划 QPS 阈值 |
六、MGR 集群部署流程
6.1 系统基础配置
| 主机名 | IP地址 | 角色 |
|---|---|---|
| mysql1 | 10.8.0.110 | primary |
| mysql2 | 10.8.0.111 | secondary |
| mysql3 | 10.8.0.112 | secondary |
# 根据各节点设置主机名 hostnamectl set-hostname mysql1 # 在10上执行 hostnamectl set-hostname mysql2 # 在30上执行 hostnamectl set-hostname mysql3 # 在50上执行 # 所有节点统一编辑 /etc/hosts,添加: cat >> /etc/hosts <<EOF 10.8.0.10 mysql1 10.8.0.30 mysql2 10.8.0.50 mysql3 EOF # 关闭防火墙和增强功能 systemctl stop firewalld setenforce 0 #时间同步 systemctl start chronyd && systemctl enable chronyd chronyc sources -v # 确认同步正常,若MS列是以^,*,+开头,则时间同步


6.2 安装MySQL8.0
# 卸载系统自带数据库 rpm -qa | grep mariadb yum remove mariadb* -y # 添加 MySQL 官方 Yum 仓库 cd /opt sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm # 查看 Yum 源配置文件是否已存在 ls /etc/yum.repos.d/ | grep mysql # 或者直接查看 MySQL 8.0 仓库是否已启用 yum repolist | grep mysql # 安装MySQL Server yum install -y mysql-community-server --nogpgcheck #加上nogpgcheck跳过公钥验证,适合测试环境或内网部署 systemctl start mysqld systemctl enable mysqld # 获得mysql版本 mysql --version # 获取临时密码并修改密码,修改的密码需要数字+大小写字母+特殊符号 grep 'temporary password' /var/log/mysqld.log mysql -uroot -p'临时密码' ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPass@2026';



![]()
![]()
6.3 配置my.cnf
# 在主服务器配置 [mysqld] #基础配置 server_id = 110 gtid_mode = ON enforce_gtid_consistency = ON binlog_checksum = NONE log_slave_updates = ON master_info_repository = TABLE relay_log_info_repository = TABLE transaction_write_set_extraction = XXHASH64 # MGR 设置 loose-group_replication_group_name = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeee" loose-group_replication_start_on_boot = OFF loose-group_replication_bootstrap_group = OFF loose-group_replication_single_primary_mode = ON loose-group_replication_enforce_update_everywhere_checks = OFF loose-group_replication_local_address = "192.168.10.110:33061" loose-group_replication_group_seeds = "192.168.10.110:33061,192.168.10.111:33061,192.168.10.112:33061" report_host = 192.168.10.110 # 查看配置文件内容 cat /etc/my.cnf | grep -E "server_id|report_host|loose-group_replication_local_address" # 验证ssl禁用 mysql -uroot -p -e "SHOW VARIABLES LIKE '%ssl%';" | grep have_ssl



6.4 创建复制账户(所有节点执行)
# 临时关闭当前会话的二进制日志记录 SET SQL_LOG_BIN=0; # 创建 MGR 专用的复制账号,只允许来自 10.8.0.x 网段的连接 CREATE USER 'repl'@'10.8.0.%' IDENTIFIED BY 'Repl@2026'; # 授予复制权限,节点间同步数据需要 GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.8.0.%'; # 授予连接管理权限,MGR 控制节点连接状态需要 GRANT CONNECTION_ADMIN ON *.* TO 'repl'@'10.8.0.%'; # 授予备份管理权限,分布式恢复(donor 传输数据)需要 GRANT BACKUP_ADMIN ON *.* TO 'repl'@'10.8.0.%'; # MGR 专用权限(MySQL 8.0+),允许该用户参与组复制的事务流 GRANT GROUP_REPLICATION_STREAM ON *.* TO 'repl'@'10.8.0.%'; # 刷新权限表,使授权立即生效 FLUSH PRIVILEGES; # 恢复二进制日志记录,后续操作恢复正常 SET SQL_LOG_BIN=1; # 配置恢复通道凭据,就是告诉 MGR 用这个账号去连接其他节点做数据恢复 CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='Repl@2026'FOR CHANNEL 'group_replication_recovery'; # 修改 repl 用户的密码加密方式,从 MySQL 8.0 默认的强加密算法(caching_sha2_password),改成 MGR 能识别的旧版加密算法(mysql_native_password)。 ALTER USER 'repl'@'10.8.0.%' IDENTIFIED WITH mysql_native_password BY 'Repl@2026';

6.5 安装组复制插件
# 由于 my.cnf 中已配置 plugin_load_add='group_replication.so',通常已自动安装。若提示 Function 'group_replication' already exists 则忽略。 INSTALL PLUGIN group_replication SONAME 'group_replication.so';
![]()
6.6 引导第一个节点(主节点)
# 在主服务器上进行 # 开启引导模式 SET GLOBAL group_replication_bootstrap_group=ON; # 启动 MGR START GROUP_REPLICATION; # 关闭引导模式 SET GLOBAL group_replication_bootstrap_group=OFF; # 检查集群成员: SELECT * FROM performance_schema.replication_group_members;

# 如果已启动但失败,确保停止 STOP GROUP_REPLICATION; # 清空所有二进制日志和 GTID 执行记录 RESET MASTER; # 再次加入集群 START GROUP_REPLICATION; #先清空所有二进制日志和GTID 执行记录,因为之前做过了修改操作

6.7 验证数据同步
# 在 PRIMARY 节点(当前为 mysql1)上执行: CREATE DATABASE arr; USE arr; CREATE TABLE uu (id INT PRIMARY KEY, msg VARCHAR(100)); INSERT INTO uu VALUES (1, 'Hello MGR'); # 登录任意 SECONDARY 节点,查询: SELECT * FROM arr.uu;



7.MySQL MGR 架构管理
7.1 查看集群状态
SELECT * FROM performance_schema.replication_group_members;
输出中 MEMBER_STATUS 列显示各节点状态:ONLINE / OFFLINE / RECOVERING。
7.2 流控监控
当从节点回放速度跟不上主节点写入速度时,MGR 会触发流控机制主动限速主节点,防止从节点落后太多
SHOW STATUS LIKE 'group_replication_flow_control%';
若触发流控导致性能下降,可调大阈值:
SET GLOBAL group_replication_flow_control_certifier_threshold = 50000;
7.3 手动触发故障转移
STOP GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group = ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group = OFF;
7.4 添加/删除节点
- 添加节点:在新节点配置好相同参数后,执行 START GROUP_REPLICATION; 即可自动加入
- 删除节点:在目标节点执行 STOP GROUP_REPLICATION;,集群自动将其移除
部署要点总结:
- 节点数必须为奇数且 ≥ 3,推荐单主模式
- 所有表必须有显式主键
group_replication_group_name全局统一- 引导节点务必关闭
bootstrap_group - 生产前务必压测,确认流控触发阈值
到此这篇关于基于MySQL8.0的MGR 高可用集群部署的文章就介绍到这了,更多相关MySQL8.0 MGR高可用集群部署内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Mysql联合查询UNION和Order by同时使用报错问题的解决办法
很多朋友刚使用联合查询UNION的时候常常会理所当然的将联合查询理解为把没一个子查询的结果集组合成一个大的结果集2014-04-04
Mysql auto_increment 重新计数(让id从1开始)
当清空一个表的时候,重新插入数据,发现auto_increment属性的字段计数不是从1开始的时候,可以使用以下命令2012-12-12
MYSQL 高级文本查询之regexp_like和REGEXP详解
在MySQL中,regexp_like和REGEXP都是用于执行正则表达式搜索的函数,这篇文章主要介绍了MYSQL 高级文本查询之regexp_like和REGEXP,需要的朋友可以参考下2023-05-05


最新评论