mysql如何配置MHA实现高可用切换_主从环境脚本配置与节点监控

陌辰吖_1176

陌辰吖_1176

2026-05-24

1008人浏览

原创

MHA并非开箱即用,必须先确保主从复制稳定、SSH双向免密互通、权限与日志配置合规,否则masterha_check_repl和masterha_check_ssh将直接失败,阻塞全部后续操作。

mysql如何配置mha实现高可用切换_主从环境脚本配置与节点监控

MHA 不是开箱即用的“一键高可用”,必须先确保主从复制稳定、SSH 互通、权限和日志配置到位,否则 masterha_check_repl 和 masterha_check_ssh 会直接失败,后续所有操作都卡住。

主从复制必须满足 MHA 的硬性前提

MHA 对底层复制有明确要求:必须启用 log_bin、relay_log,且所有节点 server_id 唯一;从库必须开启 read_only=1(仅允许 SQL 线程写入),但 super_read_only=0(否则 MHA 提升时无法执行 RESET SLAVE 等操作)。

常见错误现象:masterha_check_repl 报错 “Slave is not running” 或 “Seconds_Behind_Master is NULL”,本质是 IO/SQL 线程没起来,或 relay_log_recovery=1 导致启动失败。

  • 检查复制状态统一用 SHOW SLAVE STATUS\G,重点关注 Slave_IO_Running、Slave_SQL_Running、Seconds_Behind_Master 三项
  • MySQL 5.7+ 必须关闭 enforce_gtid_consistency=OFF(除非你明确使用 GTID 复制并已配置 gtid_mode=ON)
  • 推荐在主库上启用 binlog_format=ROW,避免语句级复制在故障切换时产生不一致

SSH 免密必须双向、无密码、无交互

MHA Manager 节点要能免密登录所有 MySQL 节点,反过来,每个 MySQL 节点也必须能免密登录其他所有节点(包括自己),因为 save_binary_logs 脚本依赖本地 scp 和远程 mysqlbinlog 调用。

容易踩的坑:ssh-copy-id 成功不代表真正可用——比如 sshd 配置了 PermitRootLogin without-password 但未放开 PubkeyAuthentication yes,或者 SELinux 拦截了 ~/.ssh 目录访问。

  • 验证方式:在 Manager 上执行 ssh root@db251 date、ssh root@db253 date、ssh root@db254 date,再分别登录各节点执行 ssh root@db250 date 等反向命令
  • 必须禁用 StrictHostKeyChecking:在 /root/.ssh/config 中添加 StrictHostKeyChecking no,否则 masterha_check_ssh 会卡在首次连接确认
  • 所有节点的 /root/.ssh/authorized_keys 文件权限必须是 600,目录权限 700,否则 sshd 拒绝认证

mha.cnf 配置里最容易被忽略的三个参数

不是把 IP 和用户填进去就完事。[server default] 下的几个参数决定 MHA 是否真能安全切换,尤其在半同步或延迟敏感场景下。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

典型错误:masterha_master_switch 执行后卡住,或切换后从库报错 “The slave I/O thread stops because master and slave have equal MySQL server ids”,其实是 candidate_master=1 和 check_repl_delay=0 配合不当导致。

  • candidate_master=1:仅加在你希望优先当选的从库段(如备主库),但必须配合 check_repl_delay=0,否则延迟 > 1 秒的节点会被跳过——而生产环境从库偶尔延迟是常态
  • ping_interval=3:默认 3 秒探测一次 master,太短易误判,太长故障发现慢;建议结合心跳表或 masterha_master_monitor 定时任务综合判断
  • secondary_check_script:强烈建议配置,例如 masterha_secondary_check -s db253 -s db254 --user=root --master_host=db251 --master_port=3306,避免单点网络抖动引发误切

监控脚本不能只靠 masterha_check_status

masterha_check_status 只告诉你 MHA Manager 进程是否在跑,不反映复制延迟、磁盘空间、binlog 是否可读等真实风险。线上出问题往往不是 Manager 挂了,而是 save_binary_logs 失败或 relay log 应用卡住。

真正有效的监控必须组合落地:

  • 每 30 秒执行一次 masterha_check_repl --conf=/etc/mha/mha.cnf 2>&1 | grep -q "MySQL Replication Health is OK",失败则告警
  • 定期检查各从库的 Relay_Log_Space(SHOW SLAVE STATUS 输出),突增说明 SQL 线程积压,可能即将 OOM
  • 在主库部署定时任务,用 mysqlbinlog --base64-output=decode-rows -v 抽样解析最新 binlog,验证日志格式是否损坏(尤其主库磁盘异常后)

最常被忽略的一点:MHA 自身不提供持久化状态存储,masterha_manager 进程退出后,所有 failover 记录丢失。必须配合外部日志收集(如 journalctl -u mha-manager)或自定义钩子脚本写入数据库归档,否则无法回溯“为什么切了”“切到了哪”。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2393

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1439

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

855

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3352

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5748

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1239

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

6011

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

5222

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6994

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 192人学习