配置 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 特点 : ============================================
- 10-30s 实现 master failover(故障转移)(9-12s可以检测到主机故障,7-10s可以关闭主机避免 脑裂,在用很短的时间应用差异日志)
- 部署简单,无需对现有 M-S 结构做任何改动( 至少3台,保证切换后仍保持M-S结构)
- 支持手动在线切换(主机硬件维护)发送手动切换指令,downtime几乎很短0.5-2s
- 保证故障切换后多从库数据的 一致性
- 完全自动化的 failover及快速复制架构恢复方案(一主多从)
- 恢复过程包括:选择新主库、确认从库间 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 实践 架构图 ##########################################
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。