MySQL MHA 高可用集群搭建

发布于:2025-09-07 ⋅ 阅读:(17) ⋅ 点赞:(0)

架构概述与环境准备

架构核心目标

MHA(Master High Availability)是 MySQL 高可用解决方案,通过监控主库状态、自动 / 手动故障切换,实现主库故障时快速切换到候选主库,保障业务连续性。本方案中 Master 节点同时承担 MHA Manager 角色,减少服务器资源占用,架构包含 3 台物理机 + 1 个虚拟 IP(VIP)

服务器角色与软件基础

服务器角色 主机名 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 的统一入口

环境前提

  1. 操作系统与软件版本:CentOS 7.x + MySQL 8.0.40
  2. 关闭防火墙与 SE Linux
# 关闭防火墙(永久)
systemctl stop firewalld && systemctl disable firewalld
# 关闭 SE Linux(永久,需重启生效,临时关闭用 setenforce 0)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
  1. 配置主机名与 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
  1. 确保 MySQL 服务正常:所有节点已安装 MySQL,且能通过 /etc/init.d/mysqld start 启动

配置任务总览

  1. 搭建正常的 MySQL 一主多从复制(GTID 模式)
  2. 配置所有服务器间的 SSH 免密通信
  3. 验证主从复制与免密通信后,安装并启动 MHA
  4. 测试 MHA 手动与自动故障切换功能
  5. 配置 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: Yes
          Replica_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 event
                  Source_Host: 192.168.2.104
                  Source_User: rep
                  Source_Port: 3306
                Connect_Retry: 60
              Source_Log_File: binlog.000020
          Read_Source_Log_Pos: 277
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 367
        Relay_Source_Log_File: binlog.000020
           Replica_IO_Running: Yes
          Replica_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. 原主库下线:删除 VIP
    if ($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. 新主库上线:添加 VIP
    elsif ($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 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::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 1000
    link/ether 00:0c:29:d4:46:f0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.102/24 brd 192.168.2.255 scope global noprefixroute ens32
       valid_lft forever preferred_lft forever
    inet 192.168.2.100/24 scope global secondary ens32
       valid_lft forever preferred_lft forever
    inet6 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 无法再次切换。

网站公告

今日签到

点亮在社区的每一天
去签到