架构规划

  • 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_RunningSlave_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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