本文面向希望在生产环境实现 MySQL 高可用的工程团队。我们以 MySQL 8.0 为基线,分别从 Group Replication(MGR)与 InnoDB Cluster 两条路径给出“可验证”的搭建与校验方法,确保每一步都有明确的命令与参数。
## 适用版本与前提
- 支持版本:MySQL 8.0(建议 8.0.22+);InnoDB Cluster 需 MySQL Shell 8.0。
- 必需前提:开启 GTID 与二进制日志,使用行格式。
SHOW VARIABLES LIKE 'gtid_mode';
SHOW VARIABLES LIKE 'enforce_gtid_consistency';
SHOW VARIABLES LIKE 'binlog_format';
-- 如未开启(示例,生产中建议写入 my.cnf 并重启后持久化):
SET PERSIST gtid_mode = 'ON';
SET PERSIST enforce_gtid_consistency = 'ON';
SET PERSIST binlog_format = 'ROW';
- 事务写集提取(MGR 依赖):
SHOW VARIABLES LIKE 'transaction_write_set_extraction';
SET PERSIST transaction_write_set_extraction = 'XXHASH64';
## Group Replication(MGR)单主模式:可复现搭建
1. 创建复制用户(最小权限示例):
CREATE USER 'repl'@'%' IDENTIFIED BY 'S@fePass!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
GRANT BACKUP_ADMIN ON *.* TO 'repl'@'%'; -- 8.0 备份管理权限(部分工具需要)
FLUSH PRIVILEGES;
2. 节点通用参数(写入 my.cnf 或使用 `SET PERSIST`):
SET PERSIST group_replication_group_name = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee';
SET PERSIST group_replication_local_address = '10.0.0.11:33061';
SET PERSIST group_replication_group_seeds = '10.0.0.11:33061,10.0.0.12:33061,10.0.0.13:33061';
SET PERSIST group_replication_single_primary_mode = ON; -- 单主模式
SET PERSIST group_replication_enforce_update_everywhere_checks = OFF;
SET PERSIST group_replication_bootstrap_group = OFF;
3. 启动与加入集群(首节点需引导):
-- 首节点:
SET GLOBAL group_replication_bootstrap_group = ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group = OFF;
-- 其他节点:
START GROUP_REPLICATION;
4. 校验状态:
SELECT * FROM performance_schema.replication_group_members; -- 成员列表
SELECT * FROM performance_schema.replication_group_member_stats; -- 复制延迟与事务统计
SHOW STATUS LIKE 'group_replication%';
5. 故障切换(单主):主节点不可用时,MGR 会自动选举新主。建议业务侧使用虚拟 IP/代理(如 HAProxy)指向当前主。
## Group Replication 多主模式:注意一致性
- 开启多主:
SET PERSIST group_replication_single_primary_mode = OFF;
SET PERSIST group_replication_enforce_update_everywhere_checks = ON;
- 写冲突处理:MGR 基于写集检测冲突,出现冲突时会回滚其中一方事务。务必确保应用幂等或采用冲突避免策略(如分片或主键空间划分)。
## InnoDB Cluster:使用 MySQL Shell 快速构建
1. 前提:各实例已开启 GTID 与 MGR 所需参数,MySQL Shell 连接具备管理员权限。
2. 使用 MySQL Shell:
// 在 MySQL Shell 的 JavaScript 模式下:
var dba = require('dba');
var cluster = dba.createCluster('prodCluster');
cluster.addInstance('[email protected]:3306');
cluster.addInstance('[email protected]:3306');
cluster.addInstance('[email protected]:3306');
cluster.status();
// 切换主节点(单主):
cluster.switchToPrimaryInstance('[email protected]:3306');
3. 校验:
cluster.status(); // 查看成员与角色
## 技术参数与验证命令(8.0)
- `group_replication_group_name`:使用有效 UUID。`SELECT @@group_replication_group_name;`
- `group_replication_local_address`:`host:port` 必须可达,默认端口 33061。
- `group_replication_group_seeds`:所有成员的 `local_address` 列表。
- `group_replication_recovery_get_public_key`:若开启基于 RSA 的自动凭据获取,设置为 `ON`。
- `group_replication_consistency`:读一致性级别,`EVENTUAL`/`BEFORE_ON_PRIMARY_FAILOVER`/`BEFORE`/`AFTER`。
SHOW VARIABLES LIKE 'group_replication_consistency';
SET PERSIST group_replication_consistency = 'BEFORE';
## 监控与故障排查
- 复制延迟:`performance_schema.replication_applier_status_by_worker`。
- 错误日志:`SHOW WARNINGS` 与服务器错误日志(`error.log`)。
- 常见问题:端口未开放、GTID 未开启、二进制日志格式非 ROW、时钟不同步导致认证失败。
## 注意事项
- 生产环境请将参数写入配置文件并重启生效,避免仅使用 `SET PERSIST` 导致重启后不一致。
- 多主模式对应用写入模式要求更高,除非有明确的冲突避免方案,否则建议单主模式。
- InnoDB Cluster 基于 MGR,Shell 提供管理与自动化能力,但底层一致性与限制同 MGR。
## 相关阅读(热门)
- 《MySQL 慢查询诊断与 EXPLAIN ANALYZE 实战指南》
- 《MySQL 索引设计与覆盖索引的可验证实践指南》
- 《MySQL InnoDB 事务与锁的深度解析与最佳实践》
## 结语
高可用不止于“能跑起来”,关键在于参数与行为可验证。以 GTID 与行格式为基础,按步骤启用 MGR 或通过 InnoDB Cluster 管理,并在 `performance_schema` 中持续观测复制健康,才能让故障切换与一致性更可控。

发表评论 取消回复