Shell脚本监控LVS后台服务器存活状态

2020年6月9日14:00:44 评论 7

简介

在生产工作中,后台的服务器并不可能永远都处于正常运行状态,若服务器发生宕机,为了不影响正在进行的业务以及给用户更好的体验,我们需要通过编写监控脚本对LVS的后台主机存活情况进行监控,当有服务器发生故障时,脚本会从LVS转发策略删除该服务器的转发规则;等到服务器恢复正常后,脚本也将把该服务器的转发规则重新加入LVS转发策略中;若所有的后台服务器都宕机了,则脚本会自动把虚拟ip的端口转发到本机端口,起到缓冲作用

编写监控脚本

#!/bin/bash
#虚拟IP
VIP=192.168.29.122
#本机IP
LIP=192.168.29.143
#绑定转发端口号
VPORT=80
#真实服务器端口号
RPORT=80
#LVS工作模式
TYPE=g
#设置日志
LOG=/tmp/ipvs.log
declare -i AS=0
declare -i flag=0
declare -a RS=("192.168.29.142" "192.168.29.144")
declare -a RW=(1 1)
declare -a RSSTATUS=(0 0)

#初始检查LVS配置情况
function initstatus(){
    index=0
    for((;index<2;index++))
    do
        ip=${RS[$index]}
        num=$(ipvsadm -Ln|grep $ip |wc -l)
        if [ $num -eq 1 ];then
            RSSTATUS[$index]=1
            let AS++
        else
            RSSTATUS[$index]=0
        fi
    done
}

#添加真实服务器
function addrs(){
`ipvsadm -a -t $VIP:$VPORT -r $1:$RPORT -$TYPE -w $2`
echo "$(date) add $1 to ipvsadm" >> $LOG
}

#删除真实服务器
function delrs(){
`ipvsadm -d -t $VIP:$VPORT -r $1`
echo "$(date) remove $1 from ipvsadm" >> $LOG
}

#检查真实服务器存活状态
function checkrs(){
    index=0
    for((;index<2;index++))
    do
        ip=${RS[$index]}
        weight=${RW[$index]}
        status_num=${RSSTATUS[$index]}
        num=$(curl --connect-timeout 2 -ls http://$ip |wc -l )
        if [[ $num -eq 1 && $status_num -eq 0 ]];then
            addrs $ip $weight
            RSSTATUS[$index]=1
            let AS++
            #当任意一台真实服务器恢复状态后,把转发到本机的规则删除
            if [[ $AS -eq 2 && $flag -eq 1 ]];then
                delrs $LIP
                let AS--
                flag=0
            fi
        elif [[ $num -eq 1 && $status_num -eq 1 ]];then
            continue
        elif [[ $num -eq 0 && $status_num -eq 1 ]];then
            delrs $ip
            RSSTATUS[$index]=0
            let AS--
        #若所有真实服务器均发生宕机,LVS把虚拟IP转发到本机处理
        elif [[ $AS -eq 0 ]];then
            addrs $LIP 1
            let AS++
            flag=1
        fi
    done
}

initstatus

#设定每隔五秒钟运行一次
while :
do
checkrs
sleep 5
echo "keep monitoring..."
done

测试验证

关闭node2服务

[root@node2 ~]# systemctl stop httpd.service
#查看日志信息
remove 192.168.29.142 from ipvsadm
#查看ipvsadm信息
[root@node1 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  node1:http rr       
  -> node3:http                   Route   1      0          0

把node3服务也进行关闭

[root@node3 ~]# systemctl stop httpd.service 
#查看日志信息
remove 192.168.29.144 from ipvsadm
add 192.168.29.143 to ipvsadm
#查看ipvsadm信息
[root@node1 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  node1:http rr

重启服务

[root@node2 ~]# systemctl start httpd.service
[root@node3 ~]# systemctl start httpd.service 
#查看ipvsadm信息
[root@node1 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  node1:http rr
  -> node2:http                   Route   1      0          0         
  -> node3:http                   Route   1      0          0      
#查看日志信息
add 192.168.29.142 to ipvsadm
remove 192.168.29.143 from ipvsadm
add 192.168.29.144 to ipvsadm
  • 客服微信
  • 微信扫一扫
  • weinxin
  • 微信公众号
  • OPS技术联盟,每天掌握一个小知识!
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: