海外服务器数据库高可用方案:MySQL MGR(组复制)三节点集群搭建与故障自动切换

海外服务器数据库高可用方案:MySQL MGR(组复制)三节点集群搭建与故障自动切换

单节点 MySQL 是生产环境最大的单点故障风险——一旦服务器宕机,业务完全中断。MySQL Group Replication(MGR)是 MySQL 官方的高可用解决方案,提供多节点强一致性复制和自动故障切换,是比传统主从复制更可靠的架构。本文在三台香港/海外服务器上搭建 MGR 三节点集群。


一、MGR 与传统主从复制对比

维度传统主从复制MySQL MGR
故障切换需手动切换(停机时间分钟级)自动切换(秒级)
数据一致性异步,主库宕机可能丢数据强一致性(Paxos协议)
脑裂风险存在(网络分区时可能双主)不存在(多数派投票)
节点数要求1主+N从最少3节点(保证多数派)
写入性能高(仅主库写)略低(需组内确认)
配置复杂度中等

二、三节点规划

节点IP(示例)角色服务器位置
node110.0.0.1Primary(默认写节点)香港 VPS 1
node210.0.0.2Secondary香港 VPS 2
node310.0.0.3Secondary美国 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%,同时数据完全自主可控。

Telegram