MySQL MHA高可用配置实战教程
在企业级数据中台架构中,数据库的高可用性是保障业务连续性的核心基石。MySQL作为最广泛使用的开源关系型数据库之一,其稳定性直接影响数据服务的可靠性。当主库发生故障时,若无自动切换机制,将导致业务中断、数据丢失甚至客户流失。MySQL MHA(Master High Availability)是目前业界公认的、成熟且轻量级的MySQL主从高可用解决方案,它能在主库宕机时自动完成故障检测、数据一致性校验与从库晋升,实现分钟级故障恢复,显著降低RTO(恢复时间目标)。
📌 什么是MySQL MHA?
MySQL MHA由Yoshinori Matsunobu开发,是一个基于Perl编写的开源工具集,专为MySQL主从复制环境设计。它不依赖于任何特定的存储引擎或复制模式,兼容MySQL 5.5至8.0版本,支持异步复制与半同步复制。MHA的核心功能包括:
MHA架构由四类节点组成:
| 节点类型 | 作用 |
|---|---|
| Master | 当前主数据库,负责写入与读取 |
| Slave | 从数据库,异步复制主库数据,至少部署2台 |
| MHA Manager | 监控与管理节点,运行MHA脚本,不存储数据 |
| MHA Node | 安装在每个MySQL节点上,负责执行日志收集、切换等操作 |
✅ 推荐部署:1个Manager + 3个Node(1主+2从),确保高可用性与容灾能力。
🔧 MHA高可用配置实战步骤
以下为在CentOS 7 / MySQL 8.0环境下完成MHA高可用配置的完整流程,适用于中大型企业数据平台。
确保所有节点(Master、Slave1、Slave2、Manager)满足以下条件:
# 示例:配置SSH免密登录(在Manager节点执行)ssh-keygen -t rsa -b 2048ssh-copy-id root@192.168.1.10 # Masterssh-copy-id root@192.168.1.11 # Slave1ssh-copy-id root@192.168.1.12 # Slave2在Master节点配置my.cnf:
[mysqld]server-id = 1log-bin = mysql-binbinlog-format = ROWrelay-log = mysql-relay-binlog-slave-updates = 1gtid-mode = ONenforce-gtid-consistency = ONmaster-info-repository = TABLErelay-log-info-repository = TABLEsync-binlog = 1innodb_flush_log_at_trx_commit = 1在Slave节点配置:
[mysqld]server-id = 2 # Slave1# 或 server-id = 3 # Slave2log-bin = mysql-binbinlog-format = ROWrelay-log = mysql-relay-binlog-slave-updates = 1gtid-mode = ONenforce-gtid-consistency = ONmaster-info-repository = TABLErelay-log-info-repository = TABLEread-only = 1重启MySQL服务:
systemctl restart mysqld在Master上创建复制用户:
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'ReplPass123!';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';FLUSH PRIVILEGES;在每个Slave节点执行:
CHANGE MASTER TO MASTER_HOST='192.168.1.10', MASTER_USER='repl', MASTER_PASSWORD='ReplPass123!', MASTER_AUTO_POSITION=1;START SLAVE;SHOW SLAVE STATUS\G验证Slave_IO_Running与Slave_SQL_Running均为Yes,表示复制正常。
在Manager节点安装MHA Manager与Node:
# 安装EPEL源(如未安装)yum install epel-release -y# 安装依赖yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y# 下载MHA包(官网:https://github.com/yoshinorim/mha4mysql-manager)wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.noarch.rpmwget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.noarch.rpm# 安装rpm -ivh mha4mysql-node-0.58-0.el7.noarch.rpmrpm -ivh mha4mysql-manager-0.58-0.el7.noarch.rpm在所有MySQL节点(Master/Slave)上安装Node组件:
rpm -ivh mha4mysql-node-0.58-0.el7.noarch.rpm在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_binlog_dir=/var/lib/mysqlmaster_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=3306candidate_master=1check_repl_delay=0[server2]hostname=192.168.1.11port=3306candidate_master=1check_repl_delay=0[server3]hostname=192.168.1.12port=3306no_master=1⚠️ 注意:
candidate_master=1表示该节点优先被选为新主库,no_master=1表示禁止其成为主库(如用于只读报表)。
MHA默认不包含VIP漂移脚本,需手动编写master_ip_failover:
mkdir -p /usr/local/binvim /usr/local/bin/master_ip_failover粘贴以下脚本(根据实际网络调整VIP):
#!/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 $cli = Getopt::Long::GetOptions( 'command=s' => \my $command, 'ssh_user=s' => \my $ssh_user, 'orig_master_host=s' => \my $orig_master, 'new_master_host=s' => \my $new_master,);exit &main();sub main { if ($command eq 'stop' || $command eq 'stopssh') { &stop_vip(); } elsif ($command eq 'start') { &start_vip(); } elsif ($command eq 'status') { &status(); } return 1;}sub start_vip { `ssh -q -o ConnectTimeout=10 -o BatchMode=yes -o StrictHostKeyChecking=no $ssh_user\@$new_master "$ssh_start_vip"`; print "New master VIP $vip activated.\n";}sub stop_vip { `ssh -q -o ConnectTimeout=10 -o BatchMode=yes -o StrictHostKeyChecking=no $ssh_user\@$orig_master "$ssh_stop_vip"`; print "Old master VIP $vip stopped.\n";}sub status { print "VIP: $vip\n";}赋予执行权限:
chmod +x /usr/local/bin/master_ip_failover执行健康检查:
masterha_check_ssh --conf=/etc/mha/app1/app1.cnfmasterha_check_repl --conf=/etc/mha/app1/app1.cnf若输出均为OK,则配置成功。
启动MHA监控:
nohup masterha_manager --conf=/etc/mha/app1/app1.cnf --ignore_last_failover &模拟主库宕机(在Master节点执行):
pkill mysqld观察Manager日志:
tail -f /var/log/mha/app1/manager.log您将看到如下关键信息:
Sat Apr 10 10:20:30 2024 - [info] Master is down!Sat Apr 10 10:20:35 2024 - [info] New master is 192.168.1.11Sat Apr 10 10:20:40 2024 - [info] Switching master to 192.168.1.11...Sat Apr 10 10:20:45 2024 - [info] Master failover completed successfully.此时,VIP自动漂移到新主库,应用层只需连接VIP即可无缝继续服务。
💡 企业级最佳实践建议
🚀 为什么选择MHA而非其他方案?
| 方案 | 优点 | 缺点 |
|---|---|---|
| MHA | 开源免费、轻量、支持任意拓扑、自动数据补偿 | 依赖Perl、无图形界面、需手动配置VIP |
| MySQL InnoDB Cluster | 官方支持、自动分片、内置Group Replication | 需MySQL 8.0+、资源消耗大、配置复杂 |
| ProxySQL + Orchestrator | 支持读写分离、可视化 | 部署复杂、学习曲线陡峭 |
| Galera Cluster | 多主写入、强一致性 | 写性能下降、网络敏感、不适合大集群 |
对于大多数企业数据中台而言,MHA在成本、稳定性、可控性三者间达到了最佳平衡。
📌 结语:高可用不是可选项,而是数字业务的生命线
在数字孪生、实时可视化、智能决策等场景中,数据库的任何一次中断都可能导致决策延迟、数据失真、客户信任崩塌。MHA作为经过千万级生产环境验证的高可用方案,是构建稳定数据底座的首选工具。
如果您正在评估数据库高可用方案,或希望获得更智能的自动化运维能力,我们推荐您进一步了解企业级数据平台解决方案:申请试用&https://www.dtstack.com/?src=bbs。该平台提供MHA一键部署模板、可视化监控看板与智能告警引擎,可显著降低运维复杂度。
对于正在构建数据中台的企业,建议将MHA与Kubernetes + Helm结合,实现容器化部署。申请试用&https://www.dtstack.com/?src=bbs 提供完整的MySQL高可用容器化部署手册,助力企业快速落地。
无论您是数据工程师、架构师,还是数字化转型负责人,掌握MHA配置能力,都是保障核心数据服务稳定运行的必备技能。现在就开始部署,让您的系统不再因单点故障而停摆。申请试用&https://www.dtstack.com/?src=bbs —— 让高可用,从配置开始。
申请试用&下载资料