LVS健康检测
由于在生产环境中,RS可能出现一些故障,那么LVS应该能够具备检测RS的健康情况,发现RS有问题,应立即从当前集群中删除之,当然keepalive可以解决此情况,这里使用脚本实现
脚本核心思想:循环判断当前RS状态是否正常,正常,静默等待下次循环;不正常,或删除或添加
注意,此实验环境为LVS-DR模式
可参考如下blog
LVS的DR模式搭建
脚本内容:
#!/bin/bash
#
VIP=10.10.10.100 #集群虚拟IP
CPORT=80 #定义集群端口
FAIL_BACK=127.0.0.1 #本机回环地址
RS=("10.10.10.12" "10.10.10.13") #编写集群地址
declare -a RSSTATUS #变量RSSTATUS定义为数组态
RW=("2" "1")
RPORT=80 #定义集群端口
TYPE=g #制定LVS工作模式:g=DR m=NAT
CHKLOOP=3
LOG=/var/log/ipvsmonitor.log
addrs() {
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq 0 ] && return 0 || return 1
}
delrs() {
ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
[ $? -eq 0 ] && return 0 || return 1
}
checkrs() {
local I=1
while [ $I -le $CHKLOOP ]; do
if curl --connect-timeout 1 http://$1 &> /dev/null; then
return 0
fi
let I++
done
return 1
}
initstatus() {
local I
local COUNT=0;
for I in ${
RS[*]}; do
if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; then
RSSTATUS[$COUNT]=1
else
RSSTATUS[$COUNT]=0
fi
let COUNT++
done
}
initstatus
while :; do
let COUNT=0
for I in ${
RS[*]}; do
if checkrs $I; then
if [ ${
RSSTATUS[$COUNT]} -eq 0 ]; then
addrs $I ${
RW[$COUNT]}
[ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG
fi
else
if [ ${
RSSTATUS[$COUNT]} -eq 1 ]; then
delrs $I
[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG
fi
fi
let COUNT++
done
sleep 5
done
测试:
首先,LVS执行脚本,监控服务器的状态
当RS正常时,集群采用的是轮询的负载调度,可见与预期相符
此时,若某一台服务器的http服务出现故障,LVS上应该删除这个节点,且页面不论如何刷新,都跳转至10.10.10.13
这个真实服务器上
可见,与预期相符
当这个服务器恢复后,节点正常添加进去