现在的位置: 首页 > Linux > 服务器集群技术 > 正文
LVS之五:使用脚本实现RealServer的健康检查
2013年10月08日 服务器集群技术 ⁄ 共 1765字 LVS之五:使用脚本实现RealServer的健康检查已关闭评论 ⁄ 被围观 7,397 views+

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

一、需求分析:

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

二、web健康检查命令:

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

curl命令选项:

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

抱歉!评论已关闭.

×