MySQL MHA高可用配置是保障企业核心数据库持续在线、零数据丢失的关键技术方案,尤其适用于数据中台、数字孪生系统等对数据一致性与服务可用性要求极高的场景。MHA(Master High Availability)是一款开源的MySQL高可用管理工具,专为解决主从架构下主库故障自动切换而设计,具备自动故障检测、故障转移、从库数据一致性修复、binlog中继日志同步等核心能力,能够在3~10秒内完成主从切换,极大降低业务中断时间。
MHA由四个核心组件构成:
MHA的核心逻辑是:当Master节点不可达时,Manager会通过SSH连接所有Slave节点,比对各从库的relay log位置,选出拥有最新数据的从库作为新主库,然后将其他从库的binlog差异同步至新主库,最后重新配置复制关系,完成无缝切换。
✅ 关键优势:无需共享存储,不依赖VIP漂移,支持半同步复制,可避免脑裂,保障数据零丢失。
| 组件 | 推荐配置 |
|---|---|
| 操作系统 | CentOS 7.9 / Rocky Linux 9 / Ubuntu 20.04 LTS |
| MySQL版本 | 5.7.x 或 8.0.x(推荐5.7,兼容性更佳) |
| 内存 | 至少4GB(Manager节点建议8GB) |
| 磁盘 | SSD,预留50GB以上空间用于binlog与relay log存储 |
| 网络 | 所有节点间需双向SSH无密码访问,端口3306、22开放 |
在所有节点(包括Manager)执行:
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker若使用CentOS 8+,需启用EPEL源:
dnf install epel-release -y && dnf install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y从官方GitHub下载最新稳定版(v0.58):
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gzwget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz解压并安装Node组件(所有MySQL节点):
tar -xzf mha4mysql-node-0.58.tar.gzcd mha4mysql-node-0.58perl Makefile.PLmake && make install安装Manager组件(仅在监控节点):
tar -xzf mha4mysql-manager-0.58.tar.gzcd mha4mysql-manager-0.58perl Makefile.PLmake && make install💡 提示:若提示缺少模块,使用
cpan install Module::Name安装对应Perl模块。
编辑 /etc/my.cnf:
[mysqld]server-id=10log-bin=mysql-binbinlog_format=rowrelay-log=relay-binrelay-log-index=relay-bin.indexgtid_mode=ONenforce_gtid_consistency=ONlog-slave-updates=1read_only=0重启MySQL:
systemctl restart mysqld创建复制用户:
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'ReplPass123!';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';FLUSH PRIVILEGES;编辑 /etc/my.cnf:
[mysqld]server-id=11 # 12log-bin=mysql-binbinlog_format=rowrelay-log=relay-binrelay-log-index=relay-bin.indexgtid_mode=ONenforce_gtid_consistency=ONlog-slave-updates=1read_only=1重启MySQL后,配置主从:
CHANGE MASTER TO MASTER_HOST='192.168.1.10', MASTER_USER='repl', MASTER_PASSWORD='ReplPass123!', MASTER_AUTO_POSITION=1;START SLAVE;SHOW SLAVE STATUS\G确保 Slave_IO_Running: Yes 与 Slave_SQL_Running: Yes。
✅ 建议部署至少两台从库,一台用于读负载,一台专用于MHA故障切换候选。
在Manager节点创建配置目录:
mkdir -p /etc/mha/app1vim /etc/mha/app1/app1.cnf写入如下配置:
[server default]manager_workdir=/var/log/mha/app1manager_log=/var/log/mha/app1/manager.logremote_workdir=/var/log/mha/app1ssh_user=rootssh_private_key=/root/.ssh/id_rsarepl_user=replrepl_password=ReplPass123!ping_interval=3master_ip_failover_script=/usr/local/bin/master_ip_failovershutdown_script=/usr/local/bin/power_managerreport_script=/usr/local/bin/send_report[server1]hostname=192.168.1.10port=3306candidate_master=1check_repl_delay=0[server2]hostname=192.168.1.11port=3306candidate_master=1check_repl_delay=0[server3]hostname=192.168.1.12port=3306no_master=1⚠️ 注意:
candidate_master=1表示该节点优先成为新主库,check_repl_delay=0表示即使存在延迟也允许切换(生产环境建议设为1,避免数据不一致)。
如需实现VIP自动切换,需编写 master_ip_failover 脚本,绑定浮动IP至新主库。此脚本需具备执行权限:
chmod +x /usr/local/bin/master_ip_failover在Manager节点生成密钥并分发至所有MySQL节点:
ssh-keygen -t rsa -N ""ssh-copy-id root@192.168.1.10ssh-copy-id root@192.168.1.11ssh-copy-id root@192.168.1.12测试连接:
ssh root@192.168.1.10执行健康检查:
masterha_check_ssh --conf=/etc/mha/app1/app1.cnfmasterha_check_repl --conf=/etc/mha/app1/app1.cnf输出应显示 OK,若出现错误,需检查SSH、MySQL权限、网络连通性或GTID设置。
启动MHA Manager:
nohup masterha_manager --conf=/etc/mha/app1/app1.cnf --ignore_last_failover &查看状态:
masterha_check_status --conf=/etc/mha/app1/app1.cnf正常输出应为:
app1 (pid:12345) is running(0:PING_OK), master:192.168.1.10✅ 建议将启动命令加入
/etc/rc.local或使用systemd服务管理,实现开机自启。
在主库执行:
systemctl stop mysqld观察Manager日志:
tail -f /var/log/mha/app1/manager.log日志中将出现:
Sat Apr 20 10:30:12 2024 - [info] Master is down!Sat Apr 20 10:30:15 2024 - [info] New master is 192.168.1.11Sat Apr 20 10:30:20 2024 - [info] Switching master to 192.168.1.11 completed.切换完成后,原从库192.168.1.11自动成为新主库,其余节点重新指向新主库继续复制。
📌 重要:切换后需手动修复原主库,重置为从库,避免数据冲突。
| 项目 | 建议 |
|---|---|
| 监控告警 | 集成Zabbix或Prometheus,监控MHA状态与MySQL延迟 |
| 日志审计 | 定期归档 /var/log/mha/,用于故障回溯 |
| 备份策略 | 每日全备 + binlog增量,使用mysqldump或xtrabackup |
| 网络隔离 | MySQL节点部署在独立VLAN,避免公网暴露 |
| 心跳检测 | 设置 ping_interval=2,提升故障响应速度 |
| 读写分离 | 使用ProxySQL或MaxScale实现自动路由,提升性能 |
| 方案 | 故障恢复时间 | 数据一致性 | 部署复杂度 | 成本 | 适用场景 |
|---|---|---|---|---|---|
| MHA | 3~10秒 | 高(GTID+binlog) | 中 | 免费 | 中小规模、数据中台核心库 |
| MySQL Group Replication | 5~15秒 | 极高(Paxos) | 高 | 免费 | 大型金融系统 |
| Galera Cluster | 1~5秒 | 极高 | 高 | 免费 | 实时多活写入 |
| Keepalived + VIP | 10~30秒 | 低(可能丢数据) | 低 | 免费 | 测试环境、非关键业务 |
MHA在成本、稳定性、易维护性三者间取得最佳平衡,是企业构建MySQL高可用的首选方案。
Q:MHA切换后从库无法同步?A:检查新主库的 show master status 是否与从库的 SHOW SLAVE STATUS 的 Master_Log_File 和 Read_Master_Log_Pos 匹配,手动重置复制。
Q:SSH连接超时?A:在 /etc/ssh/sshd_config 中设置 ClientAliveInterval 30 和 ClientAliveCountMax 3。
Q:Manager进程崩溃?A:使用 systemd 创建服务,设置 Restart=always。
在数据中台、数字孪生等系统中,数据库的稳定性直接决定业务连续性。MHA高可用配置虽非最前沿的方案,但其轻量、可靠、开源、易集成的特性,使其成为众多企业生产环境的基石。通过合理部署MHA,企业可实现99.99%以上的数据库可用性,避免因单点故障导致的数据中断与业务损失。
如需快速部署企业级数据平台,可申请试用&https://www.dtstack.com/?src=bbs,获取专业运维支持与自动化集群管理工具,加速数字化转型进程。如需快速部署企业级数据平台,可申请试用&https://www.dtstack.com/?src=bbs,获取专业运维支持与自动化集群管理工具,加速数字化转型进程。如需快速部署企业级数据平台,可申请试用&https://www.dtstack.com/?src=bbs,获取专业运维支持与自动化集群管理工具,加速数字化转型进程。
申请试用&下载资料