masterha_manager启动即退出,90%是SSH互信未通透:要求所有节点(含Manager自身、主库、各从库)两两免密互通,需逐台执行ssh -o ConnectTimeout=5 mysql@other_host date验证全部组合,并确认sudo NOPASSWD:/usr/bin/env权限及~/.bashrc无exit语句。

masterha_manager启动即退出,90%是SSH互信没跑通
这不是网络不通,而是MHA要求所有节点(包括Manager自身、主库、每个从库)之间两两SSH免密互通——它会在切换过程中调用scp拉取relay log、用mysqlbinlog解析binlog、甚至在从库A上ssh到从库B执行env。任一链路卡住,进程就静默退出。
别信masterha_check_ssh输出的“OK”:它只测了基础连通性,不校验sudo NOPASSWD:/usr/bin/env权限,也不管~/.bashrc里有没有exit语句。
- 逐台登录每台MySQL节点,执行
ssh -o ConnectTimeout=5 mysql@other_host date,覆盖所有组合:manager→master、manager→slave1、slave1→slave2、slave2→manager、甚至ssh localhost date - 非root用户(如
mysql)运行时,确认/etc/sudoers含mysql ALL=(ALL) NOPASSWD: /usr/bin/env - 检查
~/.ssh/authorized_keys权限是否为600、目录~/.ssh是否为700;SELinux启用时需setsebool -P ssh_sysadm_login on
save_binary_logs失败但日志只写“Could not save binary logs”
这表示MHA尝试在原主库上执行save_binary_logs --command=save时SSH失败,不是MySQL挂了,而是根本连不上。常见于原主库mysqld已死但sshd还活着,此时ssh mysql@old_master date能通,但ssh mysql@old_master 'mysqlbinlog ...'因环境变量缺失而失败——因为MHA依赖env获取PATH等变量。
- 手动模拟MHA行为:
ssh mysql@old_master '/usr/bin/env mysqlbinlog --base64-output=decode-rows --verbose /var/lib/mysql/mysql-bin.000001 | head -20' - 若报
command not found,说明env没返回正确PATH,检查sudo -u mysql /usr/bin/env输出,并确保/etc/sudoers中该用户有NOPASSWD执行env权限 - 若报
Permission denied (publickey),不是密钥问题,而是sshd_config里PermitRootLogin或PubkeyAuthentication被禁用
切换卡在“Waiting for shutdown of MySQL”后超时
这个阶段MHA正尝试SSH到原主库执行shutdown_script(如有配置)或直接mysqladmin shutdown。如果SSH连得上但命令不返回,大概率是shell卡在交互环节——比如~/.bashrc末尾有exit,导致非交互式ssh session立即终止,后续命令全丢弃。
- 在所有节点检查
~/.bashrc和~/.profile,删掉任何exit、return或read语句 - 验证方式:
ssh mysql@host 'echo hello; bash -c "echo world"',应输出hello和world;若只输出hello,说明shell提前退出 - 强制禁用shell初始化:
ssh -o RequestTTY=no -o StrictHostKeyChecking=no mysql@host 'mysqladmin -u root shutdown'
master_ip_failover脚本绑错VIP,新主没IP
MHA调用master_ip_failover不止一次:先以--command=stop通知旧主释放VIP,再以--command=start通知新主绑定VIP。脚本若没区分这两者,可能把VIP绑到宕机节点,或在新主上重复执行ip addr add失败却不报错。
- 脚本开头必须有明确分支:
if [ "$1" = "--command=start" ]; then才执行ip addr add 192.168.4.50/24 dev eth0 - 别用
ifconfig(已被废弃),且网卡名必须统一(不能有的用ens33,有的用eth0) - 手动测试:
./master_ip_failover --command=start --new_master_host=192.168.4.90,然后立刻ip addr show eth0确认VIP出现
真实环境里最麻烦的从来不是某条命令写错,而是SSH互信表面通了,但env权限缺了、bashrc里藏了个exit、或者网卡名不一致导致VIP根本没绑上去——这些细节不会报错,只会让MHA在某个环节静默卡死。











