海外服务器数据库高可用方案:MySQL MGR(组复制)三节点集群搭建与故障自动切换
单节点 MySQL 是生产环境最大的单点故障风险——一旦服务器宕机,业务完全中断。MySQL Group Replication(MGR)是 MySQL 官方的高可用解决方案,提供多节点强一致性复制和自动故障切换,是比传统主从复制更可靠的架构。本文在三台香港/海外服务器上搭建 MGR 三节点集群。
一、MGR 与传统主从复制对比
| 维度 | 传统主从复制 | MySQL MGR |
|---|---|---|
| 故障切换 | 需手动切换(停机时间分钟级) | 自动切换(秒级) |
| 数据一致性 | 异步,主库宕机可能丢数据 | 强一致性(Paxos协议) |
| 脑裂风险 | 存在(网络分区时可能双主) | 不存在(多数派投票) |
| 节点数要求 | 1主+N从 | 最少3节点(保证多数派) |
| 写入性能 | 高(仅主库写) | 略低(需组内确认) |
| 配置复杂度 | 低 | 中等 |
二、三节点规划
| 节点 | IP(示例) | 角色 | 服务器位置 |
|---|---|---|---|
| node1 | 10.0.0.1 | Primary(默认写节点) | 香港 VPS 1 |
| node2 | 10.0.0.2 | Secondary | 香港 VPS 2 |
| node3 | 10.0.0.3 | Secondary | 美国 VPS |
三、三节点 MySQL 配置(每台服务器执行)
<code"># 安装 MySQL 8.0 apt update && apt install -y mysql-server mysql --version # 确认 8.0.x
<code"># /etc/mysql/mysql.conf.d/mgr.cnf(三台服务器配置,server_id 各不同) [mysqld] # ── 每台服务器的唯一 ID(node1=1, node2=2, node3=3)── server_id = 1 bind-address = 0.0.0.0 # ── GTID 必须启用(MGR 依赖)── gtid_mode = ON enforce_gtid_consistency = ON # ── 二进制日志配置 ── log_bin = mysql-bin log_replica_updates = ON binlog_format = ROW binlog_checksum = NONE # ── MGR 核心参数 ── plugin_load_add = 'group_replication.so' group_replication_group_name = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" # 随机 UUID group_replication_start_on_boot = OFF # 手动启动(首次配置后改为ON) group_replication_local_address = "10.0.0.1:33061" # 改为本机 IP group_replication_group_seeds = "10.0.0.1:33061,10.0.0.2:33061,10.0.0.3:33061" group_replication_bootstrap_group = OFF group_replication_single_primary_mode = ON # 单主模式(推荐) group_replication_enforce_update_everywhere_checks = OFF # ── 性能优化 ── innodb_buffer_pool_size = 4G max_connections = 300
四、初始化集群(仅在 node1 执行)
<code"># 在 node1 上初始化 MGR
mysql -uroot -p << 'EOF'
-- 创建复制用户(三台服务器都需要)
CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPass123' REQUIRE SSL;
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
GRANT BACKUP_ADMIN ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
-- 配置复制通道
CHANGE REPLICATION SOURCE TO
SOURCE_USER='repl',
SOURCE_PASSWORD='ReplPass123'
FOR CHANNEL 'group_replication_recovery';
-- 引导启动集群(仅 node1 首次执行)
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
-- 验证集群成员
SELECT * FROM performance_schema.replication_group_members\G
EOF五、node2 和 node3 加入集群
<code"># 在 node2 和 node3 上分别执行:
mysql -uroot -p << 'EOF'
CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPass123' REQUIRE SSL;
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
GRANT BACKUP_ADMIN ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
CHANGE REPLICATION SOURCE TO
SOURCE_USER='repl',
SOURCE_PASSWORD='ReplPass123'
FOR CHANNEL 'group_replication_recovery';
-- 加入已有集群(不使用 bootstrap)
START GROUP_REPLICATION;
EOF
# 验证三节点均已加入
mysql -e "SELECT MEMBER_HOST, MEMBER_STATE, MEMBER_ROLE
FROM performance_schema.replication_group_members;"六、部署 MySQL Router(自动路由)
<code"># MySQL Router 自动将写流量路由到 Primary,读流量负载均衡到所有节点 apt install -y mysql-router # 配置 Router mysqlrouter --bootstrap root@10.0.0.1:3306 \ --user=mysqlrouter \ --directory=/etc/mysqlrouter # 启动 Router systemctl enable --now mysqlrouter # 应用程序连接到 Router(而非直接连 MySQL): # 写操作:127.0.0.1:6446 # 读操作:127.0.0.1:6447(自动负载均衡到所有节点)
七、模拟故障切换测试
<code"># 查看当前 Primary mysql -h 127.0.0.1 -P 6446 -uroot -p -e \ "SELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members WHERE MEMBER_ROLE='PRIMARY';" # 模拟 Primary 故障(停止 node1 的 MySQL) # 在 node1 执行: systemctl stop mysql # 在 node2 观察(约5秒内完成自动切换) watch -n 2 'mysql -e "SELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members;"' # 切换完成后,node2 或 node3 自动成为新 Primary # Router 自动感知变化,无需重启应用
八、集群状态监控
<code"># 综合健康检查脚本
cat > /usr/local/bin/mgr-health.sh << 'EOF'
#!/bin/bash
echo "=== MGR 集群状态 $(date) ==="
mysql -h 127.0.0.1 -P 6446 -uroot -p"$MYSQL_ROOT_PASSWORD" -e "
SELECT
MEMBER_HOST,
MEMBER_PORT,
MEMBER_STATE,
MEMBER_ROLE,
MEMBER_VERSION
FROM performance_schema.replication_group_members
ORDER BY MEMBER_ROLE DESC;
"
echo "=== 主库信息 ==="
mysql -h 127.0.0.1 -P 6446 -uroot -p"$MYSQL_ROOT_PASSWORD" -e "
SHOW GLOBAL STATUS LIKE 'group_replication%';
" | grep -E "primary|transactions"
EOF
chmod +x /usr/local/bin/mgr-health.sh九、总结
MySQL MGR 三节点集群将数据库从单点故障风险中彻底解放出来,自动故障切换时间通常在 5~15 秒内完成,对业务几乎无感知。三台香港/海外 VPS 组成的 MGR 集群月费约 ¥600~900,比购买云数据库 RDS 高可用版本(通常 ¥1500+/月)节省成本约 40~50%,同时数据完全自主可控。