MySQL MHA高可用配置实战指南
在企业级数据中台、数字孪生与数字可视化系统中,数据库的稳定性直接决定业务连续性。MySQL作为主流关系型数据库,其高可用架构的构建至关重要。MHA(Master High Availability)是一款开源的MySQL主从自动故障切换工具,能够在主库宕机时,自动识别并提升最同步的从库为新主库,实现分钟级故障恢复,极大降低服务中断风险。本文将深入解析MySQL MHA高可用配置的完整实战流程,涵盖环境准备、组件部署、配置优化与故障演练,助您构建生产级高可用MySQL集群。
MHA由四大核心组件构成,协同工作实现自动化故障转移:
✅ 推荐部署拓扑:1主2从 + 1个Manager节点(建议部署在非数据库服务器,避免单点)可选:1个Binlog Server(用于关键业务)
# 关闭SELinux(临时)setenforce 0# 永久关闭sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config# 关闭防火墙systemctl stop firewalld && systemctl disable firewalld确保主从复制已正常运行,且开启binlog与relay-log:
-- 在主库执行SET GLOBAL binlog_format = 'ROW';SET GLOBAL log_bin = 'mysql-bin';SET GLOBAL server_id = 1;-- 在从库执行(server_id需唯一)SET GLOBAL server_id = 2;SET GLOBAL relay_log = 'mysql-relay-bin';SET GLOBAL read_only = 1;-- 创建复制用户CREATE USER 'repl'@'192.168.%.%' IDENTIFIED BY 'ReplPass123!';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.%.%';FLUSH PRIVILEGES;验证复制状态:
SHOW SLAVE STATUS\G确保 Slave_IO_Running: Yes 与 Slave_SQL_Running: Yes 同时为Yes。
在所有节点安装EPEL源与Perl依赖:
yum install epel-release -yyum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y下载MHA Node与Manager(推荐0.58版本):
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gzwget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gztar -zxvf mha4mysql-node-0.58.tar.gzcd mha4mysql-node-0.58perl Makefile.PLmake && make install# 在Manager节点安装managercd ../mha4mysql-manager-0.58perl Makefile.PLmake && make installMHA依赖SSH进行节点间通信,必须配置Manager节点到所有MySQL节点的无密码登录:
# 在Manager节点生成密钥ssh-keygen -t rsa -N ""# 分发公钥到所有MySQL节点ssh-copy-id root@192.168.1.10 # 主库ssh-copy-id root@192.168.1.11 # 从库1ssh-copy-id root@192.168.1.12 # 从库2测试连接:
ssh root@192.168.1.10 "hostname"确保无交互式密码输入。
在Manager节点创建配置目录:
mkdir -p /etc/mha/app1vim /etc/mha/app1/app1.cnf配置文件内容如下:
[server default]manager_workdir=/var/log/mha/app1manager_log=/var/log/mha/app1/manager.logremote_workdir=/var/log/mha/app1ssh_user=rootrepl_user=replrepl_password=ReplPass123!ping_interval=3master_ip_failover_script=/usr/local/bin/master_ip_failovershutdown_script=/usr/local/bin/power_managerreport_script=/usr/local/bin/send_report[server1]hostname=192.168.1.10port=3306master_binlog_dir=/var/lib/mysqlcandidate_master=1check_repl_delay=0[server2]hostname=192.168.1.11port=3306master_binlog_dir=/var/lib/mysqlcandidate_master=1check_repl_delay=0[server3]hostname=192.168.1.12port=3306master_binlog_dir=/var/lib/mysqlno_master=1⚠️ 注意:
candidate_master=1表示该节点优先成为新主库;check_repl_delay=0忽略复制延迟检测,适用于低延迟环境。
创建 /usr/local/bin/master_ip_failover:
#!/usr/bin/env perluse strict;use warnings FATAL => 'all';use Getopt::Long;my $vip = '192.168.1.200/24';my $key = '1';my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";my $command = '';my $orig_master_host = '';my $new_master_host = '';GetOptions( 'command=s' => \$command, 'orig_master_host=s' => \$orig_master_host, 'new_master_host=s' => \$new_master_host,);exit 0 unless $command;if ($command eq 'stop' || $command eq 'stopssh') { print "Stopping VIP on $orig_master_host\n"; system("ssh root\@$orig_master_host \"$ssh_stop_vip\"") == 0 or warn "Failed to stop VIP: $!";} elsif ($command eq 'start') { print "Starting VIP on $new_master_host\n"; system("ssh root\@$new_master_host \"$ssh_start_vip\"") == 0 or warn "Failed to start VIP: $!";}赋予执行权限:
chmod +x /usr/local/bin/master_ip_failovermasterha_check_ssh --conf=/etc/mha/app1/app1.cnfmasterha_check_repl --conf=/etc/mha/app1/app1.cnf输出应显示 OK,若出现错误,需排查SSH、复制、权限等问题。
nohup masterha_manager --conf=/etc/mha/app1/app1.cnf --ignore_last_failover &查看状态:
masterha_check_status --conf=/etc/mha/app1/app1.cnf正常输出应为:app1 (pid:1234) is running(0:PING_OK), master:192.168.1.10
在主库执行:
kill -9 $(pgrep mysqld)观察Manager日志:
tail -f /var/log/mha/app1/manager.log您将看到如下关键日志:
Fri Jun 14 10:20:05 2024 - [info] Master is down!Fri Jun 14 10:20:06 2024 - [info] New master is 192.168.1.11Fri Jun 14 10:20:07 2024 - [info] Applying differential binary log...Fri Jun 14 10:20:10 2024 - [info] VIP 192.168.1.200 is moved to 192.168.1.11✅ 验证VIP是否漂移:
ip addr show eth0在新主库上查看是否绑定VIP。
确保应用连接字符串使用VIP地址(如 jdbc:mysql://192.168.1.200:3306/db),切换后无需修改配置,实现零感知故障转移。
| 优化项 | 建议 |
|---|---|
| binlog格式 | 强制使用ROW模式,避免语句复制导致的主从不一致 |
| 网络延迟 | 所有节点部署在同一局域网,延迟控制在5ms以内 |
| 监控告警 | 集成Prometheus + Grafana监控MHA状态与复制延迟 |
| 定期演练 | 每季度执行一次故障切换演练,验证脚本有效性 |
| 日志归档 | 设置logrotate对MHA日志自动轮转,避免磁盘占满 |
💡 重要提示:MHA不支持多主架构,如需多写入场景,建议升级至MySQL Group Replication或使用ProxySQL + MHA组合方案。
| 问题 | 解决方案 |
|---|---|
Can't exec "mysqlbinlog" | 安装MySQL客户端工具包:yum install mysql-community-client |
Failed to connect to MySQL | 检查repl用户权限、防火墙、SELinux |
| VIP无法漂移 | 确保目标节点网卡名为eth0,或修改脚本中接口名 |
| 切换后从库无法同步 | 手动执行 CHANGE MASTER TO 指向新主库,并启动slave |
MHA虽成熟稳定,但存在以下限制:
对于追求更高自动化与云原生适配的企业,建议逐步向 MySQL InnoDB Cluster 或 Percona XtraDB Cluster 迁移。但对传统IDC环境,MHA仍是性价比最高的高可用方案。
在数字孪生与实时可视化系统中,数据库的可用性直接关联决策时效与用户体验。MHA高可用配置虽需手动部署,但其轻量、高效、稳定的特点,使其成为众多中大型企业数据中台的首选方案。通过本文的完整配置流程,您已掌握从环境搭建、脚本编写到故障演练的全流程能力。
为保障系统持续稳定运行,建议定期备份MHA配置文件、测试切换脚本,并建立运维SOP手册。如需进一步提升数据平台的弹性与扩展能力,可考虑接入更高级的分布式数据解决方案:申请试用&https://www.dtstack.com/?src=bbs
✅ 建议每半年进行一次MHA架构复审,结合业务增长调整节点数量与监控策略。✅ 推荐将MHA日志接入ELK体系,实现故障自动归因分析。✅ 为避免人为误操作,建议在生产环境部署MHA的“只告警不切换”模式进行观察期。
再次强调:高可用不是一次性配置,而是持续运维的艺术。申请试用&https://www.dtstack.com/?src=bbs 可为您提供更智能的数据平台底座,助力您的数字系统迈向零中断时代。
申请试用&下载资料🚀 数据稳定,业务才可信赖。从今天起,让MHA守护您的核心数据库。申请试用&https://www.dtstack.com/?src=bbs