news 2026/8/6 2:33:09

MySQL MHA

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL MHA

目录

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

MHAMaster High Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。
MHA的出现就是解决MySQL单点的问题。
MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。
MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。

2MHA的组成

MHA Node(数据节点)
MHA Node运行在每台MySQL服务器上。
MHA Manager(管理节点)检测
MHA Manager可以单独部署在一台独立的机器上,管理多个master-slave集群;也可以部署在
一台slave节点上。
MHA Manager会定时探测集群中的master节点。当master出现故障时,它可以自动将最新数
据的slave提升为新的master然后将所有其他的slave重新指向新的master。整个故障转移过程
对应用程序完全透明。

3.MHA的特点

自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日
志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数
据一致性
目前MHA支持一主多从架构,最少三台服务,即一主两从
MHA Manger管理多组主从复制。

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"

实验

manager节点上监控观察日志记录
tail -f /var/log/masterha/app1/manager.log
systemctl stop mysqld#在 Master节点master上停止mysql服务

故障修复步骤:
修复mysql
systemctl restart mysqld
修复主从
#在现主库服务器Mysql2slave1上) 查看二进制文件和同步点
show master status;
#在原主库服务器mysql1执行同步操作
change master to
3.在manager节点上修改配置文件app1.cnf(再把这个记录添加进去,因为它检测掉失效时候会自动消 失)
4.在manager节点上启动MHA
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 &

总结

整个实验过程并非一帆风顺,而是一个典型的 “配置模板 -> 语法报错 -> 代码修正 -> 验证通过” 的调试过程。

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 代码。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 2:33:04

从零设计高性能二进制通信协议:原理、实现与工程实践

最近在整理一些跨平台通信协议和编码方案时&#xff0c;发现很多开发者对如何设计一套兼具高吞吐、低延迟和强鲁棒性的数据传输协议感到头疼。网上资料要么过于理论化&#xff0c;要么就是零散的代码片段&#xff0c;难以形成一套完整的、可落地的工程方案。本文将从一个虚构但…

作者头像 李华
网站建设 2026/8/6 2:32:35

uWebSockets跨平台编译指南:Linux/macOS/Windows环境配置与实战

1. 项目概述如果你正在用C开发高性能网络服务&#xff0c;尤其是WebSocket应用&#xff0c;那么uWebSockets这个名字你一定不陌生。它是一个用C17编写的、极致轻量且性能爆表的WebSocket和HTTP库&#xff0c;常被用来构建实时通信的后端服务&#xff0c;比如在线游戏服务器、金…

作者头像 李华
网站建设 2026/8/6 2:29:30

中企业网站建设怎么做好?中小企业网站建设实用指南与避坑手册

在这个互联网普及率早已接近天花板、流量红利见顶的大环境下,很多老板和创业者常常陷入一种焦虑:我的企业到底需不需要做网站?如果需要,为什么花了十几万甚至几十万做出来的网站,最后却像是一个吃灰的摆设,不仅没带来一个询盘,反而成了公司财务报表上的一笔“沉没成本”…

作者头像 李华
网站建设 2026/8/6 2:27:33

前后端分离架构下的接口规范与文档体系实践

1. 为什么我们需要告别"口头约定"&#xff1f;在前后端分离架构成为主流的今天&#xff0c;接口规范与文档体系的缺失仍然是许多开发团队的痛点。我经历过太多这样的场景&#xff1a;前端等着后端接口开发&#xff0c;后端等着前端确认字段格式&#xff0c;双方都认为…

作者头像 李华
网站建设 2026/8/6 2:27:02

深入解析C/C++程序入口:main函数的设计原理与实战应用

1. 程序世界的“心脏”&#xff1a;int main()究竟是什么&#xff1f;如果你刚开始学习C或C&#xff0c;看到每个程序开头都写着int main()&#xff0c;是不是觉得它像个神秘的咒语&#xff0c;既熟悉又陌生&#xff1f;它就像一栋大楼的总电闸&#xff0c;或者一场交响乐的总指…

作者头像 李华
网站建设 2026/8/6 2:24:08

昌平区网站建设怎么挑才不踩坑?老程序员手把手教你避坑指南

昌平区网站建设最近有个在北京昌平做生意的朋友,半夜给我打电话,语气里满是焦虑和无奈。他说自己花了好几万做的网站,上线半年了,不仅没带来一个客户,连搜索引擎都搜不到,每次打开还得手动输地址,有时候页面还打不开。挂了电话,我心里挺不是滋味的。其实,在北京这样的…

作者头像 李华