Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器.
Layer3,4&7工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:
Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。
Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
Layer7:Layer7就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。
下面我们来实现简单的冗余功能:
两台Centos6.5的主机
分别安装keepalived
Master:172.16.1.20
Backup:172.16.1.1
一、安装配置
1、分别在两台主机上
#yum install keepalived -y
2、编辑Master配置文件
3、编辑Backup配置文件
4、在任意一台主机上ping上面任意一个虚拟IP
#############################################################################
但是这种方式存在恼裂的可能,即两个节点实际都处于正常工作状态,但是无法接收到彼此的组播通知,这时两个节点均强行绑定虚拟IP,导致不可预料的后果。
这时就需要设置仲裁,即每个节点必须判断自身的状态(应用服务状态及自身网络状态),要实现这两点可使用自定义shell脚本实现,通过周期性地检查自身应用服务状态,并不断ping网关(或其它可靠的参考IP)均可。当自身服务异常、或无法ping通网关,则认为自身出现故障,就应该移除掉虚拟IP(停止keepalived服务即可)。
思路:
添加一个脚本,为隔一段时间就会启动一次并检测自身的状态
vrrp_script check_local { //定义一个名称为check_local的检查脚本
script "/usr/local/check_local.sh" #shell脚本的路径
interval 5 }
再在vrrp_instance配置中加入以下代码使用上面定义的检测脚本:
track_script {
check_local
}
脚本内容:(来自互联网)
#!/bin/bash
pidfile=/var/lock/subsys/`basename $0`.pid
if [ -f $pidfile ] && [ -e /proc/`cat $pidfile` ] ; then
exit 1
fi
trap "rm -fr $pidfile ; exit 0" 1 2 3 15
echo $$ > $pidfile
maxfails=3
fails=0
success=0
while [ 1 ]
do
/usr/bin/wget --timeout=3 --tries=1 http://127.0.0.1/ -q -O /dev/null
if [ $? -ne 0 ] ; then
let fails=$[$fails+1]
success=0
else
fails=0
let success=$[$success+1]
fi
if [ $fails -ge $maxfails ] ; then
fails=0
success=0
#check keepalived is running ? try to stop it
service keepalived status | grep running
if [ $? -eq 0 ] ; then
logger -is "local service fails $maxfails times ... try to stop keepalived."
service keepalived stop 2>&1 | logger
fi
fi
if [ $success -gt $maxfails ] ; then
#check keepalived is stopped ? try to start it
service keepalived status | grep stopped
if [ $? -eq 0 ] ; then
logger -is "service changes normal, try to start keepalived ."
service keepalived start
fi
success=0
fi
sleep 3
done
双主模型: