探索MySQL高可用架构之MHA(6)
-----构建mysql高可用系列(共9篇)
上一篇文章介绍了本次架构的Atlas读写分离!
本篇文章主要介绍本次架构中的keepalive部分!
什么是Keepalived呢????
keepalived是一款c语言写的实现在linux系统上实现负载均衡和高可用的软件。它遵从于GNU是一款优秀的开源软件。keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障的发生。
两个关键词的解释
负载均衡
keepalived内置了对ipvs函数的调用支持。可以直接在keepalived中按照语法配置ipvs然后keepalived就可以实现对ipvs的配置。
高可用
keepalived是以VRRPVirtual Router Redundancy Protocol协议为实现基础的即虚拟路由冗余协议。虚拟路由冗余协议可以认为是实现路由器高可用的协议即将N台提供相同功能的路由器组成一个路由器组这个组里面有一个master和多个backupmaster上面有一个对外提供服务的vip该路由器所在局域网内其他机器的默认路由为该vipmaster会发组播当backup收不到vrrp包时就认为master宕掉了这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
本套架构中keepalive的作用????
由于mysql+replication方案中master和slave的关系是一对多的关系,整个系统中只有一个master节点(写入节点),多个slave节点,那么master节点一旦down机后,整个系统的数据写入操作将瘫痪,对系统造成严重后果。为此引入了keepalive工具,让这个系统的master和slave关系是多对多的关系,对master节点进行双机热备,以达到整个系统的高可用性。其中keepalive工具负责对两个master节点进行不间断监听,一旦工作中的master节点停止工作后,那么备份master节点就会接管 ,让这个系统正常工作。向外提供一个虚拟ip以供proxy访问master,虚拟ip对应了两个实ip的maser节点。
下面就让我们开始操作吧:
源码包安装keepalive
tar
zxf keepalived-1.2.2.
tar
.gz
#解压源码包
cd
keepalived-1.2.2
#进入目录
./configure
--sysconf=
/etc
--with-kernel-
dir
=
/usr/src/kernels/2.6.18-164.el5-x86_64
#configure编译
make
&&
make
install
#安装
cp
/usr/local/sbin/keepalived
/sbin/keepalived
#拷贝可执行命令
service keepalived start
#启动keepalive服务
service keepalived stop
#关闭keepalive服务
解决方法:
cd
keepalived-1.2.2
#进入源码目录
vi
keepalived
/libipvs-2
.6
/ip_vs
.h
#修改如下
(1)
#include
#找到上面这一行
(2)
#include
#把(1)这一行,放在(2)代码下面,接下来顺利make了。
编辑keepalived资源配置文件
vi
/etc/keepalived/keepalived
.conf
#修改如下
! Configuration File
for
keepalived
global_defs {
router_id MYSQL-ha
#为router_id命名
}
vrrp_script check_running {
script
"/etc/keepalived/keepalived_check_mysql.sh"
#判断实例是running的脚本
interval 5
#每5秒执行一次,判断实例是running的脚本
}
vrrp_instance PWRD_1 {
#指定vrrp_instance实例
state BACKUP
#指定状态为备份
interface bond0
#网络端口为bond0
virtual_router_id 88
priority 150
#[另一台是100] #本机权重
advert_int 1
nopreempt
#[另一台不加] #当主机恢复时,不抢占
authentication{
auth_type PASS
#密码验证
auth_pass 99999
}
virtual_ipaddress {
10.142.132.49
#指定VIP
}
track_script {
check_running
}
notify_master/etc/keepalived/master.sh
#当前服务器为主时,觖发执行的脚本
notify_backup/etc/keepalived/slave.sh
#当前服务器为备时,觖发执行的脚本
notify_fault/etc/keepalived/notify_fault.sh
#当前服务器出现问题时,觖发
执行的脚本
notify_stop/etc/keepalived/down.sh
#当前服务器为down时,觖发执行的脚本
}
编写判断mysql服务是否正常的脚本
vi
keepalived_check_mysql.sh
#增加如下内容
#!/bin/bash
MYSQL=/app/mysql/bin/mysql
#指定mysql命令
MYSQL_HOST=localhost
#指定主机IP
MYSQL_USER=root
#指定Mysql登录用户
MYSQL_PASSWORD=mysql
#指定Mysql登录密码
CHECK_COUNTS=3
#控制循环次数变量
#mysql is working MYSQL_OK is 0 , mysql isnot working MYSQL_OK is 1
MYSQL_OK=0
#标识mysql状态变量
function
check_Mysql_Runing (){
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD}-e
"show grants;"
>
/dev/null
2>&1
#在操作系统层面,调用mysql命令
if
[ $? = 0 ] ;
then
MYSQL_OK=0
#如果上面操作成功,证明Mysql正常
else
MYSQL_OK=1
#如果上面操作不成功,证明Mysql不正常
fi
return
$MYSQL_OK
#返回Mysql状态
}
while
[ $CHECK_COUNTS -
ne
0 ]
#循环控制
do
let
"CHECK_COUNTS -= 1"
#CHECK_COUNTS变量做自减1
check_Mysql_Runing
#调用上面的函数
if
[ $MYSQL_OK= 0 ] ;
then
#MYSQL_OK=0,mysql工作正常
echo
"mysql is runing!"
exit
0
fi
if
[ $MYSQL_OK-
eq
1 ] && [ $CHECK_COUNTS -
eq
0 ]
#MYSQL_OK=1和CHECK_COUNTS=0,mysql没有正常运行
then
echo
"mysql is not runing!"
exit
1
fi
sleep
1
#休眠1秒
done
编写当前服务器为主时的脚本
vi
/etc/keepalived/master
.sh
#增加如下内容
#!/bin/bash
echo
"#`date +"
%Y-%m-%d%H:%M
"` change master status!!! "
>>
/etc/keepalived/change.log
#输出当前时间到日志中
编写当前服务器为备时的脚本
vim/etc/keepalived/slave.sh
#!/bin/bash
echo
"#`date +"
%Y-%m-%d%H:%M
"` change slave status!!!"
>>
/etc/keepalived/change.log
#输出当前时间到日志中
编写当前服务器不正常时的脚本
vim/etc/keepalived/notify_fault.sh
#!/bin/bash
echo
"#`date +"
%Y-%m-%d%H:%M
"` change notify_fault status!!!"
>>
/etc/keepalived/change.log
#输出当前时间到日志中
sleep
3
#休眠3秒
echo
"#`date +"
%Y-%m-%d%H:%M
"` try startup mysql!!!"
>>
/etc/keepalived/change.log
#输出当前时间到日志中
service mysql start
#启动Mysql服务器
编写当前服务器wodn时的脚本
vim/etc/keepalived/down.sh
#!/bin/bash
echo
"#`date +"
%Y-%m-%d%H:%M
"` keepalived is down!!!"
>>
/etc/keepalived/change.log
#输出当前时间到日志中
为所有脚本授予可执行权限
chmod
+x keepalived_check_mysql.sh
chmod
+x /etc/keepalived/master.sh
chmod
+x /etc/keepalived/slave.sh
chmod
+x /etc/keepalived/notify_fault.sh
chmod
+x /etc/keepalived/down.sh
通过vip登录Mysql服务器
(1) mysql -h10.142.132.49 -ulipengfei-plipengfei
SHOW VARIABLES LIKE
'server_id'
;
#查看当前是哪个mysql主机,当前mysql主库
(2) 把mysql主库停止
(3) mysql -h10.142.132.49 -ulipengfei-plipengfei
SHOW VARIABLES LIKE
'server_id'
;
#查看当前是哪个mysql主机,当前是mysql备主
可以看出主库停了,vip会自动漂移到备主上。
到此为止,咱们的keepalived功能就配置结束了!
只要朋友们仔细点按着我写的文章一步一步操作,相信你也可以成功的,加油吧!