Shell腳本監控LVS後臺服務器存活狀態

簡介

在生產工作中,後臺的服務器並不可能永遠都處於正常運行狀態,若服務器發生宕機,爲了不影響正在進行的業務以及給用戶更好的體驗,我們需要通過編寫監控腳本對LVS的後臺主機存活情況進行監控,當有服務器發生故障時,腳本會從LVS轉發策略刪除該服務器的轉發規則;等到服務器恢復正常後,腳本也將把該服務器的轉發規則重新加入LVS轉發策略中;若所有的後臺服務器都宕機了,則腳本會自動把虛擬ip的端口轉發到本機端口,起到緩衝作用

前期準備

配置LVS負載均衡策略 詳情可參考https://blog.51cto.com/14832653/2501128

編寫監控腳本

#!/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

原文地址:

https://blog.51cto.com/14832653/2506556

原文作者:wx5ed6455937203

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章