定位 发表于 2016-11-3 00:38:23

lvs脚本实现后端服务健康状态检查-定位原创

环境:
centos 6.7 32位
主机1:192.168.3.2 (内网)、192.168.3.3(外网)-调度器
主机2:192.168.3.7(内网)-目标主机1
主机3:192.168.3.8(内网)-目标主机2

工作原理:
               1、当目标主机中的任意一台挂掉了,直接剔除掉
               2、当挂掉的目标主机恢复之后,添加该主机
               3、当两台目标主机都挂掉,全部剔除,添加备用主机,这里的备用主机是调度器自身(也可以是是其它)
               4、当目标主机有一台恢复了,添加该目标主机,剔除备用主机
               5、检测目标主机是否可以访问,连续检测3次,以防个别情况
               6、发生剔除目标主机和备用主机,以及添加目标主机和备用主机,相应的信息输出到本地日志当中

注:
VIP:请求主机地址
CPORT:请求主机地址的端口(服务)
FAIL_BACK:备用主机(这里是调度器自身)
RS:数组,包含两个目标主机
RSTATUS:判断目标主机的状态,0:主机存活,1:主机挂掉
RW:数组,给目标主机赋予的权重
RPORT:请求目标主机的端口(服务)
CHKLOOP:检测目标主机的次数
TYPE:lvs类型
LOG:相关信息保存的日志

脚本如下:

#!/bin/bash
#
VIP=192.168.3.3
CPORT=80
FAIL_BACK=127.0.0.1
RS=("192.168.3.7" "192.168.3.8")
export RSTATUS=("0" "0")
RW=("2" "1")
RPORT=80
CHKLOOP=3
TYPE=g
LOG=/var/log/ipvsmonitor.log

[ ! -f $LOG ] && touch $LOG

addrs() {
        ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
        [ $? -eq 0 ] && printf "\e
        echo "$I has been added..."
        echo -e "`date +'%F %H:%M:%S'`,$I has been added...\n" >> $LOG
        RSTATUS[$COUNT]=0
#        echo ${RSTATUS[$COUNT]}
}

addback() {
        ipvsadm -a -t $VIP:$CPORT -r $FAIL_BACK:$RPORT
        [ $? -eq 0 ] && printf "\e
        echo "backup machine has added..."
        echo -e "`date +'%F %H:%M:%S'`,$FAIL_BACK has been added...\n" >> $LOG
}

delback() {
        ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
        [ $? -eq 0 ] && printf "\e
        echo "backup machine has removed..."
        echo -e "`date +'%F %H:%M:%S'`,$FAIL_BACK has been removed...\n" >> $LOG
}

delrs() {
        ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
        [ $? -eq 0 ] && printf "\e
        RSTATUS[$COUNT]=1
        echo -e "`date +'%F %H:%M:%S'`,$I has been removed...\n" >> $LOG        
#        echo ${RSTATUS[$COUNT]}
}

checkbak() {
        if [ "${RSTATUS}" != "0" -a "${RSTATUS}" != "0" ] && [ "$LOCAL" == "" ];then
                addback
        elif [ "$LOCAL" == "127.0.0.1" ] && [ "$REALSERVER1" == "" -a "$REALSERVER2" == "" ];then
                echo -e "\nbackup machine has added..."
        elif [ "$LOCAL" == "127.0.0.1" ] && [ "$REALSERVER1" != "" -o "$REALSERVER2" != "" ];then
                delback $LOCAL
          else
                return 0
        fi
}

checkrs() {
        local J=1
        while [ $J -le $CHKLOOP ]
        do
                if /usr/bin/curl --connect-timeout 1 http://$I &> /dev/null;then
                        return 0
                fi
                let J++
        done
        return 1
}

while :; do
        let COUNT=0
        for I in ${RS}
        do
                checkrs
#                echo $?
                STATUS=`echo $?`
                REALSERVER=`ipvsadm -L -n | grep $I |awk '{print $2}' | cut -d : -f 1`
                REALSERVER1=`ipvsadm -L -n | grep ${RS} |awk '{print $2}' | cut -d : -f 1`
                REALSERVER2=`ipvsadm -L -n | grep ${RS} |awk '{print $2}' | cut -d : -f 1`
                LOCAL=`ipvsadm -L -n | grep 127.0.0.1 |awk '{print $2}' | cut -d : -f 1`
                [ $STATUS -eq 0 -a "$REALSERVER" == "" ] && addrs $I ${RW[$COUNT]}
#                echo ${RSTATUS[$COUNT]}
                [ $STATUS -eq 0 -a "$REALSERVER" != "" ] && echo "$I running normally..."
                [ $STATUS -ne 0 -a "$REALSERVER" != "" ] && delrs $I
                [ $STATUS -ne 0 -a "$REALSERVER" == "" ] && echo "$I has been removed..."

                let COUNT++

        done
        checkbak
        echo "----------------------------------------------------------------"
#        echo ${RSTATUS}
#        echo ${RSTATUS}
#        echo $REALSERVER1
#        echo $REALSERVER2
#        echo $LOCAL
        sleep 5
done
页: [1]
查看完整版本: lvs脚本实现后端服务健康状态检查-定位原创