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

  |   0浏览

简介

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

前期准备

配置LVS负载均衡策略详情可参考https://blog.51cto.com/14832653/2501128

编写监控脚本

#!/bin/bash#虚拟IPVIP=192.168.29.122#本机IPLIP=192.168.29.143#绑定转发端口号VPORT=80#真实服务器端口号RPORT=80#LVS工作模式TYPE=g#设置日志LOG=/tmp/ipvs.logdeclare -i AS=0declare -i flag=0declare -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 :docheckrssleep 5echo 'keep monitoring...'done

测试验证

关闭node2服务

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

把node3服务也进行关闭

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

重启服务

[root@node2 ~]# systemctl start httpd.service[root@node3 ~]# systemctl start httpd.service #查看ipvsadm信息[root@node1 ~]# ipvsadmIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  node1:http rr  -> node2:http                   Route   1      0          0           -> node3:http                   Route   1      0          0      #查看日志信息add 192.168.29.142 to ipvsadmremove 192.168.29.143 from ipvsadmadd 192.168.29.144 to ipvsadm

原文地址:https://blog.51cto.com/14832653/2506556