上文部署的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