1. 为什么你需要MHA集群?
我第一次接触MHA集群是在2015年,当时公司的核心业务数据库频繁出现单点故障。每次主库宕机,运维团队都要半夜爬起来手动切换从库,不仅耗时耗力,还经常因为操作失误导致数据不一致。直到我们引入了MHA,才真正实现了MySQL的高可用。
MHA(Master High Availability)是专门为MySQL设计的高可用解决方案。它的核心价值在于:当主库发生故障时,能够在30秒内自动完成故障检测和主从切换,整个过程对应用几乎透明。我见过太多团队因为忽视高可用设计,导致业务中断和数据丢失的案例。如果你正在运行MySQL且业务对数据库可用性有要求,MHA绝对值得投入时间学习。
2. 环境准备:那些容易被忽略的细节
2.1 服务器规划
在我的实战经验中,90%的MHA部署问题都源于环境准备不充分。下面这个表格是我总结的生产环境推荐配置:
| 角色 | 数量 | 推荐配置 | 必须安装的组件 |
|---|---|---|---|
| MySQL Master | 1 | 4核8G+SSD磁盘 | MySQL, MHA Node |
| MySQL Slave | ≥2 | 4核8G+SSD磁盘 | MySQL, MHA Node |
| MHA Manager | 1 | 2核4G | MHA 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 mha@master ssh-copy-id mha@slave1 ssh-copy-id mha@slave23. 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_HOST='master_ip', MASTER_USER='repl', MASTER_PASSWORD='ComplexPwd123!', MASTER_AUTO_POSITION=1; 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] user=mha password=MhaPwd123! 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_interval=1 remote_workdir=/tmp repl_user=repl repl_password=ReplPwd123! ssh_user=mha report_script=/usr/local/bin/send_report [server1] hostname=master_ip port=3306 [server2] hostname=slave1_ip port=3306 candidate_master=1 [server3] hostname=slave2_ip port=3306 no_master=1几个容易出错的点:
master_binlog_dir必须与实际路径一致candidate_master=1表示优先提升该从库为主库no_master=1表示该从库永远不会被提升为主库
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 2>&1 &检查状态
masterha_check_status --conf=/etc/masterha/app1.cnf模拟主库宕机(优雅方式)
# 在主库执行 systemctl stop mysqld观察日志
tail -f /var/log/masterha/app1/manager.log验证VIP漂移和写操作是否正常
5.2 常见故障处理
场景1:SSH连接失败检查/var/log/secure,通常是SELinux或防火墙导致。我的快速解决方案:
setenforce 0 systemctl stop firewalld场景2:主从数据不一致使用pt-table-checksum校验数据:
pt-table-checksum --replicate=test.checksums h=master_ip,u=root,p=password pt-table-sync --replicate=test.checksums h=master_ip,u=root,p=password --print场景3:脑裂问题预防措施:
- 配置至少两个从库
- 设置
ping_interval=1 - 启用二次检查脚本
6. 生产环境优化建议
经过多次实战,我总结了这些经验:
监控指标:除了MHA自带的检查,还应该监控:
- 主从延迟时间
- 主库负载
- 网络延迟
- SSH连接状态
日志轮转:MHA日志增长很快,需要配置logrotate
/var/log/masterha/app1/manager.log { daily rotate 7 compress missingok notifempty }定期演练:每季度至少进行一次完整的故障转移测试,验证:
- 切换时间是否符合SLA
- 告警系统是否正常
- 文档流程是否完善
备份策略:MHA不能替代备份!必须配合每日全备+binlog备份
最后提醒:MHA虽然强大,但任何高可用方案都不是银弹。保持敬畏之心,做好监控和应急预案,才是运维的真谛。