master_ip_failover脚本是MHA实现VIP漂移的强制依赖,必须存在、可执行且路径在配置文件中显式指定;它接收--command=start/stop参数,仅在start阶段绑定VIP,需用ip addr add替代废弃的ifconfig,并确保网卡名一致。

master_ip_failover 脚本必须存在且可执行
MHA本身不内置VIP漂移逻辑,所有IP切换动作都依赖外部脚本 master_ip_failover。这个脚本不是可选配置,而是强制环节——如果它不存在、权限不对、路径没配准,MHA会在切换成功后卡在“Waiting for shutdown script”阶段,新主库无法对外提供服务。
常见错误现象:Failed to get master_ip_failover_script status 或日志里反复出现 Running master_ip_failover script... 但无后续。
- 脚本必须是 Perl 或 Shell 编写(官方示例用 Perl,但 Shell 更易调试)
- 必须赋予执行权限:
chmod +x /usr/local/bin/master_ip_failover - 脚本中硬编码的 VIP、网卡名、绑定/解绑命令要和目标机器实际环境一致(比如 CentOS 7 用
ip addr add,CentOS 6 用ifconfig) - 脚本接收两个参数:
--command=start(升主时绑定VIP)和--command=stop(原主恢复后解绑,或故障前清理)
manager 配置文件里必须显式指定脚本路径
MHA Manager 不会自动查找 master_ip_failover,你得在 /etc/app1.cnf(或你自定义的配置文件)里明确写死路径,否则它就当没这回事。
关键配置项只有一行,漏掉或拼错就失效:master_ip_failover_script=/usr/local/bin/master_ip_failover
- 路径必须绝对完整,不能用
~或相对路径 - 确保 MHA Manager 进程运行用户(如
mha)对该脚本有读+执行权限 - 如果用了 SELinux,还要确认上下文允许执行:
chcon -t bin_t /usr/local/bin/master_ip_failover - 配置改完后必须重启 Manager:
masterha_stop --conf=/etc/app1.cnf再nohup masterha_manager --conf=/etc/app1.cnf &
从库重连新主库靠的是 apply_diff_relay_logs + change master to
MHA 切换完成后,其他从库不会自己“感知”新主是谁——它靠两步完成重定向:先补齐缺失的 relay log(避免数据断层),再执行 CHANGE MASTER TO 指向新主库。
这个过程默认开启,但容易被忽略的点在于:apply_diff_relay_logs 依赖 SSH 免密登录到各从库执行本地操作,且要求 MySQL 用户有 REPLICATION SLAVE 权限。
- 必须确保所有从库的
my.cnf中已设relay_log_recovery=1,否则重启后 relay log 可能损坏 - 如果从库启用了 GTID(MySQL 5.7+ 默认),MHA 会自动用
GTID_SUBSET计算差异,无需手动传 position;但旧版基于 file/pos 的复制,必须保证原主的 binlog 没被 purge - 切换日志里看到
Resetting slave on xxx:3306和All other slaves should start replication from here才算走通这一步
切换后原主恢复成从库要手动介入
MHA 完成一次自动故障转移后,原主库不会自动降级并重新加入复制链——它只是“停在那里”,状态仍是独立实例。如果你不处理,集群就变成 1 主 1 从(少一台),下次故障容灾能力直接归零。
这步没有自动化脚本兜底,必须人工操作:
- 先确认原主库 MySQL 已启动,且网络可达
- 在新主库上执行
SHOW MASTER STATUS,拿到Executed_Gtid_Set(GTID 模式)或File+Position(传统模式) - 登录原主库(现需作为从库),执行
STOP SLAVE; RESET SLAVE ALL;,再CHANGE MASTER TO ...指向新主 - 最后启动复制:
START SLAVE;并检查SHOW SLAVE STATUS\G中两个Running是否为Yes
最容易被跳过的其实是 RESET SLAVE ALL:不加 ALL 会导致旧的 master.info 文件残留,CHANGE MASTER TO 可能静默失败。

















