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
]# systemctl start mariadb.service
查看二进制日志事务的位置:
注意:一定要在创建拥有复制权限的账号之前查看二进制日志事务的位置:这两个从节点也都需要用到这个复制权限账号,因为它们其中一个都有可能会成为新的主节点;它们也都需要创建一个拥有复制权限的账号被其它节点复制二进制日志;
> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'192.168.255.%' IDENTIFIED BY 'replpass';
> FLUSH PRIVILEGES;
在node3:
]# vim /etc/my.cnf
]# 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;
在node4:
]# vim /etc/my.cnf
]# 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;
以上配置完成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
]# 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的主从自动切换;
当掉线的主节点再次加入到主从结构中时,要在新主节点上做一次备份,并且记录日志的名字和位置;把这个备份的内容导入到新增加的这个从节点上,让从节点从指定的位置开始往后复制即可;