1. 为什么你需要MHA集群我第一次接触MHA集群是在2015年当时公司的核心业务数据库频繁出现单点故障。每次主库宕机运维团队都要半夜爬起来手动切换从库不仅耗时耗力还经常因为操作失误导致数据不一致。直到我们引入了MHA才真正实现了MySQL的高可用。MHAMaster High Availability是专门为MySQL设计的高可用解决方案。它的核心价值在于当主库发生故障时能够在30秒内自动完成故障检测和主从切换整个过程对应用几乎透明。我见过太多团队因为忽视高可用设计导致业务中断和数据丢失的案例。如果你正在运行MySQL且业务对数据库可用性有要求MHA绝对值得投入时间学习。2. 环境准备那些容易被忽略的细节2.1 服务器规划在我的实战经验中90%的MHA部署问题都源于环境准备不充分。下面这个表格是我总结的生产环境推荐配置角色数量推荐配置必须安装的组件MySQL Master14核8GSSD磁盘MySQL, MHA NodeMySQL Slave≥24核8GSSD磁盘MySQL, MHA NodeMHA Manager12核4GMHA Manager, MHA Node虚拟IP (VIP)1与MySQL同网段-注意Manager节点可以部署在从库上但生产环境建议独立部署。我曾遇到过因为Manager和MySQL混部导致资源争用的问题。2.2 时间同步血泪教训时间不同步会导致主从数据严重不一致。我建议使用chrony代替ntp它更精准且易于配置# 所有节点执行 yum install -y chrony systemctl enable chronyd systemctl start chronyd # 主节点额外配置 sed -i s/^server.*/server ntp.aliyun.com iburst/ /etc/chrony.conf systemctl restart chronyd # 从节点同步主节点 chronyc sources -v记得配置crontab定期检查时间偏移量我遇到过因为时间漂移导致GTID复制中断的案例。2.3 SSH互信安全与便利的平衡全互通SSH免密是MHA的基础要求但直接使用root账户存在安全隐患。我的做法是创建专用mha用户配置sudo权限允许执行必要的网络命令使用ssh-copy-id -i指定公钥文件# 在所有节点执行 useradd mha echo mha ALL(ALL) NOPASSWD: /sbin/ifconfig,/usr/sbin/arping /etc/sudoers # 在Manager节点生成密钥对 su - mha ssh-keygen -t rsa ssh-copy-id mhamaster ssh-copy-id mhaslave1 ssh-copy-id mhaslave23. MySQL主从配置避开那些坑3.1 必须开启的配置项很多教程只教如何配置主从却不解释每个参数的意义。以下是我的必备配置清单# master的my.cnf [mysqld] server-id 1 log-bin mysql-bin binlog_format ROW binlog_row_image FULL sync_binlog 1 gtid_mode ON enforce_gtid_consistency ON binlog_group_commit_sync_delay 100 binlog_group_commit_sync_no_delay_count 10 # slave的my.cnf [mysqld] server-id 2 # 必须唯一 log-bin mysql-bin log_slave_updates ON read_only ON gtid_mode ON enforce_gtid_consistency ON slave_parallel_workers 4 slave_parallel_type LOGICAL_CLOCK特别提醒binlog_format一定要用ROW曾经因为使用MIXED格式导致数据不一致排查了整整两天。3.2 主从搭建实战配置完my.cnf后按照这个流程操作-- 在主库创建复制账号 CREATE USER repl% IDENTIFIED BY ComplexPwd123!; GRANT REPLICATION SLAVE ON *.* TO repl%; -- 查看主库状态 SHOW MASTER STATUS\G -- 在从库配置主从复制 CHANGE MASTER TO MASTER_HOSTmaster_ip, MASTER_USERrepl, MASTER_PASSWORDComplexPwd123!, MASTER_AUTO_POSITION1; START SLAVE;验证复制状态时不仅要看Slave_IO_Running和Slave_SQL_Running还要检查Seconds_Behind_Master。我曾遇到线程显示正常但实际延迟数小时的情况。4. MHA组件安装与配置4.1 安装的正确姿势官方推荐源码安装但实际使用中我更推荐用yum# 所有节点安装epel和依赖 yum install -y epel-release yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager # Node节点安装 yum install -y mha4mysql-node # Manager节点额外安装 yum install -y mha4mysql-manager遇到perl模块缺失时可以用cpanm快速安装yum install -y perl-App-cpanminus cpanm Module::Name4.2 关键配置文件详解/etc/masterha/app1.cnf是核心配置文件这是我的生产配置[server default] usermha passwordMhaPwd123! manager_workdir/var/log/masterha/app1 manager_log/var/log/masterha/app1/manager.log master_binlog_dir/var/lib/mysql master_ip_failover_script/usr/local/bin/master_ip_failover ping_interval1 remote_workdir/tmp repl_userrepl repl_passwordReplPwd123! ssh_usermha report_script/usr/local/bin/send_report [server1] hostnamemaster_ip port3306 [server2] hostnameslave1_ip port3306 candidate_master1 [server3] hostnameslave2_ip port3306 no_master1几个容易出错的点master_binlog_dir必须与实际路径一致candidate_master1表示优先提升该从库为主库no_master1表示该从库永远不会被提升为主库4.3 VIP管理脚本优化官方提供的master_ip_failover脚本需要根据实际网络环境修改。这是我的优化版本my $vip 192.168.1.100; my $ifdev eth0; my $key 1; my $ssh_start_vip sudo /sbin/ifconfig $ifdev:$key $vip/24 up sudo /usr/sbin/arping -q -c 3 -A -I $ifdev $vip; my $ssh_stop_vip sudo /sbin/ifconfig $ifdev:$key down;增加了arping广播可以避免交换机MAC表更新延迟导致的应用连接问题。5. 故障模拟与日常运维5.1 完整的测试流程不要直接kill主库正确的测试步骤应该是启动MHA监控nohup masterha_manager --conf/etc/masterha/app1.cnf /var/log/masterha/app1/manager.log 21 检查状态masterha_check_status --conf/etc/masterha/app1.cnf模拟主库宕机优雅方式# 在主库执行 systemctl stop mysqld观察日志tail -f /var/log/masterha/app1/manager.log验证VIP漂移和写操作是否正常5.2 常见故障处理场景1SSH连接失败检查/var/log/secure通常是SELinux或防火墙导致。我的快速解决方案setenforce 0 systemctl stop firewalld场景2主从数据不一致使用pt-table-checksum校验数据pt-table-checksum --replicatetest.checksums hmaster_ip,uroot,ppassword pt-table-sync --replicatetest.checksums hmaster_ip,uroot,ppassword --print场景3脑裂问题预防措施配置至少两个从库设置ping_interval1启用二次检查脚本6. 生产环境优化建议经过多次实战我总结了这些经验监控指标除了MHA自带的检查还应该监控主从延迟时间主库负载网络延迟SSH连接状态日志轮转MHA日志增长很快需要配置logrotate/var/log/masterha/app1/manager.log { daily rotate 7 compress missingok notifempty }定期演练每季度至少进行一次完整的故障转移测试验证切换时间是否符合SLA告警系统是否正常文档流程是否完善备份策略MHA不能替代备份必须配合每日全备binlog备份最后提醒MHA虽然强大但任何高可用方案都不是银弹。保持敬畏之心做好监控和应急预案才是运维的真谛。
MHA集群实战:从零构建高可用MySQL架构的避坑指南
发布时间:2026/6/28 19:15:39
1. 为什么你需要MHA集群我第一次接触MHA集群是在2015年当时公司的核心业务数据库频繁出现单点故障。每次主库宕机运维团队都要半夜爬起来手动切换从库不仅耗时耗力还经常因为操作失误导致数据不一致。直到我们引入了MHA才真正实现了MySQL的高可用。MHAMaster High Availability是专门为MySQL设计的高可用解决方案。它的核心价值在于当主库发生故障时能够在30秒内自动完成故障检测和主从切换整个过程对应用几乎透明。我见过太多团队因为忽视高可用设计导致业务中断和数据丢失的案例。如果你正在运行MySQL且业务对数据库可用性有要求MHA绝对值得投入时间学习。2. 环境准备那些容易被忽略的细节2.1 服务器规划在我的实战经验中90%的MHA部署问题都源于环境准备不充分。下面这个表格是我总结的生产环境推荐配置角色数量推荐配置必须安装的组件MySQL Master14核8GSSD磁盘MySQL, MHA NodeMySQL Slave≥24核8GSSD磁盘MySQL, MHA NodeMHA Manager12核4GMHA Manager, MHA Node虚拟IP (VIP)1与MySQL同网段-注意Manager节点可以部署在从库上但生产环境建议独立部署。我曾遇到过因为Manager和MySQL混部导致资源争用的问题。2.2 时间同步血泪教训时间不同步会导致主从数据严重不一致。我建议使用chrony代替ntp它更精准且易于配置# 所有节点执行 yum install -y chrony systemctl enable chronyd systemctl start chronyd # 主节点额外配置 sed -i s/^server.*/server ntp.aliyun.com iburst/ /etc/chrony.conf systemctl restart chronyd # 从节点同步主节点 chronyc sources -v记得配置crontab定期检查时间偏移量我遇到过因为时间漂移导致GTID复制中断的案例。2.3 SSH互信安全与便利的平衡全互通SSH免密是MHA的基础要求但直接使用root账户存在安全隐患。我的做法是创建专用mha用户配置sudo权限允许执行必要的网络命令使用ssh-copy-id -i指定公钥文件# 在所有节点执行 useradd mha echo mha ALL(ALL) NOPASSWD: /sbin/ifconfig,/usr/sbin/arping /etc/sudoers # 在Manager节点生成密钥对 su - mha ssh-keygen -t rsa ssh-copy-id mhamaster ssh-copy-id mhaslave1 ssh-copy-id mhaslave23. MySQL主从配置避开那些坑3.1 必须开启的配置项很多教程只教如何配置主从却不解释每个参数的意义。以下是我的必备配置清单# master的my.cnf [mysqld] server-id 1 log-bin mysql-bin binlog_format ROW binlog_row_image FULL sync_binlog 1 gtid_mode ON enforce_gtid_consistency ON binlog_group_commit_sync_delay 100 binlog_group_commit_sync_no_delay_count 10 # slave的my.cnf [mysqld] server-id 2 # 必须唯一 log-bin mysql-bin log_slave_updates ON read_only ON gtid_mode ON enforce_gtid_consistency ON slave_parallel_workers 4 slave_parallel_type LOGICAL_CLOCK特别提醒binlog_format一定要用ROW曾经因为使用MIXED格式导致数据不一致排查了整整两天。3.2 主从搭建实战配置完my.cnf后按照这个流程操作-- 在主库创建复制账号 CREATE USER repl% IDENTIFIED BY ComplexPwd123!; GRANT REPLICATION SLAVE ON *.* TO repl%; -- 查看主库状态 SHOW MASTER STATUS\G -- 在从库配置主从复制 CHANGE MASTER TO MASTER_HOSTmaster_ip, MASTER_USERrepl, MASTER_PASSWORDComplexPwd123!, MASTER_AUTO_POSITION1; START SLAVE;验证复制状态时不仅要看Slave_IO_Running和Slave_SQL_Running还要检查Seconds_Behind_Master。我曾遇到线程显示正常但实际延迟数小时的情况。4. MHA组件安装与配置4.1 安装的正确姿势官方推荐源码安装但实际使用中我更推荐用yum# 所有节点安装epel和依赖 yum install -y epel-release yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager # Node节点安装 yum install -y mha4mysql-node # Manager节点额外安装 yum install -y mha4mysql-manager遇到perl模块缺失时可以用cpanm快速安装yum install -y perl-App-cpanminus cpanm Module::Name4.2 关键配置文件详解/etc/masterha/app1.cnf是核心配置文件这是我的生产配置[server default] usermha passwordMhaPwd123! manager_workdir/var/log/masterha/app1 manager_log/var/log/masterha/app1/manager.log master_binlog_dir/var/lib/mysql master_ip_failover_script/usr/local/bin/master_ip_failover ping_interval1 remote_workdir/tmp repl_userrepl repl_passwordReplPwd123! ssh_usermha report_script/usr/local/bin/send_report [server1] hostnamemaster_ip port3306 [server2] hostnameslave1_ip port3306 candidate_master1 [server3] hostnameslave2_ip port3306 no_master1几个容易出错的点master_binlog_dir必须与实际路径一致candidate_master1表示优先提升该从库为主库no_master1表示该从库永远不会被提升为主库4.3 VIP管理脚本优化官方提供的master_ip_failover脚本需要根据实际网络环境修改。这是我的优化版本my $vip 192.168.1.100; my $ifdev eth0; my $key 1; my $ssh_start_vip sudo /sbin/ifconfig $ifdev:$key $vip/24 up sudo /usr/sbin/arping -q -c 3 -A -I $ifdev $vip; my $ssh_stop_vip sudo /sbin/ifconfig $ifdev:$key down;增加了arping广播可以避免交换机MAC表更新延迟导致的应用连接问题。5. 故障模拟与日常运维5.1 完整的测试流程不要直接kill主库正确的测试步骤应该是启动MHA监控nohup masterha_manager --conf/etc/masterha/app1.cnf /var/log/masterha/app1/manager.log 21 检查状态masterha_check_status --conf/etc/masterha/app1.cnf模拟主库宕机优雅方式# 在主库执行 systemctl stop mysqld观察日志tail -f /var/log/masterha/app1/manager.log验证VIP漂移和写操作是否正常5.2 常见故障处理场景1SSH连接失败检查/var/log/secure通常是SELinux或防火墙导致。我的快速解决方案setenforce 0 systemctl stop firewalld场景2主从数据不一致使用pt-table-checksum校验数据pt-table-checksum --replicatetest.checksums hmaster_ip,uroot,ppassword pt-table-sync --replicatetest.checksums hmaster_ip,uroot,ppassword --print场景3脑裂问题预防措施配置至少两个从库设置ping_interval1启用二次检查脚本6. 生产环境优化建议经过多次实战我总结了这些经验监控指标除了MHA自带的检查还应该监控主从延迟时间主库负载网络延迟SSH连接状态日志轮转MHA日志增长很快需要配置logrotate/var/log/masterha/app1/manager.log { daily rotate 7 compress missingok notifempty }定期演练每季度至少进行一次完整的故障转移测试验证切换时间是否符合SLA告警系统是否正常文档流程是否完善备份策略MHA不能替代备份必须配合每日全备binlog备份最后提醒MHA虽然强大但任何高可用方案都不是银弹。保持敬畏之心做好监控和应急预案才是运维的真谛。