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-idgroup_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 进入官网。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。