目录
1.什么是 MHA
2.MHA 的组成
3.MHA 的特点
4.搭建 MySQL MHA
环境设置
配置 MySQL 主从复制
1. 修改 MySQL 配置文件 (/etc/my.cnf)
2. 创建软链接
3. 配置主从复制
安装 MHA 软件
1. 安装依赖环境
2.安装 MHA Node 组件
3..安装 MHA Manager 组件
配置无密码 SSH 认证
1.在 Manager 节点上
2.在 Master 节点上
3.在 Slave1 节点上
4.在 Slave2 节点上
在 Manager 节点上配置 MHA
1. 准备脚本和目录
2. 修改 VIP 切换脚本 (/usr/local/bin/master_ip_failover)
3. 修改 MHA 配置文件 (/etc/masterha/app1.cnf)
4. 手动开启虚拟 IP
测试与启动 MHA
1. 测试 SSH 无密码认证
2.测试 MySQL 主从复制
3. 启动 MHA Manage
实验
1.什么是MHA
2.MHA的组成
3.MHA的特点
4.搭建MySQL MHA
环境设置
首先,在所有服务器(Manager, Master, Slave1, Slave2)上执行以下准备工作:
关闭防火墙和 SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
# 永久关闭 SELinux 需修改 /etc/selinux/config 文件,将 SELINUX=enforcing 改为 disabled,然后重启机器
安装 MySQL 5.7
在 Master、Slave1、Slave2 节点上安装 MySQL 5.7。
修改主机名
# 在 Master 节点执行
hostnamectl set-hostname Master
# 在 Slave1 节点执行
hostnamectl set-hostname Slave1
# 在 Slave2 节点执行
hostnamectl set-hostname Slave2
#在manager节点执行
hostnamectl set-hostname manager
配置 MySQL 主从复制
1. 修改 MySQL 配置文件 (/etc/my.cnf)
Master 节点 (10.8.0.11)
[mysqld]
server-id = 1
log_bin = master-bin
log-slave-updates = true
Slave1 节点 (10.8.0.22)
[mysqld]
server-id = 2
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
Slave2 节点 (10.8.0.45)
mysqld]
server-id = 3
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
修改完成后,在所有数据库节点上重启 MySQL 服务:systemctl restart mysqld
2. 创建软链接
在 Master、Slave1、Slave2 节点上都执行:
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
3. 配置主从复制
在所有数据库节点进行 MySQL 授权
mysql -uroot -p
-- 在 MySQL 命令行中执行以下 SQL
grant replication slave on *.* to 'myslave'@'10.8.0.%' identified by '123456';
grant all privileges on *.* to 'mha'@'10.8.0.%' identified by 'manager';
grant all privileges on *.* to 'mha'@'Master' identified by 'manager';
grant all privileges on *.* to 'mha'@'Slave1' identified by 'manager';
grant all privileges on *.* to 'mha'@'Slave2' identified by 'manager';
flush privileges;
在 Master 节点查看二进制日志文件名和位置
show master status;
-- 记录下 File 和 Position 的值,例如:master-bin.000001 和 1745
在 Slave1、Slave2 节点执行同步操作
change master to
master_host='10.8.0.11',
master_user='myslave',
master_password='123456',
master_log_file='master-bin.000001', -- 使用上一步记录的文件名
master_log_pos=1745; -- 使用上一步记录的位置
start slave;
在 Slave1、Slave2 节点查看同步状态
show slave status\G
-- 确保 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes
设置从库为只读模式
在 Slave1、Slave2 节点上执行:
set global read_only=1;
安装 MHA 软件
1. 安装依赖环境
在所有服务器(包括 Manager)上安装:
yum install epel-release --nogpgcheck -y
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN
2.安装 MHA Node 组件
在所有服务器上安装(Manager 组件依赖 Node 组件):
cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install
3..安装 MHA Manager 组件
仅在 Manager 节点 上安装:
cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install
配置无密码 SSH 认证
1.在 Manager 节点上
ssh-keygen -t rsa # 一路回车
ssh-copy-id 10.8.0.11
ssh-copy-id 10.8.0.22
ssh-copy-id 10.8.0.45
2.在 Master 节点上
ssh-keygen -t rsa
ssh-copy-id 10.8.0.22
ssh-copy-id 10.8.0.45
3.在 Slave1 节点上
ssh-keygen -t rsa
ssh-copy-id 10.8.0.11
ssh-copy-id 10.8.0.45
4.在 Slave2 节点上
ssh-keygen -t rsa
ssh-copy-id 10.8.0.11
ssh-copy-id 10.8.0.22
在 Manager 节点上配置 MHA
1. 准备脚本和目录
# 复制脚本
cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin# 创建配置文件目录
mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
2. 修改 VIP 切换脚本 (/usr/local/bin/master_ip_failover)
# 添加内容部分
my $vip = '192.168.10.200'; # 虚拟 IP 地址
my $brdc = '192.168.10.255'; # 广播地址
my $ifdev = 'ens33'; # 绑定的网卡
my $key = '1'; # 虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
注意:请根据您的实际网络环境修改 $vip, $brdc, $ifdev 等变量
3. 修改 MHA 配置文件 (/etc/masterha/app1.cnf)
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/usr/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=manager
ping_interval=1
remote_workdir=/tmp
repl_password=123456
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 10.8.0.22 -s 10.8.0.45
shutdown_script=""
ssh_user=root
user=mha[server1]
hostname=10.8.0.11
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=10.8.0.22
port=3306[server3]
hostname=10.8.0.45
port=3306
4. 手动开启虚拟 IP
在 Master 节点上手动添加 VIP:
/sbin/ifconfig ens33:1
测试与启动 MHA
1. 测试 SSH 无密码认证
在 Manager 节点 执行
masterha_check_ssh -conf=/etc/masterha/app1.cnf
# 最后输出 "All SSH connection tests passed successfully." 表示成功
2.测试 MySQL 主从复制
在 Manager 节点上执行:
masterha_check_repl -conf=/etc/masterha/app1.cnf
# 最后输出 "MySQL Replication Health is OK." 表示成功
3. 启动 MHA Manage
在 Manager 节点上执行:
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
4. 查看 MHA 状态
masterha_check_status --conf=/etc/masterha/app1.cnf
# 如果正常运行,会显示 "app1 (pid:xxxxx) is running(0:PING_OK), master: 10.8.0.11"
实验
tail -f /var/log/masterha/app1/manager.logsystemctl stop mysqld#在 Master节点master上停止mysql服务
总结
整个实验过程并非一帆风顺,而是一个典型的 “配置模板 -> 语法报错 -> 代码修正 -> 验证通过” 的调试过程。
MHA Manager:监控节点,负责检测主库状态并执行故障转移。
MHA Node:运行在 MySQL 服务器上的节点,负责保存二进制日志等。
VIP (10.8.0.200):对外提供服务的虚拟 IP,随主库角色漂移。
Failover Script:核心自动化脚本,负责执行 ifconfig 命令进行 IP 绑定与解绑。
⚠️ 遇到的挑战与排查过程
在实验过程中,直接使用了官方提供的示例脚本,导致了一系列 Perl 语法错误。这是学习 MHA 时最经典的“坑”。
错误一:编码与字符问题
现象:脚本中包含大量中文注释,导致 Perl 解释器报错 Unrecognized character。
解决:清理了脚本中的中文字符,或确保文件编码格式正确。
错误二:变量定义语法错误
现象:报错 Number found where operator expected。
原因:在定义 VIP 变量时,漏写了赋值符号或引号使用不当。
修正:将代码规范为 my $vip = '10.8.0.200';。
错误三:非代码文本混入
现象:脚本第 40 行出现 ens33:1 10.8.0.200 纯文本。
原因:从教程复制代码时,误将命令行的输出结果粘贴到了脚本逻辑中。
修正:删除了这些无效的文本行。
错误四:占位符未处理
现象:报错 Bareword "FIXME_xxx" not allowed。
原因:官方脚本预留的 FIXME 标记(提示用户在此处添加自定义逻辑)被当作代码执行。
修正:注释掉了第 96 行和 101 行的 FIXME 代码。