MySQL MHA 高可用集群搭建
架构概述与环境准备
架构核心目标
MHA(Master High Availability)是 MySQL 高可用解决方案,通过监控主库状态、自动 / 手动故障切换,实现主库故障时快速切换到候选主库,保障业务连续性。本方案中 Master 节点同时承担 MHA Manager 角色,减少服务器资源占用,架构包含 3 台物理机 + 1 个虚拟 IP(VIP)
服务器角色与软件基础
- 源码编译好的mysql8.0.40
https://blog.csdn.net/racwwt/article/details/151259281
服务器角色 | 主机名 | IP 地址 | 核心作用 |
---|---|---|---|
MySQL 主库 + MHA Manager(管理节点) | master | 192.168.2.102 | 负责写操作,同步 binlog 到从库,监控主库、执行故障转移 |
MySQL 从库 1(候选主库) | node1 | 192.168.2.104 | 读操作,主库故障后升新主库 |
MySQL 从库 2 | node2 | 192.168.2.105 | 读操作,仅作为备用从库 |
虚拟 IP(VIP) | - | 192.168.2.100 | 应用连接 MySQL 的统一入口 |
环境前提
- 操作系统与软件版本:CentOS 7.x + MySQL 8.0.40
- 关闭防火墙与 SE Linux
# 关闭防火墙(永久)
systemctl stop firewalld && systemctl disable firewalld
# 关闭 SE Linux(永久,需重启生效,临时关闭用 setenforce 0)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
- 配置主机名与 hosts 解析
# 各节点设置主机名(分别执行)
hostnamectl set-hostname master # master 节点
hostnamectl set-hostname node1 # node1 节点
hostnamectl set-hostname node2 # node2 节点
# 所有节点添加 hosts 解析(/etc/hosts)
cat /etc/hosts
192.168.2.102 master
192.168.2.104 node1
192.168.2.105 node2
- 确保 MySQL 服务正常:所有节点已安装 MySQL,且能通过 /etc/init.d/mysqld start 启动
配置任务总览
- 搭建正常的 MySQL 一主多从复制(GTID 模式)
- 配置所有服务器间的 SSH 免密通信
- 验证主从复制与免密通信后,安装并启动 MHA
- 测试 MHA 手动与自动故障切换功能
- 配置 VIP 漂移,保障应用访问透明化
一、搭建 MySQL 主从复制(GTID 模式)
MHA 依赖 MySQL 主从复制实现数据同步,推荐使用 GTID 模式(无需手动指定 binlog 文件名和位置,故障切换更高效),步骤如下:
1 主库(master:192.168.2.102)配置
编辑 MySQL 配置文件 /etc/my.cnf,启用 GTID、binlog 等核心参数
[root@master ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql # 数据存储目录(需提前创建:mkdir -p /data/mysql)
socket=/data/mysql/mysql.sock # Socket 文件路径
server_id=102 # 唯一标识(建议与 IP 最后一段一致,避免冲突)
gtid-mode=on # 开启 GTID 复制模式
enforce-gtid-consistency=true # 强制 GTID 事务一致性
log-bin=binlog # 启用二进制日志(主从复制核心)
relay-log=relay-log # 启用中继日志(主库降级为从库时需用)
relay_log_purge=0 # 禁止自动删除中继日志(故障时补全数据)
log-slave-updates=true # 从库同步的事务记录到 binlog(支持级联复制)
[root@master ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!
2 从库(node1、node2)配置
从节点需启用只读模式(read_only=1),避免直接写操作,配置与主节点类似但需修改 server_id。
[root@node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server_id=104
gtid-mode=on
enforce-gtid-consistency=true
log-bin=binlog
relay-log=relay-log
relay_log_purge=0
read_only=1 #从库设为只读(避免误写,升主后会自动取消)
log-slave-updates=true
[root@node1 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS! [root@node2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server_id=105
gtid-mode=on
enforce-gtid-consistency=true
log-bin=binlog
relay-log=relay-log
relay_log_purge=0
read_only=1
log-slave-updates=true
[root@node2 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!
3 配置一主多从复制架构:
MHA 仅支持 mysql_native_password 认证插件,需明确指定:
3.1 主库(master)创建账号(复制账号 + MHA 管理账号)
# 1. 创建主从复制账号 rep(所有从库用该账号同步数据)
mysql> create user 'rep'@'%' identified WITH mysql_native_password by '123';
mysql> grant replication slave on *.* to 'rep'@'%'; # 仅复制权限
#2. 创建 MHA 管理账号 mhaadm(高权限,用于 MHA 操作集群)
mysql> create user 'mhaadm'@'%' identified WITH mysql_native_password by '123';
mysql> grant all on *.* to 'rep'@'%';
# 刷新权限
mysql> FLUSH PRIVILEGES;
3.2 从库(node1、node2)配置同步主库
MySQL 8.0 用 CHANGE REPLICATION SOURCE(5.7 用 CHANGE MASTER TO),步骤如下
# 配置同步源为 master(192.168.2.102)
mysql> CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.2.102', # 主库 IP
SOURCE_USER='rep', # 复制账号
SOURCE_PASSWORD='123', # 复制密码
master_auto_position=1, # 启用 GTID 自动定位(无需指定 binlog 位置)
SOURCE_SSL=1; # 启用 SSL
mysql> start replica;
# 验证复制状态(核心:IO 和 SQL 线程均为 Yes)
mysql> show replica status \G
# 关键输出:Replica_IO_Running: YesReplica_SQL_Running: Yes
# 查看从库列表(主库执行可看到所有从库)
mysql> show replicas;
+-----------+------+------+-----------+--------------------------------------+
| Server_Id | Host | Port | Source_Id | Replica_UUID |
+-----------+------+------+-----------+--------------------------------------+
| 105 | | 3306 | 102 | 85aa2339-87e8-11f0-b63e-000c29d446f1 |
| 104 | | 3306 | 102 | 85aa2339-87e8-11f0-b63e-000c29d446f2 |
+-----------+------+------+-----------+--------------------------------------+
2 rows in set (0.00 sec)
二、配置服务器间免密 SSH 通信
MHA 依赖 SSH 免密登录实现跨节点操作(如复制 binlog、执行切换命令),需确保 所有节点(master、node1、node2)间 root 用户免密互通。
1. 所有节点生成 SSH 密钥对
在 master、node1、node2 分别执行以下命令(无需输入密码,直接回车)
ssh-keygen -f /root/.ssh/id_rsa -P '' -q
2. 汇总公钥到 master(MHA Manager 节点)
将所有节点的公钥复制到 master 的 authorized_keys 文件,实现公钥统一:
#汇总公钥到 master(Manager 节点),最后将manager节点的authorized_keys分发到其他节点
[root@master ~]# ssh-copy-id root@master
[root@node1 ~]# ssh-copy-id root@master
[root@node2 ~]# ssh-copy-id root@master
3. 分发 authorized_keys 到所有节点
将 master 上汇总好的公钥文件分发到 node1 和 node2,确保所有节点公钥一致:
[root@master ~]# scp /root/.ssh/authorized_keys root@node1:/root/.ssh
[root@master ~]# scp /root/.ssh/authorized_keys root@node2:/root/.ssh
4. 循环 SSH 各节点执行 hostname,无密码提示则成功
[root@master ~]# for i in {master,node1,node2}; do ssh $i hostname ;done
master
node1
node2
三、验证通过后再配置启动 MHA
1. MHA 组件安装规则
-
Node 节点:所有 MySQL 服务器安装
mha4mysql-node
(执行具体命令,如复制 binlog、切换主从); -
Manager 节点:仅 mha-manager安装
mha4mysql-manager
(监控、调度故障转移)+mha4mysql-node
(Manager 也需要 Node 组件)。
2. 下载 MHA 安装包与依赖
https://code.google.com/archive/p/mysql-master-ha/
github下载地址:
https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
1.第一种方法
#mha-manager上安装软件包
[root@master ~]# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
[root@master ~]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
2.第二种方法
[root@master MHA-7]# ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
mha4mysql-node-0.58-0.el7.centos.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Net-Telnet-3.03-19.el7.noarch.rpm
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
[root@master MHA-7]# rpm -ivh *.rpm
[root@master MHA-7]# rpm -ivh mha4mysql-*
##其他三个mysql服务器上安装mha4mysql-node即可,复制mha4mysql-node到所有数据库服务器
[root@master ~]# for i in {master,rep1,rep2};do scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@$i:/root;done
#所有数据库上安装mha4mysql-node
[root@master ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@master ~]# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
3. 配置 MHA Manager(核心步骤!)
3.1 创建 MHA 工作目录和配置文件
#在master上创建配置文件目录
[root@master ~]# mkdir -p /etc/mha /var/log/mha/app1
3.2 编写配置文件(逐行解释)
#在manager上创建配置文件目录
[root@master ~]# vim /etc/mha/app1.cnf
[server default] #适用于server1,2,3个server的配置
user=mhaadm #mha管理用户
password=123 #mha管理用户密码
manager_workdir=/var/log/mha/app1 #mha的工作路径
manager_log=/var/log/mha/app1/manager.log #mha的日志文件
ssh_user=root #基于ssh的秘钥认证
repl_user=rep #主从复制的账号
repl_password=123
ping_interval=1 #ping间隔时长
[server1] #mysql主机信息
hostname=192.168.2.102
ssh_port=22
candidate_master=1 # 标记为候选主库(故障时可升级)
[server2]
hostname=192.168.2.104
ssh_port=22
candidate_master=1 # 标记为候选主库(优先升级)
[server3]
hostname=192.168.2.105
ssh_port=22
no_master=1 # 禁止作为主库(仅备用)
4. 检查 SSH 互信(masterha_check_ssh)
# master 节点执行(指定配置文件)
[root@master ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
# 成功标志:All SSH connection tests passed successfully.
# 失败排查:检查 authorized_keys 权限(600)、节点 hosts 解析、免密配置
#省略部分内容
Sat Sep 6 17:17:34 2025 - [info] All SSH connection tests passed successfully.
5. 检查主从复制健康(masterha_check_repl)
# master 节点执行
# 成功标志:MySQL Replication Health is OK.
[root@master ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
Sat Sep 6 17:18:51 2025 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sat Sep 6 17:18:51 2025 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Sat Sep 6 17:18:51 2025 - [info] Reading server configuration from /etc/mha/app1.cnf..
Sat Sep 6 17:18:51 2025 - [info] MHA::MasterMonitor version 0.58.
Sat Sep 6 17:18:52 2025 - [info] GTID failover mode = 1
Sat Sep 6 17:18:52 2025 - [info] Dead Servers:
Sat Sep 6 17:18:52 2025 - [info] Alive Servers:
Sat Sep 6 17:18:52 2025 - [info] 192.168.2.102(192.168.2.102:3306)
Sat Sep 6 17:18:52 2025 - [info] 192.168.2.104(192.168.2.104:3306)
Sat Sep 6 17:18:52 2025 - [info] 192.168.2.105(192.168.2.105:3306)
Sat Sep 6 17:18:52 2025 - [info] Alive Slaves:
Sat Sep 6 17:18:52 2025 - [info] 192.168.2.104(192.168.2.104:3306) Version=8.0.40 (oldest major version between slaves) log-bin:enabled
Sat Sep 6 17:18:52 2025 - [info] GTID ON
Sat Sep 6 17:18:52 2025 - [info] Replicating from 192.168.2.102(192.168.2.102:3306)
Sat Sep 6 17:18:52 2025 - [info] Primary candidate for the new Master (candidate_master is set)
Sat Sep 6 17:18:52 2025 - [info] 192.168.2.105(192.168.2.105:3306) Version=8.0.40 (oldest major version between slaves) log-bin:enabled
Sat Sep 6 17:18:52 2025 - [info] GTID ON
Sat Sep 6 17:18:52 2025 - [info] Replicating from 192.168.2.102(192.168.2.102:3306)
Sat Sep 6 17:18:52 2025 - [info] Not candidate for the new Master (no_master is set)
Sat Sep 6 17:18:52 2025 - [info] Current Alive Master: 192.168.2.102(192.168.2.102:3306)
Sat Sep 6 17:18:52 2025 - [info] Checking slave configurations..
Sat Sep 6 17:18:52 2025 - [info] Checking replication filtering settings..
Sat Sep 6 17:18:52 2025 - [info] binlog_do_db= , binlog_ignore_db=
Sat Sep 6 17:18:52 2025 - [info] Replication filtering check ok.
Sat Sep 6 17:18:52 2025 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.
Sat Sep 6 17:18:52 2025 - [info] Checking SSH publickey authentication settings on the current master..
Sat Sep 6 17:18:52 2025 - [info] HealthCheck: SSH to 192.168.2.102 is reachable.
Sat Sep 6 17:18:52 2025 - [info]
192.168.2.102(192.168.2.102:3306) (current master)+--192.168.2.104(192.168.2.104:3306)+--192.168.2.105(192.168.2.105:3306)Sat Sep 6 17:18:52 2025 - [info] Checking replication health on 192.168.2.104..
Sat Sep 6 17:18:52 2025 - [info] ok.
Sat Sep 6 17:18:52 2025 - [info] Checking replication health on 192.168.2.105..
Sat Sep 6 17:18:52 2025 - [info] ok.
Sat Sep 6 17:18:52 2025 - [info] Checking master_ip_failover_script status:
Sat Sep 6 17:18:52 2025 - [info] /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.2.102 --orig_master_ip=192.168.2.102 --orig_master_port=3306 IN SCRIPT TEST====/sbin/ip a del 192.168.2.88/24 dev ens32==/sbin/ip a add 192.168.2.88/24 dev ens32===Checking the Status of the script.. OK
Sat Sep 6 17:18:52 2025 - [info] OK.
Sat Sep 6 17:18:52 2025 - [warning] shutdown_script is not defined.
Sat Sep 6 17:18:52 2025 - [info] Got exit code 0 (Not master dead).MySQL Replication Health is OK.
四、MHA 故障切换(手动 + 自动)
故障切换是 MHA 的核心功能,分为手动切换(计划内维护)和自动切换(突发故障)。
1. 手动故障切换(示例:主库 master 下线)
1.1 模拟主库故障(停止 master 的 MySQL 服务并且执行手动切换)
# master 节点执行
[root@master ~]# /etc/init.d/mysqld stop
Shutting down MySQL......... SUCCESS!
# master 节点执行(--ignore_last_failover 忽略历史切换锁文件)
[root@master ~]# masterha_master_switch --master_state=dead --conf=/etc/mha/app1.cnf --dead_master_host=192.168.2.102 --dead_master_port=3306 --new_master_host=192.168.2.104 --new_master_port=3306 --ignore_last_failover
# 成功标志:Master failover to 192.168.2.104 completed successfully.
Master failover to 192.168.2.104(192.168.2.104:3306) completed successfully.
1.2 恢复故障mysql节点且验证切换结果
[root@master ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!
[root@master ~]# mysql -uroot -p123
#将该主机重新加入集群中,配置 master 同步 node1(新主库)
mysql> CHANGE REPLICATION SOURCE TO-> SOURCE_HOST='192.168.2.104',-> SOURCE_USER='rep',-> SOURCE_PASSWORD='123',-> master_auto_position=1,-> SOURCE_SSL=1;
mysql> start replica;
mysql> show replica status\G
*************************** 1. row ***************************Replica_IO_State: Waiting for source to send eventSource_Host: 192.168.2.104Source_User: repSource_Port: 3306Connect_Retry: 60Source_Log_File: binlog.000020Read_Source_Log_Pos: 277Relay_Log_File: relay-log.000002Relay_Log_Pos: 367Relay_Source_Log_File: binlog.000020Replica_IO_Running: YesReplica_SQL_Running: Yes
可以看到主已经切换成了node1(192.168.2.104)
在node1和node2上都做如下步骤,恢复到一主多从
mysql> stop replica;
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> CHANGE REPLICATION SOURCE TO-> SOURCE_HOST='192.168.2.102',-> SOURCE_USER='rep',-> SOURCE_PASSWORD='123',-> master_auto_position=1,-> SOURCE_SSL=1;
Query OK, 0 rows affected, 3 warnings (0.01 sec)mysql> start replica;
Query OK, 0 rows affected (0.03 sec)######在master上查看
mysql> stop replica;
Query OK, 0 rows affected (0.00 sec)mysql> RESET SLAVE ALL;
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> show replicas;
+-----------+------+------+-----------+--------------------------------------+
| Server_Id | Host | Port | Source_Id | Replica_UUID |
+-----------+------+------+-----------+--------------------------------------+
| 105 | | 3306 | 102 | 85aa2339-87e8-11f0-b63e-000c29d446f1 |
| 104 | | 3306 | 102 | 85aa2339-87e8-11f0-b63e-000c29d446f2 |
+-----------+------+------+-----------+--------------------------------------+
现在master是主
2. 自动故障切换(突发故障自动恢复)
自动切换需启动 MHA Manager 进程,实时监控主库状态,主库故障时自动执行切换。
2.1 清除切换锁文件(首次启动或切换后必做)
MHA 切换后会生成 app1.failover.complete 锁文件,防止重复切换,需手动删除:
#删除锁文件,如果不删除的话mha无法故障转移成功
[root@master ~]# rm -rf /var/log/mha/app1/app1.failover.complete
2.2 启动 MHA Manager 进程
#启动mha。可以使用--ignore_last_failover选项选择忽略锁文件
[root@master ~]# masterha_manager --conf=/etc/mha/app1.cnf
2.3 验证 MHA Manager 状态
###然后另行启动一个master会话
#查看mha的状态
[root@master ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:54677) is running(0:PING_OK), master:192.168.2.102
2.4 模拟主库故障(自动切换测试)
#模拟主mysql宕机
[root@master ~]# /etc/init.d/mysqld stop
#注意:自动切换后,MHA Manager 进程会自动停止,需手动重启
2.5 验证自动切换结果
#查看转移日志
[root@master ~]# cat /var/log/mha/app1/manager.log
#成功标志:Master failover to 192.168.2.104 succeeded
Master failover to 192.168.2.104(192.168.2.104:3306) completed successfully.
查看新主库状态:node1 成为主库,node2 和 master 同步 node1。
#删除锁文件
[root@master ~]# rm -rf /var/log/mha/app1/app1.failover.complete
[root@master ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!
[root@master ~]# mysql -uroot -p123
#恢复故障的从
mysql> CHANGE REPLICATION SOURCE TO-> SOURCE_HOST='192.168.2.104',-> SOURCE_USER='rep',-> SOURCE_PASSWORD='123',-> master_auto_position=1,-> SOURCE_SSL=1;
Query OK, 0 rows affected, 3 warnings (0.01 sec)mysql> start replica;
Query OK, 0 rows affected (0.02 sec)mysql> exit
Bye
[root@master ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
192.168.2.104(192.168.2.104:3306) (current master)+--192.168.2.102(192.168.2.102:3306)+--192.168.2.105(192.168.2.105:3306)
五、配置 VIP 漂移
VIP(192.168.2.100)是应用连接 MySQL 的统一入口,需通过脚本实现故障切换时 VIP 自动从原主库漂移到新主库。
1. 编写 VIP 切换脚本(/usr/local/bin/master_ip_failover)
[root@master ~]# vim /usr/local/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;# 定义变量(根据实际环境修改)
my ($command, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port, $new_master_host, $new_master_ip, $new_master_port);
my $vip = '192.168.2.100/24'; # 虚拟 IP(与架构一致)
my $nic = 'ens32'; # 网卡名称(用 ip a 查看)
my $ssh_start_vip = "/sbin/ip a add $vip dev $nic"; # 添加 VIP 命令
my $ssh_stop_vip = "/sbin/ip a del $vip dev $nic"; # 删除 VIP 命令# 解析 MHA 传递的参数
GetOptions('command=s' => \$command,'ssh_user=s' => \$ssh_user,'orig_master_host=s' => \$orig_master_host,'orig_master_ip=s' => \$orig_master_ip,'orig_master_port=i' => \$orig_master_port,'new_master_host=s' => \$new_master_host,'new_master_ip=s' => \$new_master_ip,'new_master_port=i' => \$new_master_port,
);exit &main();# 主函数:根据命令执行 VIP 操作
sub main {print "\n\nIN SCRIPT TEST==== $ssh_stop_vip == $ssh_start_vip ===\n\n";# 1. 原主库下线:删除 VIPif ($command eq "stop" || $command eq "stopssh") {eval {print "Disabling VIP $vip on old master $orig_master_host\n";&stop_vip(); # 调用删除 VIP 函数};if ($@) {warn "Error deleting VIP: $@\n";exit 1;}exit 0;}# 2. 新主库上线:添加 VIPelsif ($command eq "start") {eval {print "Enabling VIP $vip on new master $new_master_host\n";&start_vip(); # 调用添加 VIP 函数};if ($@) {warn "Error adding VIP: $@\n";exit 10;}exit 0;}# 3. 状态检查:脚本是否正常elsif ($command eq "status") {print "VIP script status: OK\n";exit 0;}# 未知命令:输出用法else {&usage();exit 1;}
}# 函数:在新主库添加 VIP
sub start_vip {`ssh $ssh_user\@$new_master_host "$ssh_start_vip"`;
}# 函数:在原主库删除 VIP
sub stop_vip {`ssh $ssh_user\@$orig_master_host "$ssh_stop_vip"`;
}# 函数:输出脚本用法
sub usage {print "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
2. 配置脚本权限与 MHA 关联
2.1 给脚本添加执行权限:
chmod +x /usr/local/bin/master_ip_failover
2.2 关联到 MHA 配置文件
[root@master ~]# vim /etc/mha/app1.cnf
[server default]
#添加如下信息
master_ip_failover_script=/usr/local/bin/master_ip_failover
3. 测试 VIP 漂移
3.1手动在当前主库添加 VIP(首次配置)
# 当前主库是 node1,执行:
ip a add 192.168.2.100/24 dev ens32
# 验证 VIP 存在:
ip a show ens32
3.2 启动 MHA Manager 并模拟主库故障:
[root@master ~]# masterha_manager --conf=/etc/mha/app1.cnf --ignore_last_failover
[root@node1 ~]# /etc/init.d/mysqld stop
3.3 在master上查看VIP(因为主库切换到了master)
[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:d4:46:f0 brd ff:ff:ff:ff:ff:ffinet 192.168.2.102/24 brd 192.168.2.255 scope global noprefixroute ens32valid_lft forever preferred_lft foreverinet 192.168.2.100/24 scope global secondary ens32valid_lft forever preferred_lft foreverinet6 fe80::d422:ec69:33ad:b48c/64 scope link noprefixroute valid_lft forever preferred_lft forever
六、总结
注意事项
- 环境一致性:所有节点 MySQL 主版本需统一(本文用 8.0.40),避免复制兼容性问题;关闭防火墙与 SE Linux,防止端口拦截。
- 账号与权限:MHA 仅支持 mysql_native_password 认证,需严格按步骤创建复制账号与管理账号。
- 锁文件处理:故障切换后需删除 app1.failover.complete 锁文件,否则 MHA 无法再次切换。