配置 MHA (MHA+半同步复制+KeepAlive ) ##############################

mha简介
MHA,即 MasterHigh Availability Manager and Tools for MySQL,是日本的一位 MySQL专家采用Perl语言编写的一个脚本管理工具,

该工具仅适用于MySQLReplication(二层)环境,目的在于维持 Master主库的高可用性。

MHA是自动的master故障转移 和 Slave提升 的软件包。它是基于标准的MySQL复制(异步/半同步)。

MHA有两部分组成:MHA Manager(管理节点) 和 MHA Node(数据节点)。

MHA Manager可以单独部署在一台独立机器上管理多个master-slave集群,也可以部署在一台 slave上。

MHA Manager 组件可探测集群的 各个node节点,当发现master出现故障的时候,
它可以自动将具有最新数据的slave,或者我们指定的某个 Slave
提升为新的master,然后将所有其它的slave导向新的master上。
整个故障转移过程对应用程序是透明的。

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

MHA 特点 : ============================================

  1. 10-30s 实现 master failover(故障转移)(9-12s可以检测到主机故障,7-10s可以关闭主机避免 脑裂,在用很短的时间应用差异日志)
  2. 部署简单,无需对现有 M-S 结构做任何改动( 至少3台,保证切换后仍保持M-S结构)
  3. 支持手动在线切换(主机硬件维护)发送手动切换指令,downtime几乎很短0.5-2s
  4. 保证故障切换后多从库数据的 一致性
  5. 完全自动化的 failover及快速复制架构恢复方案(一主多从)
  6. 恢复过程包括:选择新主库、确认从库间 relaylog 差异、新主库应用必要语句、其他从库同步差异语句、重新建立复制连接
    master crash(主碰撞) 不会导致主从数据不一致性
    当master crash后,MHA自动识别 slave间 relay logevents的不同,然后应用与不同的slave,最终所有slave都同步。
    结合通过半同步一起使用,几乎没有任何数据丢失。
    MHA node运行在每台mysql服务器上,Manager可以单独部署一台机器,监控100+以上master,总服务器数量不会有太大增加。
    需要注意的是Manager也可以运行在slaves中的一台机器上。

故障切换的过程描述:

1、等待SQL线程执行完毕
2、解析最新的Slave上的中继日志(relay log)的日志头(log Header),为其他各个服务器确定出差异位置
3、将i1–>i2–>X 全部组成一个二进制日志

MHA工作原理总结为以下几条: =====================

(1)从宕机崩溃的master保存二进制日志事件( binlog events SSH );
(2)识别含有最新更新的slave;
(3)应用差异的中继日志 (relay log) 到其他 slave;
(4)应用从master 保存的二进制日志事件 (binlog events);
(5)提升一个slave为新master;
(6)使用其他的slave连接新的master进行复制。

MHA 实践 架构图 ##########################################

mha高可用架构部署总结 mha高可用原理_sql


what: MHA 主高可用的方案

w:why 提供主的高可用,自动切换,自动补齐,自动将从导向新主,

w

环境要求:

由于主节点有可能会被切换成从节点,而每一个从节点也有可能会被切换成主节点,所以  MHA 对 Mysql 复制环境有特殊要求。

(1)各节点 都要开启 二进制日志  及 中继日志;
(2)各从节 点必须 显示  注明其为 read_only;
(3)关闭各从节点的  relay_log_purge =0   中继日志 自动清理功能
(4)这里建议更换 为   编译版本的  Mysql 5.7 ,否则该实验中的某些   RPM  组件会冲突!!!
(5)所有 Mysql 集群节点,相互之间 ssh 登录都不需要密码  (重要)
(6)主从复制 (M-S-S) 架构已经做好! ( 支持使用 GTID , 半同步复制 )
(7) 各个节点,要能允许 同一组账号   uplooking  123123  进行登录 
(8) 各个节点,关闭 防火墙  和 SElinux 功能。

1、在 Manager 节点 安装 manger 和 node 组件 =====================================

########## 在 192.168.217.30 上操作。 安装 manager 组件

==1 、 先使用 本地源 源 安装以下组件。

[root@mha-90 ~]# yum install perl-DBD-MySQL perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN

==2、安装 mha4mysql-node 包 ## 一定先安装 Node 包。

[root@mha-90 ~]# rpm -ivh mha4mysql-node-0.57-0.el7.noarch.rpm ##有提供

==3、 yum install perl-Config-Tiny-2.14-7.el7.noarch.rpm ## 老师提供

==4、安装 fedora 的 EPEL 源。

以上几个软件包不太好找,很多 yum 源中没有,下面是找到的一个能够完全这些组件的yum 源。
     本地源无法完全解决以上的依赖关系,需要配合网络源,

