LVS均衡负载(三) LVS后端服务健康状态检查

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持久连接相关的问题……



  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值