MySQL MHA高可用配置是企业级数据库架构中保障业务连续性的核心手段之一。尤其在数据中台、数字孪生和数字可视化系统中,MySQL作为主流的关系型数据库,其稳定性直接影响数据采集、处理与展示的时效性与准确性。一旦主库宕机,若无自动故障转移机制,将导致数据写入中断、报表延迟、实时大屏冻结等严重后果。MHA(Master High Availability)作为开源的MySQL高可用解决方案,能够在主节点异常时实现秒级自动切换,最大限度减少服务中断时间。
MHA由四个关键组件构成,协同工作实现自动化故障检测与恢复:
📌 架构建议:MHA Manager应部署在与MySQL节点物理隔离的第三方服务器上,避免“共用故障域”。推荐使用独立的Linux服务器(如CentOS 7/8或Rocky Linux),避免与数据库共用资源。
| 节点类型 | IP地址 | 角色 | 操作系统 |
|---|---|---|---|
| Master | 192.168.1.10 | 主库(写入) | CentOS 8 |
| Slave1 | 192.168.1.11 | 从库(候选主) | CentOS 8 |
| Slave2 | 192.168.1.12 | 从库(只读) | CentOS 8 |
| Manager | 192.168.1.20 | MHA监控节点 | CentOS 8 |
3306(MySQL)、22(SSH)、9090(可选MHA监控端口)ssh-keygen -t rsa -b 2048ssh-copy-id root@192.168.1.10ssh-copy-id root@192.168.1.11ssh-copy-id root@192.168.1.12在Master节点执行:
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'ReplPass123!';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';FLUSH PRIVILEGES;修改Master的my.cnf:
[mysqld]server-id = 10log-bin = mysql-binbinlog_format = ROWrelay-log = mysql-relay-binlog-slave-updates = 1read-only = 0重启MySQL服务:
systemctl restart mysqld在Slave节点配置:
[mysqld]server-id = 11 # Slave1# 或 server-id = 12 # Slave2log-bin = mysql-binbinlog_format = ROWrelay-log = mysql-relay-binlog-slave-updates = 1read-only = 1在Slave上执行复制命令(需从Master获取binlog位置):
CHANGE MASTER TO MASTER_HOST='192.168.1.10', MASTER_USER='repl', MASTER_PASSWORD='ReplPass123!', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;START SLAVE;SHOW SLAVE STATUS\G✅ 验证复制状态:
Slave_IO_Running: Yes和Slave_SQL_Running: Yes必须同时为Yes。
在Manager节点安装依赖与MHA:
# 安装EPEL源dnf install epel-release -y# 安装Perl依赖dnf install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y# 下载MHA Node与Manager(推荐0.58版本)wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.noarch.rpmwget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.noarch.rpmrpm -ivh mha4mysql-node-0.58-0.el7.noarch.rpmrpm -ivh mha4mysql-manager-0.58-0.el7.noarch.rpm⚠️ 注意:MHA对Perl版本敏感,建议使用系统默认Perl,避免使用第三方编译版本。
在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=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表示即使从库有延迟也允许提升,适用于对延迟容忍度低的业务场景。
创建IP漂移脚本 /usr/local/bin/master_ip_failover:
#!/usr/bin/env perluse strict;use warnings FATAL => 'all';use Getopt::Long;my $vip = '192.168.1.100/24';my $key = '1';my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";my $orig_master_host = '';my $new_master_host = '';GetOptions( 'orig_master_host=s' => \$orig_master_host, 'new_master_host=s' => \$new_master_host,);if (!$orig_master_host) { exit 1;}if ($new_master_host) { # 启用VIP到新主库 system("/usr/bin/ssh root@$new_master_host \"$ssh_start_vip\"") == 0 or warn "Failed to start VIP on $new_master_host\n";} else { # 停止原主库VIP system("/usr/bin/ssh root@$orig_master_host \"$ssh_stop_vip\"") == 0 or warn "Failed to stop VIP on $orig_master_host\n";}exit 0;赋予执行权限:
chmod +x /usr/local/bin/master_ip_failover✅ 此脚本通过SSH在新主库绑定虚拟IP(VIP),客户端通过VIP连接数据库,实现无缝切换。客户端无需修改连接地址。
在Manager节点执行健康检查:
masterha_check_ssh --conf=/etc/mha/app1/app1.cnfmasterha_check_repl --conf=/etc/mha/app1/app1.cnf输出应显示:
OKAll slaves reading relay-log from masterNo replication lagnohup masterha_manager --conf=/etc/mha/app1/app1.cnf --ignore_last_failover > /var/log/mha/app1/manager.log 2>&1 &启动后可通过以下命令查看状态:
masterha_check_status --conf=/etc/mha/app1/app1.cnf✅ 正常输出:
app1 (pid:12345) is running(0:PING_OK), master:192.168.1.10
手动关闭Master节点的MySQL服务:
systemctl stop mysqld观察Manager日志:
tail -f /var/log/mha/app1/manager.log您将看到如下流程:
整个过程通常在 10~20秒内完成,业务连接几乎无感知。
在数字孪生场景中,传感器数据、IoT设备上报、实时仿真模型均依赖数据库的持续写入能力。MHA的秒级切换特性,确保了:
相比主从手动切换(平均耗时5~15分钟),MHA将RTO(恢复时间目标)压缩至10秒内,满足金融级SLA要求。
📌 MHA不支持多主架构,因此不适合写入压力极高的场景。若需多写入节点,建议结合ProxySQL + Galera Cluster。
| 问题 | 解决方案 |
|---|---|
Can't connect to MySQL server | 检查SELinux是否关闭:setenforce 0,并确认防火墙放行3306 |
Failed to get master binlog position | 确保Slave的SHOW SLAVE STATUS中Master_Log_File与Read_Master_Log_Pos非空 |
| VIP无法漂移 | 检查脚本权限、SSH密钥、网络接口名称(eth0 vs ens33) |
| Manager无法启动 | 检查Perl模块是否完整安装,使用perl -MDBD::mysql -e 'print "OK\n"'验证 |
| 维度 | 传统方案 | MHA方案 |
|---|---|---|
| 故障恢复时间 | 5~30分钟 | 10~20秒 |
| 数据一致性 | 可能丢失事务 | 100%保证 |
| 配置复杂度 | 中等 | 高(需脚本) |
| 成本 | 低(开源) | 低(开源) |
| 适用场景 | 小型系统 | 中大型数据平台 |
MHA是当前成本最低、效果最显著的MySQL高可用方案之一,尤其适合预算有限但对稳定性要求极高的企业。对于正在构建数据中台、数字孪生平台的团队,部署MHA是保障数据服务连续性的必选项。
申请试用&https://www.dtstack.com/?src=bbs申请试用&https://www.dtstack.com/?src=bbs申请试用&https://www.dtstack.com/?src=bbs
MHA虽为传统方案,但其设计理念——自动化、最小化中断、数据零丢失——至今仍具有极强的工程参考价值。在数字化转型浪潮中,稳定的数据底座,是所有智能应用的基石。
申请试用&下载资料