架构概述与环境准备
架构核心目标
MHA(Master High Availability)是 MySQL 高可用解决方案,通过监控主库状态、自动 / 手动故障切换,实现主库故障时快速切换到候选主库,保障业务连续性。本方案中 Master 节点同时承担 MHA Manager 角色,减少服务器资源占用,架构包含 3 台物理机 + 1 个虚拟 IP(VIP)
服务器角色与软件基础
- 源码编译好的mysql8.0.40
https://blog.csdn.***/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.***f,启用 GTID、binlog 等核心参数
[root@master ~]# vim /etc/my.***f
[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. SU***ESS!
2 从库(node1、node2)配置
从节点需启用只读模式(read_only=1),避免直接写操作,配置与主节点类似但需修改 server_id。
[root@node1 ~]# vim /etc/my.***f
[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. SU***ESS!
[root@node2 ~]# vim /etc/my.***f
[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. SU***ESS!
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 文件,实现公钥统一:
#汇总公