作为MySQL高可用性环境下故障切换和主从提升的高可用软件,MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以部署在任何一台从服务器上或者独立的一台机器上,可以管理多个master-slave集群。MHA Node运行再每台数据库服务器上包括主数据库服务器,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

MHA Manager:(在mha4mysql-manager软件包中可以查得到)

masterha_check_ssh              检查MHA的SSH配置状况(是否可以互相无密码进行登录)
masterha_check_repl             检查MySQL复制状况
masterha_manger                   MHA启动脚本
masterha_check_status          检测当前MHA运行状态
masterha_master_monitor      检测master是否停止
masterha_master_switch         控制故障转移
masterha_conf_host                 添加或删除配置的server信息

··
MHA Node:(以下是一些脚本,一般不需要我们手动,而是监控时触发)
/usr/bin/apply_diff_relay_logs
##识别差异的中继日志事件并将其差异的事件应用于其他的slave
/usr/bin/filter_mysqlbinlog
##去除不必要的ROLLBACK事件
/usr/bin/purge_relay_logs
清除中继日志(不会阻塞SQL线程)
/usr/bin/save_binary_logs
##保存和复制master的二进制日志

MHA工作原理:
当MHA manager检测到主数据库服务器已经停止工作,立刻登录到主服务器复制二进制文件,再从slave中挑选出拥有最新的数据的服务器为主服务器,并且其他的slave认他为master,并且同步数据,manager节点再把最新的二进制文件复制给新的master,其他slave在进行登录master进行数据同步。

keepalived介绍:**
keepalived:最主要的目的是能够自己调用ipvsadm命令来生成规则,并且能够自动实现将用户需求的访问地址转移到其他节点上来实现的。

keepalive:在一个节点上提供VIP向外提供服务,当有一个设备宕机了,另一个立刻顶上,并且使用的是同一个虚拟IP。

准备:
1.软件的安装:
MHA:

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm ###yum 源,有些组件在这里可以找到
yum install perl-DBD-MySQL perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN ###安装MHA所需要的组件
rpm -ivh mha4mysql-node-0.57-0.el7.noarch.rpm
yum install perl-Config-Tiny-2.14-7.el7.noarch.rpm
yum install mha4mysql-manager-0.57-0.el7.noarch.rpm
yum install mha4mysql-node-0.57-0.el7.noarch.rpm

keepalived:

  yum install -y  bison libaio-devel  libnl* popt-static openssl-devel libnfnetlink libnfnetlink-devel
    ###所需要的组件

yum install keepalived

2.环境:
(1)必须是半同步复制
(2)需要五台服务器,即三台数据库服务器(一台Master,一台备主,一台从),一台Manager服务器,一台Altas服务器。
(3)MHA架构中的三台数据库服务器都要安装Node节点,四台服务器要能实现ssh无密码登录。
3.实验部署图:

MHA+keepalived-LMLPHP

过程:

MHA配置:
建立主工作目录,并拷贝相应的配置文件模板。

    cp   /root/Soft_Share/mha4mysql-manager-0.57/samples/conf/masterha_default.cnf  /etc/       ## 主配置文件
    cp  /root/Soft_Share/mha4mysql-manager-0.57/samples/conf/app1.cnf    /etc/mha/        ###实例文件

主配置文件:

cat /etc/masterha_default.cnf

[server default]
user=mary
#设置监控用户mary
password=123123
ssh_user=root
#设置ssh的登录用户名
master_binlog_dir= /data/mysql-binlog
#设置master 保存binlog的位置
ping_interval=3
设置监控主库,发送ping包的时间间隔,尝试三次没有回应的时候自动进行failover

实例文件:

cat /etc/mha/app1.cnf
 [server1]
 hostname=192.168.72.129
candidate_master=1
#设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave,
check_repl_delay=0

默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master, 因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0, MHA触发切换在选择一个新的master的时候将会忽略复制延时, 这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master。
port=3306
[server2]
hostname=192.168.72.141
candidate_master=1
check_repl_delay=0
port=3306
[server3]
hostname=192.168.72.142
port=3306
no_master=1

进行ssh无密码登录是否成功(四台服务器)

MHA+keepalived-LMLPHP
复制状态监测:
MHA+keepalived-LMLPHP
MHA+keepalived-LMLPHP
开始启动 MHA 集群
masterha_manage --conf=/etc/mha/app1.cnf & #放在后台

MHA+keepalived-LMLPHP

keepalived配置:
一个主和备主都要安装keepalived软件,并且都要进行配置
配置192.168.72.129(matser),在同优先级情况下。

cat /etc/keepalived/keepalived.conf

#GLOBAL CONFIGURATION:全局配置段
global_defs {
route_id mha #路由标识
}
#VRRPD CONFIGURATION : 配置vrrp协议相关子进程工作方式;
vrrp_instance VI_1 {
 state MASTER 初始状态
 interface ens33 网卡
 virtual_router_id 51 虚拟ID,两个这里要一样
 priority 100  初始优先级,谁先获得这个虚拟ip,如果同级则看statemaster,如果为master则优先。
    advert_int 1  通告有几个
    authentication {
    #认证机制
        auth_type PASS
        auth_pass 1111
    }
    #LVS CONFIGURATION:LVS配置;
    virtual_ipaddress {
        192.168.72.188 设置的虚拟IP
    }
    }
    `````

配置192.168.72.141(备master)

 state BACKUP 初始状态-----只有这个地方不一样
 virtual_router_id 51 这个要一样
 priority 100 在同优先级情况下

看是否配置成功(一般情况下,在同优先级情况下,state为master先抢占VIP)

keepalived -D ##启动keepalived
ip a          ###来查看是否配置成功

MHA+keepalived-LMLPHP

用自动化脚本来切换VIP(不用手动)

#!/bin/bash
while [ 1 -lt 2 ]
do
sleep 1
/usr/local/mysql57/bin/mysql -e "show slave status\G;"1>/dev/null 2>&1 |grep -E “Slave_(SQL|IO)” 1>>/dev/null 2>&1
if [ $? -eq 0 ] || [ -z “netstat -ntl|grep "\<3306\>"|awk '{print $1}'” ]
then
killall keepalived 1>/dev/null 2>&1
else
ps aux |grep keepalived|grep -v “grep” 1>>/dev/null 2>&1
if [ $? -ne 0 ]
then
keepalived -D
fi
fi
done

10-07 15:40