lvs健康检查脚本第三版

xiaoxiao2021-02-27  142

如下是学习完马哥视频lvs后改写的健康检查脚本第三版。利用工作之余三四个小时时间才把整个逻辑搞清楚,有时候自己都有点蒙圈,尤其是在写到while循环的时候。总的来说非常感谢马哥的慷慨解囊!脚本原稿及思路均来自马哥,自己又折腾几小时终于完成第三版!如有不妥之处,欢迎指出批评。

#!/bin/bash #

VIP=192.168.28.50 CPORT=80 FAIL_BACK=127.0.0.1 RS=("192.168.28.11" "192.168.28.12") #RSTATUS=("1" "1") RW=("2" "1") RPORT=80 TYPE=g CHKLOOP=3 LOG=/var/log/ipvschk.log

#添加RS,添加成功返回0,否则返回1 function addrs() {  ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2  [ $? -eq 0 ] && return 0 || return 1 } #删除RS,删除成功返回0,否则返回1 function delrs() {  ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT  [ $? -eq 0 ] && return 0 || return 1 }

#检测RS服务是否在线,注意一下这里面指的RS的服务,如果连续三次都监测不通,则返回1,否则返回0 function 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 }

#初始化RS在线状态,如果在线,设置节点初始化状态为1,否则为0 function initstatus(){  local I  local COUNT=0  for I in ${RS[*]};do   if checkrs $I ; then    RSSTATUS[${COUNT}]=1   else    RSSTATUS[${COUNT}]=0   fi  let COUNT++  done } #ipvs状态检查,如果已添加至ipvs则返回0,否则返回1 function rrstatus(){  realsta=`ipvsadm -L -n | grep $1 | grep -v grep | wc -l`  [ $realsta -ne 0 ] && return 0 || return 1 }

 

#进行初始化

initstatus

#判断ipvsadm是否启动,如果没有启动则直接退出,否则继续

if [ ! -e /var/lock/subsys/ipvsadm ]; then  echo "`date +'%F %H:%M:%S'`, ipvs is stop." >> $LOG  exit 1 fi

 

#在这里逻辑关系有点复杂,总体思路是:监测rs是否加入到ipvs中。如果未添加并且在线则添加;如果已添加并且不在线,则删除 while :; do  let COUNT=0  for I in ${RS[*]} ; do   rrstatus $I   [ $? -eq 0 ] &&  RRSTATUS=1 || RRSTATUS=0   if checkrs $I; then    if [ $RRSTATUS -eq 0 ]; then     addrs $I ${RW[$COUNT]}     if [ $? -eq 0 ] ; then       RSSTATUS[$COUNT]=1      echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG     else      echo "`date +'%F %H:%M:%S'`, add $I faild." >> $LOG     fi    fi   else    if [ $RRSTATUS -eq 1 ] ; then     delrs $I     if [ $? -eq 0 ] ; then      RSSTATUS[$COUNT]=0      echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG     else      echo "`date +'%F %H:%M:%S'`, del $I faild or $I already has gone." >> $LOG     fi    fi   fi   let COUNT++  done

#如果服务都不在线,并且备用服务未添加至ipvs,则添加备用服务;一旦有服务在线,则删除已添加的备用节点  if [ ${RSSTATUS[0]} -eq 0 -a ${RSSTATUS[1]} -eq 0 ];then   rrstatus $FAIL_BACK   if [ $? -eq 1 ]; then    ipvsadm -a -t $VIP:$CPORT -r $FAIL_BACK -w 1   fi  else   rrstatus $FAIL_BACK   if [ $? -eq 0 ]; then    ipvsadm -d -t $VIP:$CPORT -r $FAIL_BACK   fi  fi

#5s监测一次  sleep 5 done

转载请注明原文地址: https://www.6miu.com/read-12586.html

最新回复(0)