从零搭建企业级 MySQL 高可用集群:Ubuntu 24.04 + InnoDB Cluster + Router + Keepalived(阿里云 ECS 实战)
适用场景:中小企业自建数据库、金融/政务合规要求、学习高可用架构
关键词: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 | 角色 | 用途 |
|---|---|---|---|
db1 | 10.0.1.11 | MySQL 节点 | Group Replication 成员 |
db2 | 10.0.1.12 | MySQL 节点 | Group Replication 成员 |
db3 | 10.0.1.13 | MySQL 节点 | Group Replication 成员 |
router1 | 10.0.1.21 | Router + Keepalived | 应用接入层(主) |
router2 | 10.0.1.22 | Router + 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_id和group_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 BACKUP 和 priority 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 PL1 | 1TB ESSD PL2 | 跨 3 个 AZ |
| Router 节点 | ecs.g7.large (2C8G) | 40GB ESSD PL1 | 无 | 跨 2 个 AZ |
💰 月成本约 ¥5000,比 PolarDB 略低,但需 DBA 运维
📝 注意事项(Ubuntu 24.04 特有)
- 认证插件兼容:通过
default_authentication_plugin = mysql_native_password解决 Router 连接问题 - AppArmor 干扰:若遇权限错误,可临时禁用:
sudo systemctl stop apparmor && sudo systemctl disable apparmor - 网卡名称: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 高可用原理的技术团队。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)