MySQL MHA (基于 GTID) 本地部署实现
架构规划
-
142节点: MySQL Master (主库) + MHA Node
-
143节点: MySQL Slave1 (从库) + MHA Node
-
144节点: MySQL Slave2 (从库) + MHA Node
-
145节点: MHA Manager (管理节点) + MHA Node
-
VIP:
192.168.19.200 -
网卡:
ens33
第一步:基础环境与 SSH 免密 (所有节点 142, 143, 144, 145)
MHA 强依赖节点间的互相 SSH 免密登录。
1. 配置 hosts 解析 在四台机器的 /etc/hosts 追加:
192.168.19.142 mysql-master
192.168.19.143 mysql-slave1
192.168.19.144 mysql-slave2
192.168.19.145 mha-manager
2. 配置全网互通的 SSH 免密 在四台机器上分别执行生成密钥(一路回车):
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
将四台机器的公钥 (~/.ssh/id_rsa.pub) 内容合并,并写入到每一台机器的 ~/.ssh/authorized_keys 文件中。 (务必测试:在 145 上 ssh 192.168.19.142 等,确保不需要密码)

每台机器都要和其他三台进行免密
第二步:配置 MySQL 并开启 GTID (142, 143, 144)
1. 修改 MySQL 配置文件 (/etc/my.cnf)
Master (142):
[mysqld]
server-id=142
log-bin=mysql-bin
relay-log=relay-bin
binlog_format=row
# GTID 配置
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=1
# MHA 需要
skip-name-resolve
Slave1 (143) & Slave2 (144):
[mysqld]
server-id=143 # 144 节点改为 144
log-bin=mysql-bin
relay-log=relay-bin
binlog_format=row
# GTID 配置
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=1
skip-name-resolve
read_only=1 # 从库设为只读
重启所有 MySQL 服务:systemctl restart mysqld
2. 搭建主从复制 (基于 GTID)
在 Master (142) 上创建复制用户和 MHA 管理用户:
-- 复制用户
CREATE USER 'repl'@'192.168.19.%' IDENTIFIED BY 'Repl_Password123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.19.%';
-- MHA 监控与管理用户
CREATE USER 'mha'@'192.168.19.%' IDENTIFIED BY 'Mha_Password123!';
GRANT ALL PRIVILEGES ON *.* TO 'mha'@'192.168.19.%';
FLUSH PRIVILEGES;
在 Slave1 (143) 和 Slave2 (144) 上配置同步:
CHANGE MASTER TO
MASTER_HOST='192.168.19.142',
MASTER_USER='repl',
MASTER_PASSWORD='Repl_Password123!',
MASTER_AUTO_POSITION=1; -- 开启 GTID 自动定位
START SLAVE;
检查同步状态:SHOW SLAVE STATUS\G 确保 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes。

第三步:安装 MHA 软件
1. 安装依赖 (所有节点)
yum install -y epel-release
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
2. 安装 MHA Node (142, 143, 144, 145) 在所有节点下载并安装 mha4mysql-node 的 rpm 包。
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-node-*.rpm
3. 安装 MHA Manager (仅 145) 在 145 节点额外安装 manager 包。
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-manager-*.rpm
第四步:配置 MHA Manager (145 节点)
1. 创建配置文件
mkdir -p /etc/mha
mkdir -p /var/log/mha/app1
编辑 /etc/mha/app1.cnf:
[server default]
user=mha
password=Mha_Password123!
manager_workdir=/var/log/mha/app1
manager_log=/var/log/mha/app1/manager.log
remote_workdir=/var/log/mha/app1
ssh_user=root
repl_user=repl
repl_password=Repl_Password123!
ping_interval=2
master_ip_failover_script=/etc/mha/master_ip_failover
[server1]
hostname=192.168.19.142
port=3306
[server2]
hostname=192.168.19.143
port=3306
candidate_master=1
[server3]
hostname=192.168.19.144
port=3306
candidate_master=1
第五步:VIP 切换脚本 (master_ip_failover)
在 MHA Manager (145) 的 /etc/mha/ 目录下创建 master_ip_failover 脚本。这是一个简化的 Bash 脚本,用于解绑旧主库的 VIP 并绑定到新主库。
#!/bin/bash
# /etc/mha/master_ip_failover
VIP="192.168.19.200/24"
KEY="1"
INTERFACE="ens33"
SSH="ssh -o StrictHostKeyChecking=no"
COMMAND=""
ORIG_MASTER_HOST=""
ORIG_MASTER_SSH_USER="root"
NEW_MASTER_HOST=""
NEW_MASTER_SSH_USER="root"
while [ $# -gt 0 ]; do
case "$1" in
--command=*)
COMMAND="${1#*=}"
;;
--orig_master_host=*)
ORIG_MASTER_HOST="${1#*=}"
;;
--orig_master_ssh_user=*)
ORIG_MASTER_SSH_USER="${1#*=}"
;;
--new_master_host=*)
NEW_MASTER_HOST="${1#*=}"
;;
--new_master_ssh_user=*)
NEW_MASTER_SSH_USER="${1#*=}"
;;
esac
shift
done
drop_vip() {
if [ -n "$ORIG_MASTER_HOST" ]; then
${SSH} ${ORIG_MASTER_SSH_USER}@${ORIG_MASTER_HOST} "ip addr del ${VIP} dev ${INTERFACE} label ${INTERFACE}:${KEY}" 2>/dev/null
fi
return 0
}
add_vip() {
if [ -n "$NEW_MASTER_HOST" ]; then
${SSH} ${NEW_MASTER_SSH_USER}@${NEW_MASTER_HOST} "ip addr add ${VIP} dev ${INTERFACE} label ${INTERFACE}:${KEY}"
${SSH} ${NEW_MASTER_SSH_USER}@${NEW_MASTER_HOST} "arping -q -c 3 -A -I ${INTERFACE} 192.168.19.200"
fi
return 0
}
if [ "$COMMAND" = "stop" ] || [ "$COMMAND" = "stopssh" ]; then
drop_vip
exit 0
elif [ "$COMMAND" = "start" ]; then
add_vip
exit 0
elif [ "$COMMAND" = "status" ]; then
exit 0
fi
exit 0
赋予脚本执行权限:
chmod +x /etc/mha/master_ip_failover
手动绑定初始 VIP: 在现在的 Master (142) 上手动绑定 VIP,以便应用程序可以开始使用:
ip addr add 192.168.19.200/24 dev ens33 label ens33:1
(注意:请将 eth33 替换为你服务器的实际网卡名称)
第六步:测试与启动 MHA
在 145 节点 上执行以下检查:
1. 检查 SSH 免密互通:
masterha_check_ssh --conf=/etc/mha/app1.cnf
如果最后输出 All SSH connection tests passed successfully. 说明正常。

2. 检查 MySQL 复制状态:
masterha_check_repl --conf=/etc/mha/app1.cnf
如果最后输出 MySQL Replication Health is OK. 说明正常。

3. 启动 MHA Manager:
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
你可以通过 masterha_check_status --conf=/etc/mha/app1.cnf 来查看 MHA 的运行状态

tail -f /var/log/mha/app1/manager.log
查看日志
去 142 节点执行
systemctl stop mysqld

可以看到mha检测发生了故障开始自动切换
在144节点执行
show slave status\G
可以发现主库从142变成了143

143上也出现了从库和vip


更多推荐




所有评论(0)