MySQL 组复制高可用配置教程
MySQL Group Replication(组复制,简称 MGR)是 MySQL 5.7.17 引入的原生高可用方案,基于 Paxos 协议实现多节点之间的数据强一致性。与传统的 主从复制 相比,组复制支持自动故障检测和成员管理,无需额外的中间件即可实现故障自动切换。本文将在搬瓦工 VPS 上演示三节点组复制集群的完整搭建流程。
一、组复制概述
MySQL 组复制提供两种运行模式:
- 单主模式(Single-Primary):组内只有一个节点可以写入,其余节点为只读。主节点故障时自动选举新主。这是推荐的生产模式。
- 多主模式(Multi-Primary):组内所有节点都可以写入,适合写入分散的场景,但需要应用层处理冲突。
组复制要求至少三个节点以形成多数派共识,推荐使用奇数个节点(3、5、7 等)。
二、环境准备
准备三台搬瓦工 VPS,建议选择同一数据中心以降低网络延迟:
- 节点 1:192.168.1.10(将作为引导节点)
- 节点 2:192.168.1.20
- 节点 3:192.168.1.30
在三台服务器上安装 MySQL 8.0:
apt update
apt install mysql-server -y
systemctl start mysql
systemctl enable mysql
确保三台服务器的 3306 端口和 33061 端口(组复制通信端口)互相开放:
ufw allow from 192.168.1.0/24 to any port 3306
ufw allow from 192.168.1.0/24 to any port 33061
三、配置节点 1(引导节点)
3.1 修改配置文件
编辑 /etc/mysql/mysql.conf.d/mysqld.cnf:
[mysqld]
server-id = 1
bind-address = 0.0.0.0
log-bin = mysql-bin
binlog-format = ROW
binlog-checksum = NONE
gtid-mode = ON
enforce-gtid-consistency = ON
# 组复制配置
plugin-load-add = group_replication.so
group_replication_group_name = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
group_replication_start_on_boot = OFF
group_replication_local_address = "192.168.1.10:33061"
group_replication_group_seeds = "192.168.1.10:33061,192.168.1.20:33061,192.168.1.30:33061"
group_replication_bootstrap_group = OFF
# 性能调优
transaction_write_set_extraction = XXHASH64
relay-log = relay-bin
slave-parallel-workers = 4
slave-parallel-type = LOGICAL_CLOCK
group_replication_group_name 是组的唯一标识,使用 UUID 格式,所有节点必须相同。可以用 uuidgen 命令生成。
3.2 重启并创建复制账号
systemctl restart mysql
mysql -u root -p
SET SQL_LOG_BIN=0;
CREATE USER 'repl_user'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
GRANT CONNECTION_ADMIN ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='repl_user', MASTER_PASSWORD='StrongPassword123!' FOR CHANNEL 'group_replication_recovery';
3.3 引导启动组
第一个节点需要引导启动组复制:
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
检查组成员状态:
SELECT * FROM performance_schema.replication_group_members;
此时应看到一个节点处于 ONLINE 状态。
四、配置节点 2 和节点 3
4.1 节点 2 配置
编辑节点 2 的配置文件,主要修改 server-id 和 group_replication_local_address:
[mysqld]
server-id = 2
bind-address = 0.0.0.0
log-bin = mysql-bin
binlog-format = ROW
binlog-checksum = NONE
gtid-mode = ON
enforce-gtid-consistency = ON
plugin-load-add = group_replication.so
group_replication_group_name = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
group_replication_start_on_boot = OFF
group_replication_local_address = "192.168.1.20:33061"
group_replication_group_seeds = "192.168.1.10:33061,192.168.1.20:33061,192.168.1.30:33061"
group_replication_bootstrap_group = OFF
transaction_write_set_extraction = XXHASH64
relay-log = relay-bin
4.2 加入节点到组
在节点 2 和节点 3 上分别执行(记得先创建复制账号):
SET SQL_LOG_BIN=0;
CREATE USER 'repl_user'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
GRANT CONNECTION_ADMIN ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='repl_user', MASTER_PASSWORD='StrongPassword123!' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;
4.3 验证集群状态
在任意节点上查看组成员:
SELECT MEMBER_ID, MEMBER_HOST, MEMBER_PORT, MEMBER_STATE, MEMBER_ROLE
FROM performance_schema.replication_group_members;
正常情况下三个节点都应处于 ONLINE 状态,其中一个 ROLE 为 PRIMARY,其余为 SECONDARY。
五、多主模式配置
如果需要多主模式,在所有节点配置文件中添加:
group_replication_single_primary_mode = OFF
group_replication_enforce_update_everywhere_checks = ON
多主模式的注意事项:
- 所有表必须使用 InnoDB 引擎且有主键。
- 不支持序列化隔离级别(SERIALIZABLE)。
- 可能出现写冲突,需要应用层做好重试机制。
- DDL 操作(ALTER TABLE 等)需要特别小心,建议逐节点执行。
六、故障切换测试
模拟主节点故障,验证自动切换是否正常:
# 在主节点上停止 MySQL
systemctl stop mysql
等待几秒后,在其他节点检查:
SELECT MEMBER_HOST, MEMBER_STATE, MEMBER_ROLE
FROM performance_schema.replication_group_members;
应该看到原主节点消失,另一个节点被自动提升为 PRIMARY。恢复原节点后重新加入组:
systemctl start mysql
mysql -u root -p -e "START GROUP_REPLICATION;"
七、监控与运维
7.1 关键监控指标
# 查看组复制详细状态
SELECT * FROM performance_schema.replication_group_member_stats\G
# 查看应用队列大小
SELECT COUNT_TRANSACTIONS_IN_QUEUE, COUNT_TRANSACTIONS_CHECKED, COUNT_CONFLICTS_DETECTED
FROM performance_schema.replication_group_member_stats;
7.2 流控机制
当某个节点处理速度跟不上时,组复制的流控(Flow Control)会自动限制写入速度:
# 查看流控状态
SHOW GLOBAL STATUS LIKE 'group_replication_flow_control%';
# 调整流控阈值
SET GLOBAL group_replication_flow_control_applier_threshold = 25000;
SET GLOBAL group_replication_flow_control_certifier_threshold = 25000;
八、常见问题
- 节点无法加入组:检查网络连通性(33061 端口)、UUID 是否一致、MySQL 版本是否兼容。
- 数据不一致:确保使用 ROW 格式 binlog、InnoDB 引擎且所有表有主键。
- 性能下降:组复制需要网络通信达成共识,跨数据中心部署延迟较高。搬瓦工同一机房 VPS 延迟通常在 1ms 以内。
- 脑裂问题:保持奇数节点,确保多数派可用。如果只剩不到半数节点,组会进入 ERROR 状态。
总结
MySQL 组复制提供了原生的高可用解决方案,配合 MySQL Router 或 ProxySQL 可以实现透明的读写分离和故障切换。本文演示了在搬瓦工 VPS 上搭建三节点组复制集群的全过程。如果你需要更简单的备份方案,可以参考 Percona XtraBackup 热备份教程。选购搬瓦工 VPS 请查看 全部方案,使用优惠码 NODESEEK2026 享受 6.77% 折扣,通过 bwh81.net 进入官网。