MySQL 组复制是什么
MySQL Group Replication(MGR)是 5.7.17 起内置的组复制插件:基于多数派共识协议,事务在组内多数成员确认后才提交,单主模式下主库故障能自动选主并切换。相比传统「主从复制 + 外部中间件编排」,它把共识与故障切换能力内置到了数据库自身。
基本信息
| 适用版本 | MySQL 5.7.17 及以后、8.0(以插件 group_replication 提供) |
|---|---|
| 模式 | 单主(自动选主,推荐)与多主(需应用自己处理写冲突) |
| 确认机制 | 事务需多数派成员确认,少数派分区无法提交 |
| 前置条件 | InnoDB 引擎、GTID 开启、binlog 为 ROW 格式、表需有主键或等效唯一键 |
| 监控方式 | performance_schema.replication_group_members 查看成员与角色 |
| 组通信 | 各成员需配置本机组通信地址(默认 33061,可改) |
典型使用场景
- 需要自动故障切换的写入集群:不再依赖外部选主中间件
- 三节点高可用:容忍单个节点故障且不丢失多数派
- 简化架构:替换「主从复制 + 中间件 + 脚本切主」的组合
- 成员变更自动化:按流程加入或摘除节点,组内自动收敛
- 跨机房部署:按容错要求分布节点,但要接受网络延迟对吞吐的影响
初始化与加入组
初始化与加入组
# 前置检查:GTID、binlog 行格式、主键要求
SHOW VARIABLES LIKE 'gtid_mode'; # 需为 ON
SHOW VARIABLES LIKE 'binlog_format'; # 需为 ROW
SHOW VARIABLES LIKE 'enforce_gtid_consistency'; # 需为 ON
# 第一个节点引导启动组(整个组只做一次)
SET GLOBAL group_replication_bootstrap_group = ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group = OFF;
# 后续节点先指向已运行成员,再启动组复制
SET GLOBAL group_replication_group_seeds = 'host1:33061,host2:33061';
START GROUP_REPLICATION;
# 查看成员状态与角色
SELECT member_host, member_port, member_state, member_role FROM performance_schema.replication_group_members;成员状态读法
| 列 | 含义 | 正常/异常 |
|---|---|---|
| member_state | ONLINE、RECOVERING、ERROR、OFFLINE 等 | 出现 ERROR 要立刻查错误日志,OFFLINE 说明没进组 |
| member_role | PRIMARY 或 SECONDARY | 单主模式下应只有一个 PRIMARY |
| member_host / port | 成员地址与端口 | 与真实拓扑不符说明配置写错 |
| member_id | 成员唯一标识 | 重建或克隆过的实例 id 会变化,需在监控里同步 |
| member_version | 成员数据库版本 | 组内版本差异过大时要按官方版本策略处理 |
MGR 的前置条件比较硬:InnoDB、GTID、binlog ROW 缺一不可,表没有主键会导致写入被拒。部署前按官方文档逐项核对,别在生产上边试边改。
恢复行为要预先设计:成员掉线后是否能自动重新加入、多久算超时被踢出,这些参数决定故障时的收敛速度,也决定运维要不要人工介入。