MHA(Master High Availability)是由日本人yoshinorim开发的一款成熟且开源的MySQL高可用程序,它实现了MySQL主从环境下MASTER宕机后能够自动进行单次故障转移的功能,其本身由perl语言编写,安装方便使用简单。
该软件由两部分组成:MHA Manager(管理节点)和 MHA Node(数据节点)。MHA Manager 可以单独部署在一台独立的机器上管理多个 master-slave 集群,也可以部署在一台 slave 节点上。MHA Node 运行在每台 MySQL 服务器上,MHA Manager 会定时探测集群中的 master 节点,当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master,然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明。
以下是MHA的工作流程,Manager节点通过masterha_manager脚本启动MHA后会先进行检查工作:
检查工作均完成且确认无误后,Manager节点会进行监控工作:
当主库宕机后,会开始故障转移工作,首先会对SLAVE进行选主,有以下3种算法:
当选主完成后,Manager节点会再次通过SSH链接已宕机主库,有以下2种情况发生:
当所有库的数据一致性被确保之后,所有从库都将会与新主库建立主从关系,同时旧的已宕机主库信息将会从Manager项目配置文件中移除,至此整个MHA软件服务结束,Manager不会再对Node进行管理,接下来需要管理员手动对已宕机主库进行排查恢复,并且手动搭建旧主库与新主库之间的主从关系然后重新启动整个MHA服务。
MHA高可用架构 - 知乎 (zhihu.com)
本次所用主机系统版本均为centos7,mysql版本为5.7.37
服务列表 | IP地址 |
---|---|
mysql主节点(Master) | 192.168.80.20 |
mysql从节点1 | 192.168.80.25 |
mysql从节点2 | 192.168.80.30 |
MHA Manager | 192.168.80.35 |
1.首先关闭所有虚拟机的防火墙与SElinux。
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.配置主机名
为方便操作时区分各个主机,分别设置Master,Slaver1,Slaver2节点主机名称为mysql_master,mysql_slaver1,mysql_slaver2.
hostnamectl set-hostname mysql_master
hostnamectl set-hostname mysql_slaver1
hostnamectl set-hostname mysql_slaver2
su
3.修改 Master、Slaver1、Slaver2 节点的 Mysql主配置文件/etc/my.cnf,配置主从同步。
##Master 节点##
vim /etc/my.cnf
[mysqld]
server-id = 1
log_bin = master-bin
log-slave-updates = true
systemctl restart mysqld
##Slave1、Slave2 节点##
vim /etc/my.cnf
server-id = 2 / 3 #三台服务器的 server-id 不能一样
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
systemctl restart mysqld
4.在 Master、Slave1、Slave2 节点上都创建两个软链接
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
5.配置 mysql 一主两从
(1)权限配置
mysql -uroot -pabc123
grant replication slave on *.* to 'myslave'@'192.168.80.%' identified by '123'; #从数据库同步使用
grant all privileges on *.* to 'mha'@'192.168.80.%' identified by 'manager'; #manager 使用
grant all privileges on *.* to 'mha'@'mysql_master' identified by 'manager'; #防止从库通过主机名连接不上主库
grant all privileges on *.* to 'mha'@'mysql_slaver1' identified by 'manager';
grant all privileges on *.* to 'mha'@'mysql_slaver2' identified by 'manager';
flush privileges;
(2)在 Master 节点查看二进制文件和同步点
##Master 节点##
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 1765 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
(3)在 Slave1、Slave2 节点执行同步操作
(3)在 Slave1、Slave2 节点执行同步操作,注意log_pos需要与主的查询一致
change master to master_host='192.168.80.20',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=1765;
start slave;
(4)在 Slave1、Slave2 节点查看数据同步结果
show slave status\G
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
(5) Slave1、Slave2开启只读模式。
set global read_only=1;
(6)插入数据测试数据库同步
##在 Master 主库插入条数据,测试是否同步##
create database canyun_db;
use canyun_db;
create table test(id int);