LVS之五:使用脚本实现RealServer的健康检查

上文部署的DR模型中,当一台RS宕机时,ipvs是不会自动踢出该RS服务器的,我这里使用一个脚本实现对RS的监控检查。

一、需求分析:

  • 脚本要能判断RS运行情况;
  • 当RS的web服务不能访问时,将其从lvs集群中踢出;而当RS重新上线时,再将其加入lvs集群;
  • 定时检查(死循环或cron计划任务);
  • 对RS的下线和上线做日志记录。

二、web健康检查命令:

使用curl能简单的实现对web应用可用性进行监控:

curl命令选项:

    --cacert CA证书 (SSL) 
    --capath CA目录 (made using c_rehash) to verify peer against (SSL) 
    --compressed 要求返回是压缩的形势 (using deflate or gzip) 
    --connect-timeout 设置最大请求时间 
    -H/--header 自定义头信息传递给服务器 
    -i/--include 输出时包括protocol头信息 
    -I/--head 只显示文档信息 
    --interface 使用指定网络接口/地址 
    -s/--silent静音模式。不输出任何东西 
    -u/--user 设置服务器的用户和密码 
    -p/--proxytunnel 使用HTTP代理

三、具体实现:

#!/bin/bash 

VIP=192.168.8.254 
CPORT=80

##使用数组RS定义所有RS服务器 
RS=("172.16.1.101" "172.16.1.102")

#定义RS状态,后面引用 
declare -a RSSTATUS

#定义权重 
RW=("5" "5") 
RPORT=80

#集群类型为DR 
TYPE=g 
CHKLOOP=3

#监控日志 
LOG=/var/log/ipvsmonitor.log

#

#addrs函数在RS重新上线时将其添加到集群

addrs() { 
  ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2 
  [ $? -eq 0 ] && return 0 || return 1 
}

#delrs函数在RS下线时将其从集群中删除

delrs() { 
  ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT 
  [ $? -eq 0 ] && return 0 || return 1 
}

#checkrs检查RS状态,如果上次均为离线状态,则判定其为离线

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状态函数

initstatus() { 
  local I 
  local COUNT=0; 
  for I in ${RS[*]}; do 
    if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; then 
      RSSTATUS[$COUNT]=1 
    else 
      RSSTATUS[$COUNT]=0 
    fi 
  let COUNT++ 
  done 
}

#执行初始化RS状态检查函数

initstatus

 

#死循环 
while :; do 
  let COUNT=0 
  for I in ${RS[*]}; do 
    if checkrs $I; then 
      if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then 
         addrs $I ${RW[$COUNT]} 
         [ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG 
      fi 
    else 
      if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then 
         delrs $I 
         [ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG 
      fi 
    fi 
    let COUNT++ 
  done 
  sleep 5 
done

你可能感兴趣的:(LVS之五:使用脚本实现RealServer的健康检查)