[root@mha-90 ~]# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

同时需要配合本地光盘yum源,它能提供大部分 Perl 的环境组件。
    安装后获得以下 yum源信息。

==5、 yum install mha4mysql-manager-0.57-0.el7.noarch.rpm ## 网络慢的话,会卡顿。

安装成功

客户端软件包依赖关系:

安装 完毕后,检查一下 释放的程序 。
[root@Mysql yum.repos.d]# rpm -ql mha4mysql-manager
 /usr/bin/masterha_check_repl ## 检查MySQL复制状况
 /usr/bin/masterha_check_ssh ##检查MHA的SSH配置状况
 /usr/bin/masterha_check_status ## 检测当前MHA运行状态
 /usr/bin/masterha_conf_host ##添加或删除配置的server信息
 /usr/bin/masterha_manager ## MHA的启动脚本
 /usr/bin/masterha_master_monitor ##检测master是否宕机
 /usr/bin/masterha_master_switch ##控制故障转移 (自动或者手动)
 /usr/bin/masterha_secondary_check ##二次检查脚本
 /usr/bin/masterha_stop


。。。。。
。。。。。

/usr/share/perl5/vendor_perl/MHA/Config.pm ## 其他的相关组件。
 /usr/share/perl5/vendor_perl/MHA/DBHelper.pm
 /usr/share/perl5/vendor_perl/MHA/FileStatus.pm
 /usr/share/perl5/vendor_perl/MHA/HealthCheck.pm
 /usr/share/perl5/vendor_perl/MHA/ManagerAdmin.pm
 /usr/share/perl5/vendor_perl/MHA/ManagerAdminWrapper.pm
 /usr/share/perl5/vendor_perl/MHA/ManagerConst.pm
 /usr/share/perl5/vendor_perl/MHA/ManagerUtil.pm
 /usr/share/perl5/vendor_perl/MHA/MasterFailover.pm
 /usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm
 /usr/share/perl5/vendor_perl/MHA/MasterRotate.pm
 /usr/share/perl5/vendor_perl/MHA/SSHCheck.pm
 /usr/share/perl5/vendor_perl/MHA/Server.pm
 /usr/share/perl5/vendor_perl/MHA/ServerManager.pm

######## 除了 manager 之外的 各个Mysql节点 安装 安装 node 组件。

################################################################

yum install   perl-DBD-MySQL    perl-ExtUtils-CBuilder  perl-ExtUtils-MakeMaker   perl-CPAN
    yum install  mha4mysql-node-0.57-0.el7.noarch.rpm
         
         ################################################################

[root@Mysql Soft_Share]# rpm -ql mha4mysql-node

获得以下几个脚本,一般不需要我们手动执行,由监控程序触发

/usr/bin/apply_diff_relay_logs ##识别差异的中继日志事件并将其差异的事件应用于其他的slave
 /usr/bin/filter_mysqlbinlog ##去除不必要的ROLLBACK事件(MHA已不再使用这个工具
 /usr/bin/purge_relay_logs ##清除中继日志(不会阻塞SQL线程)
 /usr/bin/save_binary_logs ##保存和复制master的二进制日志

。。。。。其他相关组件

/usr/share/perl5/vendor_perl/MHA/BinlogHeaderParser.pm
 /usr/share/perl5/vendor_perl/MHA/BinlogManager.pm
 /usr/share/perl5/vendor_perl/MHA/BinlogPosFindManager.pm
 /usr/share/perl5/vendor_perl/MHA/BinlogPosFinder.pm
 /usr/share/perl5/vendor_perl/MHA/BinlogPosFinderElp.pm
 /usr/share/perl5/vendor_perl/MHA/BinlogPosFinderXid.pm
 /usr/share/perl5/vendor_perl/MHA/NodeConst.pm
 /usr/share/perl5/vendor_perl/MHA/NodeUtil.pm
 /usr/share/perl5/vendor_perl/MHA/SlaveUtil.pm
###########################################################

另外我们可以再 MHA 的 源代码 包中获得一些功能  脚本,这些脚本不是必须,或者我们可
以用其他的方式去实现。

所以我们还需要准备一个相应版本的源码包。

复制相关脚本到/usr/local/bin目录  (manager 服务器执行)
[root@Mysql scripts]# scp /root/Soft_Share/mha4mysql-manager-0.57/samples/scripts/*   /usr/local/bin/

master_ip_failover                #自动切换时vip管理的脚本,不是必须,如果我们使用keepalived的,
                                            我们可以自己编写脚本完成对vip的管理,比如监控mysql,如果mysql异常,我们停止keepalived就行,这样vip就会自动漂移
