LVS负载均衡(三) LVS后端服务健康状态检查
上一篇分别配置NAT和DR的应用,下面将利用前面配置好的DR工作方式集群来实现LVS后端服务健康状态检查。
1、为什么需要进行LVS后端服务健康状态检查
像前面配置好了,整个集群开始工作,但如果某些Real Server出现问题,不能正常访问,我们就要使Director的ipvs配置做出相应改变,删除出问题的Real Server;当Real Server又能正常访问时,也要把其添加回ipvs的调度列表,这就需要实时检查各Real Server的健康状态,以此来保证整个集群能够提供稳定可用的服务。
2、怎么实现LVS后端服务健康状态检查
实时检查各Real Server的健康状态,实现的方式很多,如四层TCP健康检测、七层HTTP健康检测,如访问某个端口、请求一个专用的服务接口等,也可用ldirectord、keepalived等高可用组件来实现,这些后面介绍到高可用时再实现;我们这里使用上面配置好的DR方式的WEB集群来测试,所以使用的是比较常见的间隔访问HTTP页面的方式来检测健康状态,类似脚本网上很多,更改一下就可以用,下面是本次测试用的脚本,自己新加入了全部Real Server掉线后,使用Director本机提供错误提示给用户的功能,lvs_health_check.sh脚本如下:
- #!/bin/bash
- #
- VIP=192.168.1.100
- CPORT=80
- FAIL_BACK=127.0.0.1 #全部RS掉线后,使用DIR本机提供错误提示给用户
- RS=("192.168.1.102" "192.168.1.103")
- declare -a RSSTATUS
- RW=("1" "3") #调度权重
- RPORT=80
- TYPE=g
- CHKLOOP=3 #掉线的时候,多检查几次再删除
- LOG=/var/log/ipvsmonitor.log #日志
- declare -i AddRsCount=0 #在线的rs数量
- declare -i FailBackStartFlag=0 #FAIL_BACK启用标志
- addrs() { #添加RS
- ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
- [ $? -eq 0 ] && return 0 || return 1
- }
- delrs() { #删除RS
- ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
- [ $? -eq 0 ] && return 0 || return 1
- }
- checkrs() { #不断循环访问各RS,根据返回,判断各RS的健康状态
- 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() { #初始化各RS的状态
- local I
- local COUNT=0;
- for I in ${RS[*]}; do
- if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; then
- RSSTATUS[$COUNT]=1
- let AddRsCount++ #初始在线RS数量
- else
- RSSTATUS[$COUNT]=0
- fi
- let COUNT++
- done
- }
- initstatus
- while :; do
- let COUNT=0
- for I in ${RS[*]}; do
- if checkrs $I; then #不断循环访问各RS,根据返回,判断各RS的健康状态
- if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then
- addrs $I ${RW[$COUNT]} #刚上线,添加
- #[ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && let AddRsCount++ && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG
- if [ $? -eq 0 ]; then
- RSSTATUS[$COUNT]=1
- let AddRsCount++
- echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG
- fi
- fi
- else
- if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
- delrs $I #刚掉线,删除
- #[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && let AddRsCount-- && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG
- if [ $? -eq 0 ]; then
- RSSTATUS[$COUNT]=0
- let AddRsCount--
- echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG
- fi
- fi
- fi
- let COUNT++
- done
- if [ $AddRsCount -eq 0 ] && [ $FailBackStartFlag -eq 0 ]; then
- addrs $FAIL_BACK 1 #在线RS数量为0,且FailBack没启用,则启用
- [ $? -eq 0 ] && FailBackStartFlag=1 && echo "`date +'%F %H:%M:%S'`, $FAIL_BACK is start." >> $LOG
- fi
- if [ $AddRsCount -gt 0 ] && [ $FailBackStartFlag -eq 1 ]; then
- delrs $FAIL_BACK #在线RS数量大于为0,且FailBack启用,则停用
- [ $? -eq 0 ] && FailBackStartFlag=0 && echo "`date +'%F %H:%M:%S'`, $FAIL_BACK is stop." >> $LOG
- fi
- sleep 5
- done
3、测试
执行bash -x lvs_health_check.sh,然后手动停止/启用各Real Server的htttpd,可以到看ipvs规则自动做出了相应改变,日志中也记录下了相应变化,测试情况如下:
下一篇将会尝试解决LVS持久连接相关的问题……