MySQL MHA高可用配置是企业级数据库架构中保障业务连续性的核心方案之一,尤其适用于对数据一致性、故障恢复速度和运维自动化有严格要求的数据中台、数字孪生系统及实时可视化平台。MHA(Master High Availability)是由日本开发者Yoshinori Matsunobu开发的开源MySQL高可用解决方案,专为解决MySQL主从复制环境下的主节点故障自动切换问题而设计。它不依赖第三方存储或集群中间件,仅通过监控、日志分析和SSH远程控制实现快速故障转移,是轻量级、高性能、低侵入性的理想选择。
MHA由四个关键组件构成,协同工作以实现全自动故障检测与切换:
MHA Manager(管理节点)作为控制中枢,部署在独立服务器上(建议与数据库节点物理隔离),负责监控所有MySQL节点的健康状态。它通过定期连接各节点的MySQL服务、读取二进制日志(binlog)和中继日志(relay log)判断主节点是否宕机。一旦检测到主库异常,Manager将自动执行故障转移流程,包括:
MHA Node(代理节点)部署在每台MySQL服务器上,作为轻量级代理,接收Manager指令,执行如:
MySQL主从复制集群建议采用一主多从结构,至少包含3个节点(1主 + 2从),以确保在主库故障时有足够候选节点进行切换。所有从库必须开启log_slave_updates=ON,确保中继日志被记录,以便MHA在故障后提取差异日志。
SSH密钥认证与网络配置MHA完全依赖SSH进行节点间通信,因此必须在Manager与所有MySQL节点之间配置无密码SSH登录。同时,建议关闭防火墙或开放端口(默认22、3306),确保Manager能实时探测各节点状态。
| 节点角色 | IP地址 | MySQL版本 | 操作系统 |
|---|---|---|---|
| Master | 192.168.1.10 | 8.0.36 | CentOS 7.9 |
| Slave1 | 192.168.1.11 | 8.0.36 | CentOS 7.9 |
| Slave2 | 192.168.1.12 | 8.0.36 | CentOS 7.9 |
| Manager | 192.168.1.20 | - | CentOS 7.9 |
所有节点需安装相同版本MySQL,避免因版本差异导致复制异常。
在Master上启用二进制日志:
[mysqld]server-id = 10log-bin = mysql-binbinlog_format = ROWexpire_logs_days = 7sync_binlog = 1gtid_mode = ONenforce_gtid_consistency = ON在每个Slave上配置:
[mysqld]server-id = 11 # Slave1# 或 server-id = 12 # Slave2log-bin = mysql-binbinlog_format = ROWrelay-log = mysql-relay-binlog-slave-updates = ONgtid_mode = ONenforce_gtid_consistency = ON重启MySQL服务后,在Master上创建复制账户:
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'ReplPass123!';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';FLUSH PRIVILEGES;在Slave上执行CHANGE MASTER:
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。
在Manager节点安装依赖与MHA:
# 安装EPEL源yum install epel-release -y# 安装依赖yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y# 下载MHA Manager和Node(推荐0.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.gztar -zxvf mha4mysql-node-0.58.tar.gzcd mha4mysql-node-0.58perl Makefile.PLmake && make install# 在所有MySQL节点安装Node组件(同上)在Manager节点生成密钥:
ssh-keygen -t rsa -P ""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 "hostname"在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=rootrepl_user=replrepl_password=ReplPass123!ping_interval=2master_binlog_dir=/var/lib/mysqlmaster_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)。
MHA提供示例脚本,建议自定义master_ip_failover用于VIP漂移或DNS切换:
#!/usr/bin/env perluse strict;use warnings FATAL => 'all';my $vip = '192.168.1.200/24';my $key = '1';my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";# 根据新主库IP执行VIP绑定if ($new_master_host eq '192.168.1.11') { system("/usr/bin/ssh root@192.168.1.11 '$ssh_start_vip'");}赋予执行权限:
chmod +x /usr/local/bin/master_ip_failover执行健康检查:
masterha_check_ssh --conf=/etc/mha/app1/app1.cnfmasterha_check_repl --conf=/etc/mha/app1/app1.cnf若输出均为OK,则启动MHA监控:
nohup masterha_manager --conf=/etc/mha/app1/app1.cnf --ignore_last_failover &查看状态:
masterha_check_status --conf=/etc/mha/app1/app1.cnf当主库(192.168.1.10)突然宕机,MHA Manager将在2秒内检测到心跳丢失,触发以下流程:
read_only=OFF,启用写入 CHANGE MASTER指向新主库 report_script通知运维人员整个过程通常在10~30秒内完成,远优于手动切换的数分钟耗时。
在构建实时数据中台时,MySQL常作为元数据、配置库或轻量级事务存储引擎。MHA的快速恢复能力确保了:
相比Galera Cluster或InnoDB Cluster,MHA部署成本更低、运维门槛更小,特别适合中小规模企业或云原生环境中的MySQL实例。
/var/log/mha/app1/manager.log,发现潜在延迟或权限问题 | 对比维度 | MHA | Galera Cluster | MySQL InnoDB Cluster |
|---|---|---|---|
| 部署复杂度 | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 故障恢复时间 | 10–30秒 | 5–15秒 | 20–60秒 |
| 数据一致性 | 强一致(基于binlog) | 强一致 | 强一致 |
| 写入性能 | 无影响 | 降低30% | 中等降低 |
| 成本 | 免费开源 | 高运维成本 | 需MySQL Enterprise |
| 适用场景 | 中小规模、高可用优先 | 多写高并发 | 大型企业、云原生 |
对于追求高可用、低成本、易维护的企业用户,MHA仍是MySQL高可用架构的首选方案。
为实现真正的业务连续性,建议将MHA与应用层连接池(如HikariCP、ProxySQL)结合使用,实现自动重连与读写分离。同时,建议定期备份MySQL配置、MHA脚本和切换日志,确保灾难恢复有据可依。
如需进一步提升数据平台的稳定性与弹性,可考虑结合容器化部署与自动化运维工具链。申请试用&https://www.dtstack.com/?src=bbs 提供企业级数据平台解决方案,支持与MHA无缝集成,助力构建零中断的数据服务架构。
申请试用&https://www.dtstack.com/?src=bbs 可帮助您快速搭建高可用MySQL集群,降低运维复杂度,提升系统可用性至99.99%以上。
申请试用&https://www.dtstack.com/?src=bbs 为数据中台、实时分析与数字孪生项目提供底层数据库高可用保障,让您的业务永不掉线。
申请试用&下载资料