master_ip_online_change     #在线切换时vip的管理,不是必须,同样可以可以自行编写简单的shell完成
power_manager                   #故障发生后关闭主机的脚本,不是必须
send_report                         #因故障切换后发送报警的脚本,不是必须,可自行编写简单的shell完成。

###########################################################

3、 在Manager上 , 提供配置文件模板(来自源码包) ########################

创建以下两个文件

/etc/masterha_default.cnf ##服务器全局配置文件
 /etc/mha/app1.cnf ##实例文件。(主机列表)

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

[root@Mysql conf]# mkdir /etc/mha
 [root@Mysql conf]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/mha/ ###实例文件
 [root@Mysql mha]# cp /root/mha4mysql-manager-0.57/samples/conf/masterha_default.cnf /etc/ ## 主配置文件

建立MHA 日志目录

[root@Mysql ~]# mkdir -p /var/log/mha/app1
主配置文件模板如下
[root@Mysql ~]# cat /etc/masterha_default.cnf
[server default]
 user=uplooking ##自行修改
 password=123123
 ssh_user=root
 master_binlog_dir= /bin-log ## 二进制日志所在路径。
 ping_interval=3 ## 设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover
 manager_log=/var/log/mha/app1/manager.log ####remote_workdir=/data/log/masterha
 #secondary_check_script= masterha_secondary_check -s remote_host1 -s remote_host2master_ip_failover_script= /script/masterha/master_ip_failover
shutdown_script= /script/masterha/power_manager
report_script= /script/masterha/send_report
master_ip_online_change_script= /script/masterha/master_ip_online_change

配置实例文件 app1.cnf

[root@mha-9 ~]# mkdir -p /etc/mha
 [root@server-130 ~]# cat /etc/mha/app1.cnf[server1]
 hostname=192.168.10.80
 candidate_master=1
 check_repl_delay=0
 port=3306[server2]
 hostname=192.168.10.81
 candidate_master=1
 check_repl_delay=0
 port=3306[server3]
 hostname=192.168.10.82
 port=3306
 no_master=1[server4]
 hostname=192.168.10.83
 port=3306
 no_master=1

########### 备注 ##########################

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

保存两个配置文件,进入检查阶段。
进行 ssh 和 复制 架构的检查 : =========================

[root@Mysql mha]# masterha_check_ssh --conf=/etc/mha/app1.cnf

复制状态的检测

[root@Mysql mha]# masterha_check_repl --conf=/etc/mha/app1.cnf

要求:

1、 只能有一台主 可写,其余主机(包括备主)都要设置 read_only=ON
注意不是 : super_read_only ( 给单纯的从服务器)。

2、 所有的主机必须具有相同的日志过滤器规则。
3、 所有主机的 SQL 线程 和 IO 线程 必须工作正常。

开始启动 MHA 集群

启动:
[root@Mysql conf]# masterha_manager --conf=/etc/mha/app1.cnf &

集群监控服务,会在 后台运行, 每执行一次 切换,它就会自动退出,下次监控需要我们再次启动。。。

查看状态:
[root@Mysql conf]# masterha_check_status --conf=/etc/mha/app1.cnf

停止:
[root@oraclem1 mha4mysql-manager-0.56]#masterha_stop --conf=/etc/mha/app1.cnf

测 试 1:==================================

1、 在当前 Mysql 主服务器 上, 进行 一个失败演示。 

           killall  mysqld   (丢失从服务器状态的配置信息,逼真,恢复时需要重新   change master to )
           
           mysql.server   stop   ( 正常停止,可能会保存从状态的配置信息,重新启动时,能自动认到当前的主服务器 )
           
2、回到 manager 上进行观察。

        
  
  3、 第一次 切换完成后,  192.168.10.17 (下线)  192.168.10.18 (新主)  192.168.10.19 (改变master 的指向。)

    ####################################################################
    mha 监控不是一个服务型进程,每次切换后,集群监控进程会退出,并且会留下一个   /var/tmp/app1.failover.complete 
    下一次要修复后,要重新开启 集群功能,  必须要重新 运行 
    
    masterha_manager  --conf=/etc/mha/app1.cnf &
    
        并且 删除 
     
    /var/tmp/app1.failover.complete 

  4、恢复,将 死掉主   192.168.10.17  重新加入 集群, 此时不能够抢夺 当前 192.168.10.18 的 Master ,而是以 一个 从 服务器的形式,进行加入。
        
      修复程序,启动 服务 ,进入  mysql 

      mysql> CHANGE MASTER TO MASTER_HOST='192.168.217.21', MASTER_USER='uplooking', MASTER_PASSWORD='123123', MASTER_AUTO_POSITION=1;
      mysql> start slave;
      mysql> show slave status \G 
      
   5、修复后
    
         192.168.10.17 (从/备主)  192.168.10.18 (主)  192.168.10.9 (从,跟 18)
                                                                |
                                                    show processlist; (两个从线程)

