MySQL MHA 高可用架构搭建:基于 GTID + 半同步复制

背景介绍:为什么需要 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+半同步复制配置,则可参考文章

直接搭建 MySQL GTID 主从复制https://blog.youkuaiyun.com/yifengyiyufjq/article/details/154988699?sharetype=blogdetail&sharerId=154988699&sharerefer=PC&sharesource=yifengyiyufjq&spm=1011.2480.3001.8118

MySQL 半同步复制配置指南:基于 GTID 架构的增强方案https://blog.youkuaiyun.com/yifengyiyufjq/article/details/154430698?sharetype=blogdetail&sharerId=154430698&sharerefer=PC&sharesource=yifengyiyufjq&spm=1011.2480.3001.8118

  1. 所有节点系统与版本一致:CentOS 7 操作系统,MySQL 5.6 + 且版本相同(避免复制兼容性问题);
  2. 网络与权限配置:管理节点与主从节点网络互通,关闭防火墙 / 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 &

关键注意事项

  1. 管理节点独立部署:避免与数据库节点共机,防止数据库故障导致 MHA 不可用,降低单点风险;
  2. 定期备份配置与数据:MHA 配置文件需备份,MySQL 数据需定期全量备份(如 mysqldump),确保故障后可快速恢复;
  3. 配置告警脚本:生产环境需在 MHA 配置中添加report_script参数,实现故障切换后的邮件 / 短信告警,及时通知运维人员;
  4. 版本兼容性:MySQL 5.6/5.7 推荐使用 MHA 0.58 版本,高版本 MySQL(8.0+)需注意兼容性;
  5. 配置文件避坑:密码中避免特殊字符(如@!),防止 MHA 解析配置时出错;
  6. 双向 SSH 互信:不仅管理节点需免密登录主从节点,主从节点之间也需免密登录(MHA 切换时需从节点间同步日志)。

总结

MHA 通过 “监控 + 自动切换” 实现了 MySQL 的高可用,结合 GTID + 半同步复制,既保证了切换的自动化,又最大程度减少了数据丢失。搭建核心流程为:

  1. 准备 GTID + 半同步复制环境(基础);
  2. 部署 MHA Node/Manager 组件;
  3. 配置 SSH 互信与 MHA 管理用户;
  4. 编写 MHA 配置文件并验证环境;
  5. 启动监控并测试故障切换。

生产环境中,还可结合 VIP(虚拟 IP)或 Keepalived,实现业务 IP 的自动漂移,进一步提升切换的透明性。通过本文步骤,可快速搭建一套稳定的 MySQL 高可用架构,保障业务连续性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值