如下是学习完马哥视频lvs后改写的健康检查脚本第三版。利用工作之余三四个小时时间才把整个逻辑搞清楚,有时候自己都有点蒙圈,尤其是在写到while循环的时候。总的来说非常感谢马哥的慷慨解囊!脚本原稿及思路均来自马哥,自己又折腾几小时终于完成第三版!如有不妥之处,欢迎指出批评。
1 #!/bin/bash 2 # 3 4 VIP=192.168.28.50 5 CPORT=80 6 FAIL_BACK=127.0.0.1 7 RS=("192.168.28.11" "192.168.28.12") 8 #RSTATUS=("1" "1") 9 RW=("2" "1") 10 RPORT=80 11 TYPE=g 12 CHKLOOP=3 13 LOG=/var/log/ipvschk.log 14 15 #添加RS,添加成功返回0,否则返回1 16 function addrs() { 17 ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2 18 [ $? -eq 0 ] && return 0 || return 1 19 } 20 #删除RS,删除成功返回0,否则返回1 21 function delrs() { 22 ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT 23 [ $? -eq 0 ] && return 0 || return 1 24 } 25 26 #检测RS服务是否在线,注意一下这里面指的RS的服务,如果连续三次都监测不通,则返回1,否则返回0 27 function checkrs(){ 28 local I=1 29 while [ $I -le $CHKLOOP ];do 30 if curl --connect-timeout 1 http://$1 &>/dev/null ; then 31 return 0 32 fi 33 let I++ 34 done 35 return 1 36 } 37 38 #初始化RS在线状态,如果在线,设置节点初始化状态为1,否则为0 39 function initstatus(){ 40 local I 41 local COUNT=0 42 for I in ${RS[*]};do 43 if checkrs $I ; then 44 RSSTATUS[${COUNT}]=1 45 else 46 RSSTATUS[${COUNT}]=0 47 fi 48 let COUNT++ 49 done 50 }
51 #ipvs状态检查,如果已添加至ipvs则返回0,否则返回1 52 function rrstatus(){ 53 realsta=`ipvsadm -L -n | grep $1 | grep -v grep | wc -l` 54 [ $realsta -ne 0 ] && return 0 || return 1 55 } 56 59 #进行初始化 61 initstatus 62 63 #判断ipvsadm是否启动,如果没有启动则直接退出,否则继续 64 65 if [ ! -e /var/lock/subsys/ipvsadm ]; then 66 echo "`date +'%F %H:%M:%S'`, ipvs is stop." >> $LOG 67 exit 1 68 fi 71 72 #在这里逻辑关系有点复杂,总体思路是:监测rs是否加入到ipvs中。如果未添加并且在线则添加;如果已添加并且不在线,则删除 73 while :; do 74 let COUNT=0 75 for I in ${RS[*]} ; do 76 rrstatus $I 77 [ $? -eq 0 ] && RRSTATUS=1 || RRSTATUS=0 78 if checkrs $I; then 79 if [ $RRSTATUS -eq 0 ]; then 80 addrs $I ${RW[$COUNT]} 81 if [ $? -eq 0 ] ; then 82 RSSTATUS[$COUNT]=1 83 echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG 84 else 85 echo "`date +'%F %H:%M:%S'`, add $I faild." >> $LOG 86 fi 87 fi 88 else 89 if [ $RRSTATUS -eq 1 ] ; then 90 delrs $I 91 if [ $? -eq 0 ] ; then 92 RSSTATUS[$COUNT]=0 93 echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG 94 else 95 echo "`date +'%F %H:%M:%S'`, del $I faild or $I already has gone." >> $LOG 96 fi 97 fi 98 fi 99 let COUNT++ 100 done 101 102 #如果服务都不在线,并且备用服务未添加至ipvs,则添加备用服务;一旦有服务在线,则删除已添加的备用节点 103 if [ ${RSSTATUS[0]} -eq 0 -a ${RSSTATUS[1]} -eq 0 ];then 104 rrstatus $FAIL_BACK 105 if [ $? -eq 1 ]; then 106 ipvsadm -a -t $VIP:$CPORT -r $FAIL_BACK -w 1 107 fi 108 else 109 rrstatus $FAIL_BACK 110 if [ $? -eq 0 ]; then 111 ipvsadm -d -t $VIP:$CPORT -r $FAIL_BACK 112 fi 113 fi 114 115 #5s监测一次 116 sleep 5 117 done