测试2: 实现 MHA manage 以 服务形式工作 =============================

masterha_manager  --conf=/etc/mha/app1.cnf &
|
切换 ----》 死掉      /var/tmp/app1.failover.complete 
|
死主    主    从 ====》  masterha_manager  --conf=/etc/mha/app1.cnf & 无法运行,报少主 退出。
|
死主--从/备主     主     从 ===》能够启动。
|
切换后, 能自动删除, 并且能够 不断尝试启动, 一直等到  备主   恢复上线。  开始运行。


    自动为下一次 切换,做好 准备。

进行 KeepAlived 的安装,实现 VIP 自动漂移 :=============================

MHA + KeepAlived + 半同步复制 方案

keepalived 是什么 ############################################

keepalived 是集群管理中保证集群高可用的一个 轻量级 服务软件,其功能类似于heartbeat,用来防止单点故障。

keepalived 工作原理 ############################################

keepalived是以 VRRP 协议为实现基础的,VRRP全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将 N台提供相同功能的路由器组成一个路由器组,
这个组里面有一个master和多个backup,master上面有一个对外提供服务的 vip (该路由器所在局域网内其他机器的默认路由为该vip),

master会发组播,当 backup 收不到 vrrp包 时就认为master宕掉了,
这时就需要根据 VRRP的优先级来选举一个backup当master。
这样的话就可以保证路由器的高可用了。

keepalived主要有三个模块,分别是core、check 和 vrrp。

core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
check负责健康检查,包括常见的各种检查方式。
vrrp模块是来实现VRRP协议的。

keepalived 的配置文件 ############################################

keepalived 只有一个配置文件 keepalived.conf,里面主要包括以下几个配置区域,

分别是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance 和 virtual_server。

开始安装 : ======================================

1、在 192.168.10.17 192.168.10.18 (两个主服务器 ) 分别安装 KeepAlived ##################

[root@server-13 ~/.ssh]# yum install  keepalived

2、 修改配置文件 (简易配置) ####################################

[root@server-13 /test]# cat /etc/keepalived/keepalived.conf
global_defs {
 router_id mha17
 }vrrp_instance mha1 {
 state MASTER
 interface ens33
 virtual_router_id 51
 priority 100
 advert_int 1
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 virtual_ipaddress {
 192.168.10.88
 }
 }

3、 192.168.10.17 192.168.10.18 分别 启动 Keep Alived 服务 #######################

systemctl  start keepalived  
       keepalived  -D    也能直接启动。 
       ps axu  查看进程。
        

   
 ip  a  命令,观察  虚拟IP 在哪台主机上

4、 测试KeepAlied ####################################

例如当前 VIP 在 192.168.10.17  则,   在 192.168.10.17  和 192.168.10.18  上,分别都运行者 KeepAlived
    
    杀死  192.168.10.17 的 KeepAlived 进程, 去 192.168.10.18 上,用 ip a 命令 观察  VIP  192.168.10.88 是否 漂移到  192.168.10.18 上。
    
    再将  192.168.10.17 的 KeepAlived 启动, 此时,不会抢夺 192.168.10.18 的  VIP, (两边权重一致 都是  100 )
    
    又将 192.168.10.18 的 KeepAlived 进程杀死,观察 VIP 是否能 移动会  192.168.10.15

5、编写脚本,让 KeepAlived 的动作,与 MHA (Mysql的状态) 集群,联动。 ###################

目的: 
        通过自行开发的脚本 ,让  VIP 和 当前的 Mysql的 主, 在一起。
        当一个 Master  服务器 失败,则它的 VIP 应该要漂移至新的Master 上
[root@server-13 /test]# cat mha-mon.sh
[root@mysql-11 /test]# cat master-mon.sh #!/bin/bash
PATH=$PATH:/usr/local/mysql57/bin
while [ 1 -lt 2 ]
 do
 sleep 3
 mysql -e “select user();” > /dev/null 2>&1if [ $? -eq 0 ]
 then
 stat=mysql -e "show slave status\G" | wc -l if [ $stat -ne 0 ]
 then
 systemctl stop keepalived
 else
 keep=ps aux | grep "keepalived" | grep -v "grep" | wc -l if [ $keep -eq 0 ]
 then
 systemctl start keepalived
 else
 continue
 fi
 fi
 else
 systemctl stop keepalived
 continue
 fi
 done
##  在 两个主 节点上,分别  放入后台运行。  当 MHA 发生切换时, 就可以联动的 把 VIP 切入新 的 Master。