适用场景:中小企业自建数据库、金融/政务合规要求、学习高可用架构
关键词:MySQL 高可用、InnoDB Cluster、Group Replication、MySQL Router、Keepalived、Ubuntu 24.04、阿里云 ECS


💡 为什么不用 PolarDB?为什么要自建?

阿里云 PolarDB 虽然强大,但有些场景下你可能必须自建 MySQL 集群

  • 金融、政务等强合规要求(数据不能上公有云托管)
  • 团队已有 DBA,希望完全掌控数据库
  • 成本敏感,长期运行自建更便宜

本文将手把手教你,在 5 台阿里云 ECS 上,基于 Ubuntu 24.04 LTS,搭建一套 生产级 MySQL 高可用集群,具备:

  • ✅ 自动故障切换(RTO < 30s,RPO = 0)
  • ✅ 读写分离 & 负载均衡
  • ✅ VIP 高可用接入
  • ✅ 全开源、无厂商绑定

🖥️ 一、服务器规划(共 5 台)

主机名内网 IP角色用途
db110.0.1.11MySQL 节点Group Replication 成员
db210.0.1.12MySQL 节点Group Replication 成员
db310.0.1.13MySQL 节点Group Replication 成员
router110.0.1.21Router + Keepalived应用接入层(主)
router210.0.1.22Router + Keepalived应用接入层(备)

🔔 重要原则

  • DB 与 Router 分离部署,避免单点故障
  • 跨可用区部署,防机房级灾难
  • 所有通信走内网,禁止公网暴露数据库

🔧 二、通用前置配置(所有 5 台机器)

1. 设置主机名和 hosts

# 在每台机器上分别执行
sudo hostnamectl set-hostname db1   # db2, db3, router1, router2 依次设置

# 所有机器添加 hosts
cat <<EOF | sudo tee -a /etc/hosts
10.0.1.11 db1
10.0.1.12 db2
10.0.1.13 db3
10.0.1.21 router1
10.0.1.22 router2
EOF

2. 关闭防火墙(生产环境建议配置规则)

sudo ufw disable

3. 安装基础工具 & 同步时间

sudo apt update
sudo apt install -y vim net-tools curl wget chrony
sudo systemctl enable --now chronyd

🗄️ 三、部署 MySQL 8.0(仅 db1/db2/db3)

Ubuntu 24.04 官方仓库已包含 MySQL 8.0+:

sudo apt install -y mysql-server mysql-shell mysql-router

初始化安全设置

sudo mysql_secure_installation
# 设置 root 密码(如 MyPass123!),其余选项全选 Y

创建远程管理用户

sudo mysql -e "
CREATE USER 'root'@'%' IDENTIFIED BY 'MyPass123!';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
"

⚙️ 四、配置 MySQL(关键!)

编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,在 [mysqld] 末尾添加:

📄 db1 配置(10.0.1.11)

server_id = 1
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_checksum = NONE
log_bin = binlog
log_slave_updates = ON
binlog_format = ROW
default_authentication_plugin = mysql_native_password

# Group Replication
plugin_load_add = 'group_replication.so'
transaction_write_set_extraction = XXHASH64
group_replication_group_name = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"  # 用 uuidgen 生成真实 UUID
group_replication_local_address = "10.0.1.11:33061"
group_replication_group_seeds = "10.0.1.11:33061,10.0.1.12:33061,10.0.1.13:33061"
group_replication_single_primary_mode = ON
group_replication_enforce_update_everywhere_checks = OFF
group_replication_bootstrap_group = OFF

⚠️ db2/db3 只需改两处server_idgroup_replication_local_address

重启 MySQL:

sudo systemctl restart mysql

🧪 五、创建 InnoDB Cluster(在 db1 操作)

mysqlsh --uri root@10.0.1.11:3306

执行:

// 1. 配置实例
dba.configureInstance('root@10.0.1.11:3306')
dba.configureInstance('root@10.0.1.12:3306')
dba.configureInstance('root@10.0.1.13:3306')

