背景介绍:为什么需要 MHA?
在传统 MySQL 主从复制架构中,一旦主库发生故障(如宕机、硬件损坏),需要手动将从库提升为主库,修改应用连接配置,整个过程耗时且易出错,导致业务长时间中断。
MHA(Master High Availability) 是一款开源的 MySQL 高可用解决方案,核心价值在于:
- 自动故障检测:实时监控主库状态,秒级发现故障;
- 自动故障切换:故障发生后自动将最优从库提升为主库,无需人工干预;
- 数据一致性保障:通过复制中继日志,最大程度减少数据丢失;
- 零停机切换:配合 VIP 或 DNS,实现业务无感知的主从切换。
本文基于已搭建的GTID + 半同步复制环境,详细讲解 MHA 的部署、配置与测试流程,最终实现 MySQL 服务的高可用保障。
核心关键词解释
- MHA 管理节点:部署 MHA Manager 组件的服务器,负责监控主从状态、执行故障切换;
- MHA 节点:部署 MHA Node 组件的 MySQL 服务器(主从节点均需部署),提供故障切换所需的本地操作接口;
- 候选主库(candidate_master):配置文件中标记为可被提升为主库的从节点,MHA 会优先选择该类节点;
- SSH 互信:管理节点与所有数据库节点之间免密登录,确保 MHA 可远程执行操作;
- 半同步复制:主库提交事务前需等待至少一个从库确认接收日志,相比异步复制大幅降低数据丢失风险,是 MHA 保障数据一致性的基础。
一、环境准备与架构说明
架构规划
| 节点角色 | IP 地址 | 作用说明 |
|---|---|---|
| 主数据库节点 | 192.168.238.134 | 处理业务写请求,作为半同步复制的主库,故障时可被从库替代 |
| 从数据库节点 | 192.168.238.133 | 同步主库数据,处理读请求,主库故障时自动提升为主库 |
| MHA 管理节点 | 192.168.238.135 | 部署 MHA Manager,监控主从健康状态,主库故障时自动执行切换逻辑 |
前提条件(重要)
主从节点已完成GTID + 半同步复制配置:确保数据同步正常,半同步复制需开启rpl_semi_sync_master_enabled=ON(主库)和rpl_semi_sync_slave_enabled=ON(从库);
若主从节点未完成GTID+半同步复制配置,则可参考文章
- 所有节点系统与版本一致:CentOS 7 操作系统,MySQL 5.6 + 且版本相同(避免复制兼容性问题);
- 网络与权限配置:管理节点与主从节点网络互通,关闭防火墙 / SELinux(生产环境可开放 3306、22 端口)。
二、创建 MHA 管理节点虚拟机(192.168.238.135)
1. 配置静态 IP
bash
# 查看网卡名称(通常为ens33)
ip addr
# 编辑网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-ens33
配置内容:
ini
TYPE=Ethernet # 网络类型为以太网
BOOTPROTO=static # 静态IP模式(避免DHCP分配IP变化)
ONBOOT=yes # 开机自动激活网卡
NAME=ens33 # 网卡名称(需与实际一致)
DEVICE=ens33 # 设备名称(与NAME一致)
IPADDR=192.168.238.135 # MHA管理节点固定IP
NETMASK=255.255.255.0 # 子网掩码
GATEWAY=192.168.238.2 # 网关地址(与主从节点一致)
DNS1=8.8.8.8 # 公共DNS(Google)
DNS2=114.114.114.114 # 备用DNS(国内)
bash
# 重启网络服务使配置生效
systemctl restart network
# 确认IP配置正确
ip addr show ens33 # 应显示192.168.238.135
# 测试与主从节点连通性(确保网络互通)
ping 192.168.238.134 -c 3 # 测试主库
ping 192.168.238.133 -c 3 # 测试从库
2. 基础环境配置
bash
# 关闭防火墙(避免端口拦截,生产环境可开放22、3306端口)
systemctl stop firewalld
systemctl disable firewalld
# 关闭SELinux(临时+永久)
setenforce 0 # 临时关闭
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 永久关闭
# 设置主机名(便于识别节点角色)
hostnamectl set-hostname mha-manager
三、全节点依赖与环境配置
1. 安装 MHA 依赖包(所有节点执行)
bash
# 安装Perl及MHA运行所需依赖(CentOS 7默认源包含)
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
# 安装sshpass(用于批量配置SSH互信,可选)
yum install -y sshpass
2. 配置 SSH 互信(关键!MHA 需免密登录所有节点)
MHA 管理节点操作(生成密钥并复制到主从节点):
bash
# 生成RSA密钥(无密码,一路回车)
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 复制公钥到主库节点(输入主库root密码)
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.238.134
# 复制公钥到从库节点(输入从库root密码)
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.238.133
主库节点操作(复制公钥到管理节点和从库):
bash
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.238.135 # 复制到管理节点
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.238.133 # 复制到从库
从库节点操作(复制公钥到管理节点和主库):
bash
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.238.135 # 复制到管理节点
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.238.134 # 复制到主库
验证 SSH 互信(管理节点执行):
bash
# 测试免密登录主库
ssh root@192.168.238.134 "echo '主库SSH连通'"
# 测试免密登录从库
ssh root@192.168.238.133 "echo '从库SSH连通'"
- 若直接输出提示信息且无需输入密码,说明 SSH 互信配置成功。
3. 创建 MHA 管理用户(主库执行)
bash
# 登录MySQL(使用root密码)
mysql -uroot -p
执行 SQL(创建 MHA 专用管理用户):
sql
-- 创建允许管理节点网段访问的用户(密码建议复杂,避免特殊字符如@)
CREATE USER 'mha_manager'@'192.168.238.%' IDENTIFIED BY 'Mha123456';
-- 授予最高权限(MHA需要监控和操作复制状态)
GRANT ALL PRIVILEGES ON *.* TO 'mha_manager'@'192.168.238.%' WITH GRANT OPTION;
-- 刷新权限
FLUSH PRIVILEGES;
-- 退出MySQL
exit;
四、安装 MHA 软件
1. 部署 MHA Node 组件(所有数据库节点执行)
bash
# 下载MHA Node包(v0.58适配CentOS 7,若下载失败可手动从GitHub下载后上传)
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
# 安装Node组件(提供本地操作接口)
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
2. 部署 MHA Manager 组件(仅管理节点执行)
bash
# 下载MHA Manager包
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
# 安装依赖(若之前未安装)
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch
# 安装Manager组件(提供监控和切换功能)
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
注:若 GitHub 下载缓慢,可手动访问MHA Node 下载页和MHA Manager 下载页,选择
el7.centos版本下载后上传到服务器。
五、配置 MHA 管理节点
1. 创建目录结构(管理节点执行)
bash
# 创建MHA配置文件目录
mkdir -p /etc/mha/mysql_cluster
# 创建MHA日志目录
mkdir -p /var/log/mha/mysql_cluster
2. 编写 MHA 配置文件(管理节点执行)
bash
vim /etc/mha/mysql_cluster.cnf
配置内容:
[server default]
# MHA连接MySQL的管理用户(主库创建的mha_manager)
user=mha_manager
password=Mha123456 # 与主库创建的用户密码一致,避免特殊字符
# SSH登录用户(所有节点的root用户)
ssh_user=root
# 主从复制用户(GTID复制的repl_user)
repl_user=repl_user
repl_password=YourPassword # 替换为实际复制用户密码
# MHA工作目录与日志配置
manager_workdir=/var/log/mha/mysql_cluster # MHA工作目录
manager_log=/var/log/mha/mysql_cluster/manager.log # 监控日志路径
remote_workdir=/tmp/mha # 远程节点临时工作目录
# 健康检测间隔(秒),建议2-5秒
ping_interval=2
# 主库节点配置
[server1]
hostname=192.168.238.134 # 主库IP
port=3306 # MySQL端口
candidate_master=1 # 标记为候选主库(故障恢复后可重新成为主库)
# 从库节点配置
[server2]
hostname=192.168.238.133 # 从库IP
port=3306
candidate_master=1 # 标记为候选主库(主库故障时优先提升)
六、验证 MHA 环境(管理节点执行)
1. 验证 SSH 互信配置
bash
masterha_check_ssh --conf=/etc/mha/mysql_cluster.cnf
- 输出
All SSH connection tests passed successfully.表示 SSH 互信配置成功。
2. 验证主从复制状态
bash
masterha_check_repl --conf=/etc/mha/mysql_cluster.cnf
- 输出
MySQL Replication Health is OK.表示主从复制状态正常,MHA 可识别拓扑结构。
注:若验证失败,需检查:①主从复制是否正常(
Slave_IO_Running=Yes);②MHA 管理用户权限是否足够;③配置文件参数是否正确。
七、启动 MHA 监控与故障测试
1. 启动 MHA 监控进程(管理节点执行)
bash
# 后台启动MHA监控(nohup确保退出终端后仍运行)
nohup masterha_manager --conf=/etc/mha/mysql_cluster.cnf > /var/log/mha/mysql_cluster/manager.log 2>&1 &
2. 检查 MHA 状态
bash
masterha_check_status --conf=/etc/mha/mysql_cluster.cnf
- 输出
mysql_cluster (pid: xxxx) is running(0:PING_OK)表示监控正常; - 若提示
INITIALIZING_MONITOR,等待 30 秒后重试(MHA 初始化需要时间)。
3. 模拟主库故障(测试自动切换)
主库节点执行(停止 MySQL 服务):
bash
# 停止主库MySQL,模拟故障
service mysqld stop
管理节点查看切换日志:
bash
# 实时查看MHA日志,观察切换过程
tail -f /var/log/mha/mysql_cluster/manager.log
验证切换结果(管理节点执行):
bash
# 登录新主库(从库192.168.238.133)查看状态
mysql -uroot -p -h192.168.238.133 -e "show master status;"
# 查看新主库半同步状态(应开启)
mysql -uroot -p -h192.168.238.133 -e "show global status like 'Rpl_semi_sync_master_status';"
- 若新主库
show master status显示 GTID 信息,且Rpl_semi_sync_master_status=ON,说明切换成功。
八、故障恢复后重置(原主库修复后)
1. 原主库重新加入集群(原主库执行)
bash
# 登录MySQL(原主库192.168.238.134)
mysql -uroot -p
执行 SQL(将原主库设为新主库的从库):
sql
-- 停止原复制进程
STOP SLAVE;
-- 重置复制配置
RESET SLAVE ALL;
-- 配置新的主从关系(指向新主库192.168.238.133)
CHANGE MASTER TO
MASTER_HOST='192.168.238.133',
MASTER_USER='repl_user',
MASTER_PASSWORD='YourPassword',
MASTER_AUTO_POSITION=1; # GTID自动定位
-- 启动复制进程
START SLAVE;
-- 退出MySQL
exit;
2. 重启 MHA 监控(管理节点执行)
bash
# 停止现有MHA监控
masterha_stop --conf=/etc/mha/mysql_cluster.cnf
# 重新启动监控(包含恢复后的原主库)
nohup masterha_manager --conf=/etc/mha/mysql_cluster.cnf > /var/log/mha/mysql_cluster/manager.log 2>&1 &
关键注意事项
- 管理节点独立部署:避免与数据库节点共机,防止数据库故障导致 MHA 不可用,降低单点风险;
- 定期备份配置与数据:MHA 配置文件需备份,MySQL 数据需定期全量备份(如 mysqldump),确保故障后可快速恢复;
- 配置告警脚本:生产环境需在 MHA 配置中添加
report_script参数,实现故障切换后的邮件 / 短信告警,及时通知运维人员; - 版本兼容性:MySQL 5.6/5.7 推荐使用 MHA 0.58 版本,高版本 MySQL(8.0+)需注意兼容性;
- 配置文件避坑:密码中避免特殊字符(如
@、!),防止 MHA 解析配置时出错; - 双向 SSH 互信:不仅管理节点需免密登录主从节点,主从节点之间也需免密登录(MHA 切换时需从节点间同步日志)。
总结
MHA 通过 “监控 + 自动切换” 实现了 MySQL 的高可用,结合 GTID + 半同步复制,既保证了切换的自动化,又最大程度减少了数据丢失。搭建核心流程为:
- 准备 GTID + 半同步复制环境(基础);
- 部署 MHA Node/Manager 组件;
- 配置 SSH 互信与 MHA 管理用户;
- 编写 MHA 配置文件并验证环境;
- 启动监控并测试故障切换。
生产环境中,还可结合 VIP(虚拟 IP)或 Keepalived,实现业务 IP 的自动漂移,进一步提升切换的透明性。通过本文步骤,可快速搭建一套稳定的 MySQL 高可用架构,保障业务连续性。
7万+

被折叠的 条评论
为什么被折叠?



