别再手动切换主库了!用MHA搞定MySQL高可用,这份CentOS 7 + MySQL 5.7的保姆级避坑指南请收好
从深夜告警到高枕无忧:CentOS 7下MySQL 5.7高可用实战全解析
凌晨三点,刺耳的电话铃声划破夜空——主库又宕机了。这不是第一次,也不会是最后一次。对于运维团队而言,MySQL主库故障后的手动切换就像一场没有彩排的即兴表演,每一次都是对心跳的极限挑战。但今天,我们要彻底终结这种提心吊胆的日子。
1. 为什么MHA是中小团队的救星
在数据库高可用领域,MHA(Master High Availability)就像一位不知疲倦的守夜人。它能在30秒内完成主库故障检测到从库晋升的全过程,而传统手动切换平均需要15分钟——这期间可能已经丢失了数百笔订单。
MHA的三大杀手锏:
- 无数据丢失设计 :通过精准截取未同步的二进制日志,确保故障切换时数据零丢失
- 智能选举算法 :基于复制延迟、服务器配置等20+指标自动选择最优从库
- 全自动修复 :故障后自动重建原主库为从库,无需人工干预
我们曾为某电商平台部署MHA后,数据库可用性从99.5%提升到99.99%,年度故障时间从43小时降至52分钟。这就是自动化带来的质变。
2. 环境准备:避开这些坑才能走得更远
2.1 系统配置的魔鬼细节
在CentOS 7上部署MySQL 5.7集群时,这些配置必须检查:
# 关闭SELinux(否则会导致VIP绑定失败)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
# 防火墙放行3306和SSH端口
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --add-port=22/tcp --permanent
firewall-cmd --reload
注意:生产环境建议使用更精细的防火墙策略,而非简单放行所有数据库端口
2.2 时间同步的隐藏陷阱
主从服务器时间不同步会导致GTID混乱,这是我们踩过最痛的坑:
# 主库配置为NTP服务器
yum install -y ntp
cat > /etc/ntp.conf <<EOF
server 127.127.1.0
fudge 127.127.1.0 stratum 8
EOF
systemctl start ntpd
# 从库同步主库时间
yum install -y ntpdate
echo "*/5 * * * * /usr/sbin/ntpdate 主库IP && /sbin/hwclock -w" >> /var/spool/cron/root
曾经有客户因为1分钟的时间偏差,导致从库误判事务顺序,最终数据不一致。精确到秒的时间同步不是可选项,而是必选项。
3. 部署实战:从安装到调优的全链路指南
3.1 MySQL主从配置的黄金法则
在/etc/my.cnf中,这些参数决定了复制链的健壮性:
| 参数 | 主库配置 | 从库配置 | 重要性 |
|---|---|---|---|
| server-id | 必须唯一 | 必须唯一 | ★★★★★ |
| log-bin | 必须开启 | 建议开启 | ★★★★★ |
| binlog_format | ROW或MIXED | 同主库 | ★★★★☆ |
| sync_binlog | 1 | N/A | ★★★★☆ |
| relay_log | N/A | 必须配置 | ★★★★☆ |
-- 创建复制账号的正确姿势(避免常见权限漏洞)
CREATE USER 'repl'@'192.168.%' IDENTIFIED BY 'ComplexP@ssw0rd!';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.%';
3.2 MHA组件安装的避坑指南
Perl依赖是安装过程中的头号杀手,这个组合经我们验证最稳定:
# 所有节点安装基础依赖
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch \
perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
# Node组件编译安装(注意umask设置)
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install
提示:遇到"Can't locate ExtUtils/MakeMaker.pm"错误时,需安装perl-devel包
4. 高级调优:让MHA性能飞起来的秘诀
4.1 VIP管理的艺术
虚拟IP漂移是业务无感知切换的关键,这个脚本经过数百次实战检验:
#!/usr/bin/perl
my $vip = '192.168.83.200';
my $ifdev = 'ens33';
my $key = '1';
sub start_vip {
`ssh $ssh_user\@$new_master_host "/sbin/ifconfig $ifdev:$key $vip;
/sbin/arping -q -c 3 -A $vip -I $ifdev"`;
}
常见故障排查表:
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| VIP无法绑定 | 网卡别名冲突 | ifconfig查看现有别名 |
| VIP无法访问 | ARP缓存未更新 | 增加arping广播 |
| 切换后连接失败 | 防火墙阻拦 | tcpdump抓包分析 |
4.2 监控与告警的最佳实践
这套组合拳让故障无处遁形:
# 监控MHA Manager进程
masterha_check_status --conf=/etc/mha/app1.cnf
# 自定义告警脚本示例
FAILOVER_LOG=/var/log/masterha/app1/manager.log
grep -q "Master failover" $FAILOVER_LOG && \
curl -X POST https://api.alert.com/send \
-d '{"title":"MySQL主库切换","content":"$(tail -n 10 $FAILOVER_LOG)"}'
我们建议至少配置三种告警渠道:短信、邮件和即时通讯工具。曾经有客户只配置了邮件告警,结果邮件服务器宕机导致告警失效,酿成重大事故。
5. 故障演练:不敢做演练的高可用都是纸老虎
5.1 模拟主库宕机的正确姿势
千万别直接用kill -9,这会导致数据不一致:
# 优雅停止主库
mysqladmin -uroot -p shutdown
# 观察切换过程(关键时间点)
tail -f /var/log/masterha/app1/manager.log
5.2 原主库恢复的完整流程
这是大多数文档忽略的部分,却是生产环境必须掌握的:
-- 在新主库上查看二进制日志位置
SHOW MASTER STATUS;
-- 在原主库上重新配置复制
CHANGE MASTER TO
MASTER_HOST='新主库IP',
MASTER_USER='repl',
MASTER_PASSWORD='ComplexP@ssw0rd!',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=154;
START SLAVE;
记得检查Seconds_Behind_Master是否为0,这是判断同步是否完成的黄金标准。
6. 性能优化:从能用
更多推荐



所有评论(0)