// 2. 创建集群
var cluster = dba.createCluster('prodCluster', {
    memberWeight: 50,
    autoRejoinTries: 3,
    exitStateAction: 'READ_ONLY'
});

// 3. 添加节点
cluster.addInstance('root@10.0.1.12:3306');
cluster.addInstance('root@10.0.1.13:3306');

// 4. 查看状态
cluster.status();

✅ 成功标志:所有节点 ONLINE,1个 R/W,2个 R/O


🔄 六、部署 MySQL Router(router1/router2)

sudo mysqlrouter --bootstrap root@10.0.1.11:3306 \
  --directory /etc/mysqlrouter \
  --conf-use-gr-notifications \
  --user mysqlrouter
# 输入密码 MyPass123!

sudo systemctl enable --now mysqlrouter
  • 6446:读写端口(自动路由到 Primary)
  • 6447:只读端口(负载均衡到所有 ONLINE 节点)

🛡️ 七、部署 Keepalived(实现 VIP 高可用)

⚠️ 阿里云不支持传统 VIP!需使用 HaVip + Keepalived

安装 Keepalived

sudo apt install -y keepalived

配置(注意网卡名,用 ip a 查看)

router1(主)→ /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass MyPass123!
    }
    virtual_ipaddress {
        10.0.1.100/24
    }
}
router2(备)→ 同上,仅改 state BACKUPpriority 90

启动:

sudo systemctl enable --now keepalived
ip addr show | grep 10.0.1.100  # 验证 VIP

🔔 阿里云操作
控制台 → VPC → HaVip → 创建并绑定到 router1/router2


🧪 八、测试与验证

连接测试

# 写
mysql -h 10.0.1.100 -P 6446 -u root -pMyPass123!
# 读
mysql -h 10.0.1.100 -P 6447 -u root -pMyPass123!

故障切换测试

# 在 db1 上停止 MySQL
sudo systemctl stop mysql
# 等待 20 秒,检查新主是否选举成功
mysqlsh --uri root@10.0.1.12:3306 -e "dba.getCluster().status()"

应用连接 不受影响


📊 九、监控建议(可选)

  • 使用 Prometheus + mysqld_exporter 监控集群状态
  • 告警规则:节点宕机、复制延迟、连接数过高
  • 日志收集:ELK 或 Loki

✅ 十、阿里云 ECS 配置推荐

角色实例规格系统盘数据盘可用区
MySQL 节点ecs.g7.4xlarge (16C64G)100GB ESSD PL11TB ESSD PL2跨 3 个 AZ
Router 节点ecs.g7.large (2C8G)40GB ESSD PL1跨 2 个 AZ

💰 月成本约 ¥5000,比 PolarDB 略低,但需 DBA 运维


📝 注意事项(Ubuntu 24.04 特有)

  1. 认证插件兼容:通过 default_authentication_plugin = mysql_native_password 解决 Router 连接问题
  2. AppArmor 干扰:若遇权限错误,可临时禁用:
    sudo systemctl stop apparmor && sudo systemctl disable apparmor
    
  3. 网卡名称:Ubuntu 24.04 默认为 enpXsY,用 ip a 确认

🎁 附:一键检查脚本

#!/bin/bash
echo "=== Cluster Status ==="
mysqlsh --uri root@10.0.1.11:3306 -e "dba.getCluster().status()"

echo -e "\n=== VIP Status ==="
ip addr show | grep 10.0.1.100

echo -e "\n=== Router Ports ==="
ss -tuln | grep -E '6446|6447'

✅ 总结

通过本文,你已成功搭建了一套 企业级 MySQL 高可用集群,具备:

  • 自动故障转移
  • 读写分离
  • VIP 高可用接入
  • 开源、可控、低成本

适用场景:对数据库有强控制需求的企业,或希望深入理解 MySQL 高可用原理的技术团队。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