MHA要求Manager到所有MySQL节点SSH免密,因需无交互执行mysql连接、stop slave等命令,否则自动切换会失败;仅需Manager→节点单向免密,且必须用root用户配置并验证全路径命令执行。

为什么MHA要求Manager到所有MySQL节点SSH免密
MHA Manager必须能无交互执行远程命令,比如mysql连接、stop slave、reset master、调用save_binary_logs等。任何需要输密码的环节都会导致自动切换失败或卡死在等待输入状态。
只配Manager→节点单向免密,别搞错方向
常见错误是误以为要“所有节点互相免密”,其实MHA只要求mha_manager节点能免密登录到每个MySQL节点(包括master和slaves),反向(MySQL节点登录Manager)完全不需要。不配反向,能省掉一半密钥分发和权限风险。
- 在Manager节点生成密钥:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa - 逐个推送公钥到MySQL节点(注意是root用户,除非你明确用其他用户运行MHA):
ssh-copy-id root@192.168.4.51、ssh-copy-id root@192.168.4.52、ssh-copy-id root@192.168.4.53 - 测试连通性时,命令里必须带
root@前缀,例如:ssh root@192.168.4.51 "hostname"—— 如果省略root@,可能默认走当前用户名,导致测试通过但MHA实际运行失败
免密账号 ≠ MySQL账号,别混淆SSH用户和数据库用户
“免密管理账号”这个词容易误导:它指SSH层面的免密登录身份(通常是root),不是MySQL里的repl或mha账号。这两个账号职责完全不同:
- SSH免密账号(如
root):用于执行系统命令、读取日志、启停服务、调用MHA Node工具 - MySQL管理账号(如
mha@'192.168.4.%'):仅用于MHA内部连接MySQL执行SQL,需有REPLICATION CLIENT、SUPER、REPLICATION SLAVE等权限,且必须在my.cnf的[server]段配置好user和password供MHA读取
如果SSH免密用了非root用户(比如mhauser),那该用户必须有/var/lib/mysql读写权限、能执行mysql命令、且sudo免密执行systemctl restart mysqld(如果启用了shutdown_script)—— 实际上远比直接用root麻烦,不推荐。
验证免密是否真生效,别只信ssh命令成功
光用ssh root@host "hostname"返回成功还不够。MHA真正调用的是带完整路径的命令,且常含重定向和后台作业。最贴近真实场景的验证方式是:
-
ssh root@192.168.4.51 "mysql -e 'SELECT 1' 2>/dev/null"—— 检查MySQL客户端能否静默执行 -
ssh root@192.168.4.51 "test -f /usr/bin/apply_diff_relay_logs && echo ok"—— 确认MHA Node工具已安装并可访问 - 在Manager上运行:
masterha_check_ssh --conf=/etc/mha/app1.cnf,它会模拟MHA实际调用方式做全链路检测
很多故障发生在脚本里用了~路径或$HOME变量,而SSH非交互式登录时这些变量未展开 —— 所以所有路径尽量写绝对路径,比如/usr/bin/mysql而非mysql。


















