MHA:Master HA(主从结构的高可用方案)只是实现了对主节点高可用,它是建构在mysql主从复制结构之上的,也就是说需要事先把mysq配置成传统的复制集群。

MHA在监控到master节点故障时,会提升其中拥有最新数据的slave节点称为新的master,在此期间,MHA会通过其它从节点获取额外信息来避免一致性方面的问题。MHA还提供了master节点在线切换的功能,即按需切换master/salve节点。


MHA服务有两种角色,MHA Manager(管理节点)和MHA Node(数据节点):

MHA Manager:通常单独部署在一台独立的机器上管理多个master/slave集群,每个master/slave集群称作一个Application;

MHA Node:运行在每台MySQL服务器上(master/slave/manager),它通过监控具备分析和清理logs功能的脚本来加快故障转移。


MySQL复制集群中的master故障时,MHA按如下步骤进行故障转移:

一旦主节点掉线,主节点上会有丢失的事件还没有复制到从节点上,为了避免出现事件丢失而导致数据不一致,MHA会在管理节点上保存一份主节点上二进制日志事件的副本;因此,当主节点掉线后,从管理节点上保存的事件中就能读出所有的事件,并且查找从各从节点中的中继日志中事件指针指向的位置,来判断哪个节点与主节点的事件更接近,并把管理节点本地备份冗余的二进制日志事件读出处理应用在这个最接近的从节点上,使这个从节点与主节点事件同步,并把其它从节点的主节点指向这个被修复的最近从节点,从而提升这个从节点提升了新的主;

为了完成这个功能MHA强依赖与ssh服务;因为它要通过ssh协议从主节点不断读取各种数据,把二进制日志事件同步到本地,以保证主节点掉线本地仍能获取到二进制日志事件;

然后,就在最近的从节点上重放管理节点上的事件,实现拥有与掉线的主节点一样的数据;


实验环境:物理机win7,虚拟机4台centos7

node1:MHA Manager

node2:MariaDB master

node3:MariaDB slave

node4:MariaDB slave


各节点的/etc/hosts文件配置内容添加:

192.168.255.2 node1.stu11.com node1

192.168.255.3 node2.stu11.com node2

192.168.255.4 node3.stu11.com node3

192.168.255.5 node4.stu11.com node4


首先,配置一个msyql主从复制结构:

安装MariaDB5.5,细节略。


在node2:

]# vim /etc/my.cnf

使用MHA对mysql主从架构中的主节点做高可用_第1张图片

]# systemctl start mariadb.service

查看二进制日志事务的位置:

使用MHA对mysql主从架构中的主节点做高可用_第2张图片

注意:一定要在创建拥有复制权限的账号之前查看二进制日志事务的位置:这两个从节点也都需要用到这个复制权限账号,因为它们其中一个都有可能会成为新的主节点;它们也都需要创建一个拥有复制权限的账号被其它节点复制二进制日志;


> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'192.168.255.%' IDENTIFIED BY 'replpass';


> FLUSH PRIVILEGES;


在node3:

]# vim /etc/my.cnf

使用MHA对mysql主从架构中的主节点做高可用_第3张图片

]# systemctl start mariadb.service


> CHANGE MASTER TO MASTER_HOST='192.168.255.3',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='master-bin.000005',MASTER_LOG_POS=245;


>  START SLAVE;

使用MHA对mysql主从架构中的主节点做高可用_第4张图片


在node4:

]# vim /etc/my.cnf

使用MHA对mysql主从架构中的主节点做高可用_第5张图片

]# systemctl start mariadb.service


> CHANGE MASTER TO MASTER_HOST='192.168.255.3',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='master-bin.000005',MASTER_LOG_POS=245;


> START SLAVE;

使用MHA对mysql主从架构中的主节点做高可用_第6张图片


以上配置完成mysql的主从复制结构。


在node2:创建一个拥有管理权限的用户账号且能够远程连接;

> GRANT ALL ON *.* TO 'mhauser'@'192.168.255.%' IDENTIFIED BY 'mhapass';

> FLUSH PRIVILEGES;



在node1:

]# ssh-keygen -t rsa -P ''

在一个主机生成密钥对,让其余每个节点都有私钥即可实现相互ssh通信;


设定密钥权限为600:

]# chmod go=  .ssh/authorized_keys


把私钥和认证文件复制到各节点一份:

]# scp -p .ssh/id_rsa .ssh/authorized_keys node2:/root/.ssh

]# scp -p .ssh/id_rsa .ssh/authorized_keys node3:/root/.ssh

]# scp -p .ssh/id_rsa .ssh/authorized_keys node4:/root/.ssh


node1安装node和manager程序包:node2,3,4安装安装MHA的node:

mha4mysql-manager-0.56-0.el6.noarch.rpm

mha4mysql-node-0.56-0.el6.noarch.rpm


]# yum install mha4mysql-*


]# mkdir /etc/masterha

]# vim /etc/masterha/app1.cnf

使用MHA对mysql主从架构中的主节点做高可用_第7张图片


]# masterha_check_ssh --conf=/etc/masterha/app1.cnf

显示:[info] All SSH connection tests passed successfully

表示各节点间ssh互信通信成功;


]# masterha_check_repl --conf=/etc/masterha/app1.cnf

输出信息最后一行类似如下信息,表示其通过检测:

MySQL Replication Health is OK


此时,MHA高可用mayql主从复制配置完成,可演示当,node2主节点掉线,由node3,4其中之一提升为新的主节点;


在node2:

]# killall mysqld mysqld_safe


在node4:

查看,可显示为已经更换了新的主节点;

使用MHA对mysql主从架构中的主节点做高可用_第8张图片

实现当主节点掉线,从节点之中自动切换为一个新的主节点上来;此时,MHA已经完成mysql的主从自动切换;


当掉线的主节点再次加入到主从结构中时,要在新主节点上做一次备份,并且记录日志的名字和位置;把这个备份的内容导入到新增加的这个从节点上,让从节点从指定的位置开始往后复制即可;