MHA的masterha_manager启动后立刻退出,根本原因是SSH免密未实现所有节点两两互通,需确保每台机器间ssh秒通、用户有sudo NOPASSWD权限,并验证master_ip_failover脚本正确区分--command=start与stop。

为什么 MHA 的 masterha_manager 启动后立刻退出?
常见现象是日志里只有一行 Started automated(non-interactive) failover. 然后进程消失,没报错也没后续。根本原因通常是 SSH 免密没通透——MHA 不只要求从库能免密连主库,还要求所有节点(包括管理机)之间两两免密互通,尤其是从库 A 要能免密登录从库 B(切换时可能需在新主上拉取 relay log)。
- 检查每台机器执行
ssh -o ConnectTimeout=5 user@other_host date是否都秒回,别只测管理机到各节点 -
masterha_check_ssh工具输出的 “OK” 只代表基础连通,不保证用户权限、shell 类型或~/.bashrc里没exit语句 - 如果用非 root 用户(比如 mysql),确认该用户在所有节点都有
sudo NOPASSWD:/usr/bin/env权限(MHA 内部会调用env获取环境变量)
切换后应用连不上新主库?查 master_ip_failover 脚本是否真生效
MHA 默认不接管 VIP 或修改 DNS,靠用户写的 master_ip_failover 脚本完成 IP 漂移。但脚本里常漏掉关键判断:它会在旧主宕机时被调用两次——一次是“shutdown”阶段(旧主还在,但准备下线),一次是“start”阶段(新主已提升,要绑 IP)。如果脚本没区分 --command=start 和 --command=stop,就可能把 VIP 绑错地方,甚至删掉新主上的 IP。
- 脚本开头必须加
if [ "$1" = "--command=start" ]; then分支,只在 start 阶段执行绑定操作 - 绑定命令别用
ifconfig(已被废弃),改用ip addr add,并确认目标网卡名(如eth0)在所有节点一致 - 测试时手动运行脚本:
./master_ip_failover --command=start --ssh_user=root --orig_master_host=old_ip --new_master_host=new_ip,看是否真绑上
masterha_check_repl 报 “Seconds_Behind_Master: NULL” 怎么办?
这不是复制断了,而是从库的 Seconds_Behind_Master 字段为 NULL,通常因为 SQL 线程没启动、relay log 损坏、或者从库处于 START SLAVE UNTIL 的临时状态。MHA 要求所有从库 SQL 线程必须 RUNNING,且延迟值可读,否则拒绝切换。
- 登录每个从库,执行
SHOW SLAVE STATUS\G,重点看Slave_SQL_Running是否为Yes,Seconds_Behind_Master是否为数字(不是 NULL 或空) - 如果 SQL 线程是
No,先查Seconds_Behind_Master为 NULL 的常见原因是 relay log 文件被手动删除,或磁盘满导致写入失败 - 不要直接
START SLAVE,先用STOP SLAVE; RESET SLAVE;清理状态,再重新CHANGE MASTER TO(确保MASTER_LOG_FILE和MASTER_LOG_POS指向当前主库的最新 binlog 位置)
MHA 切换后,从库的 relay_log 文件名不连续怎么办?
新主升主后,其他从库执行 CHANGE MASTER TO 时,MHA 默认用 Master_Log_File 和 Read_Master_Log_Pos(即 IO 线程读到的位置)来定位,但这可能比 SQL 线程执行的位置落后很多,导致从库跳过部分事务,数据不一致。
- 务必在
masterha_default.conf中设置repl_check_time=10(默认 0),让 MHA 在切换前多等几秒,确保 SQL 线程追平 - 更稳妥的做法是启用
secondary_check_script,用另一条路径(如直连主库查SHOW MASTER STATUS)交叉验证复制位点 - 切换完成后,立刻在所有从库上执行
SELECT MASTER_POS_WAIT('mysql-bin.000001', 123456789),确认它们都追到了新主的同一位置
真正麻烦的不是脚本写错,而是以为切成功了就松口气——MHA 日志里 “Failover succeeded” 只代表流程走完,不代表数据没丢、应用已连上、VIP 没漂错。每次切换后,必须人工验证三件事:新主的 READ_ONLY=OFF、至少一个从库的 Seconds_Behind_Master=0、应用端真实写入成功。


















