MySQL的MHA(Master High Availability)是一种用于MySQL高可用性的解决方案,旨在提高MySQL数据库集群的可用性和故障恢复能力。MHA主要通过自动故障切换来确保数据库的高可用性,它能够在主数据库出现故障时,自动将从数据库提升为主数据库,以避免长时间的服务中断。
MHA组件介绍
MHA Manager(MHA 管理器)
功能:MHA Manager 是 MHA 的控制中心,负责监控 MySQL 主从数据库的健康状态,并在主服务器故障时触发自动故障切换。角色:
监控数据库主从节点的状态。
在主服务器发生故障时,选择健康的从服务器并提升为新的主服务器。
管理数据库节点的配置(如:主库和从库的切换)。
在主库恢复后,自动将恢复的主库重新配置为从库。部署:MHA Manager 通常运行在一个独立的服务器上,不与数据库实例共享。
MHA Node(MHA 节点)
功能:MHA Node 是 MHA 管理器和 MySQL 数据库之间的中介,负责与 MHA Manager 进行通信,并执行主从切换操作。角色:
向 MHA Manager 上报数据库节点(主库和从库)的健康状态。
参与故障切换流程,包括主库的提升和从库的降级。部署:每个 MySQL 实例(主服务器和从服务器)都需要安装和配置 MHA Node,以便与 MHA Manager 通信。
集群规划

服务器初始化
服务器免密
MHA Manager使用SSH登录到主从数据库节点,执行故障检测、切换主库等操作,包括在故障切换过程中通过SSH访问数据库服务器执行切换操作(例如停止服务、修改配置文件等)。
1 | #MHA Manager免密 |
关闭防火墙
1 |
|
配置时间同步
1 | #所有机器 |
MySQL集群部署
选择对应版本下载:

安装MySQL集群
三台MySQL节点操作
1.上传安装包到/usr/local/src目录
1 | [root@test-server02 src]# ll mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz |
2.解压安装包
1 | [root@test-server02 src]# tar -xvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz |
3.移动安装包,重新命名
1 | [root@test-server02 src]# mv mysql-5.7.20-linux-glibc2.12-x86_64 /usr/local/mysql5.7 |
4.设置路径环境变量
1 | [root@test-server02 src] |
5.创建MySQL用户
1 | [root@test-server02 src] |
6.创建MySQL数据目录
1 | [root@test-server02 src]# mkdir -pv /opt/mysqldb/{temp,log,data} |
7.赋予MySQL用户权限
1 | [root@test-server02 src] |
8.初始化MySQL数据目录
1 | [root@test-server02 src]# mysqld --initialize --datadir=/opt/mysqldb/data --user=mysql |
9.配置MySQL
1 | #MySQL Master配置 |
10.创建MySQL启动文件
1 | #三台MySQL节点操作 |
11.启动MySQL
1 | #三台MySQL节点操作 |
12.修改MySQL密码
1 |
|
配置一主两从
1.授予权限
三台MySQL节点操作
1 | #授予该用户进行主从复制所需的权限 |
2.查看二进制文件名和位置信息
master节点操作
1 | mysql> show master status; |
3.配置从节点
Slave 1和Slave 2执行
1 | #根据自己的信息进行修改 |
4.读写分离
Slave 1和Slave 2执行
1 | #两个从库必须设置为只读模式: |
测试MySQL主从
MySQL Master操作
1 | CREATE DATABASE test_db; |
MySQL Slave 1和Slave 2操作
1 | mysql> select * from test_db.test_table; |
赋予MHA用户连接权限
MySQL Master操作即可
1 | mysql> grant all privileges on *.* to 'mha_user'@'192.168.40.%' identified by '123456'; |
安装MHA环境
安装MHA依赖环境
1 | #四台机器全部操作 |
安装MHA Node

四台机器全部安装MHA Node
1.上传部署包到/opt目录
1 | [root@test-server-01 opt]# ll mha4mysql-node-0.58.tar.gz |
2.生成Makefile
1 | [root@test-server-01 opt]# tar -xf mha4mysql-node-0.58.tar.gz |
3.编译安装
1 | [root@test-server-01 mha4mysql-node-0.58]# make && make install |
安装MHA Manager
MHA Manager节点操作
1.上传部署包到opt目录
1 | [root@test-server-01 opt]# ll mha4mysql-manager-0.58.tar.gz |
2.生成Makefile
1 | [root@test-server-01 opt]# tar -xf mha4mysql-manager-0.58.tar.gz |
3.编译安装
1 | [root@test-server-01 mha4mysql-manager-0.58]# make && make install |
配置MHA环境
1.复制相关脚本到/usr/local/bin目录
1 | [root@test-server-01 mha4mysql-manager-0.58]# cp -r samples/scripts /usr/local/bin/ |
2.复制自动切换VIP管理脚本到/usr/local/bin目录。使用该脚本管理VIP
1 | [root@test-server-01 mha4mysql-manager-0.58]# cp -r /usr/local/bin/scripts/master_ip_failover /usr/local/bin/ |
3.修改脚本内容
1 | my $ssh_start_vip = "/sbin/ifconfig $ifdev:$key $vip"; |
上面代码中的$ifdev一开始是直接写的网卡名,发现之后直接改成了变量名但是没做实验,vip如果飘逸不成功可以从这地方排查
注:只需要修改$vip $brdc $ifdev即可
1 | [root@test-server-01 mha4mysql-manager-0.58]# cd /usr/local/bin/ |
4.创建MHA目录并拷贝文件
master_binlog_dir=/opt/mysqldb/data 是MySQL二进制日志文件目录,该目录写错会导致MySQL MHA集群VIP飘逸失败
1 | [root@test-server-01 bin]# mkdir /etc/masterha |
5.MySQL Master机器手动开启VIP
1 | #没有ifconfig提前安装,全部机器安装 |
6.MHA Manager测试
1 | 1.Manager节点测试ssh免密 |
7.启动MHA Manager
1 | #启动MHA |
MySQL MHA高可用集群测试
通过VIP连接MySQL
1 | #通过VIP连接数据库 |
模拟故障测试
1.查看manager日志,观察manager状态
1 | [root@test-server-01 ~] |
2.停止Master MySQL
1 | [root@test-server02 ~] |
3.Slave 1节点查看vip是否飘逸
1 | [root@test-server-03 ~]# ip a |
4.manager日志
1 | #manager日志中最下面出现下方日志就证明已经切换成功了 |
5.查看MySQL状态
登录MySQL Slave2查看从状态
1 | [root@test-server-04 ~]# mysql -uroot -p123456 |
6.故障修复
恢复MySQL
1 | [root@test-server-02 ~] |
主数据库查看master状态
1 | mysql> show master status; |
7.修改MHA配置
由于停掉了MySQL, /etc/masterha/app1.cnf配置里面默认删除一开始定义的[server1],现在新增一下
1 | [root@test-server-01 masterha]# cat /etc/masterha/app1.cnf |
8.MHA测试
1 | 1.Manager节点测试ssh免密 |
9.启动manager
1 | #启动MHA |
到这部署就成功了。

