lvs結合ssh免密作監控,移除故障節點腳本

elk系統logstash日誌處理端使用lvs作的負載均衡,端口監控發現logstash節點由於最大文件數到達限制掛了一臺,lvs不知道後端的logstash掛了。node

lvs結合ssh免密作監控,移除故障節點腳本
lvs結合ssh免密作監控,移除故障節點腳本
看告警虛擬IP恢復是由於轉發到正常的節點了,端口監控後續就一直波動恢復告警- -!,由於lvs沒有移除故障節點,處理不及時,丟的東西就多了。
lvs結合ssh免密作監控,移除故障節點腳本後端

這邊用利用ssh免密作的監控,後端Real Server不能禁止lvs訪問22端口,lvs按期去檢查logstash是否還在監聽應用端口,故障移除節點,恢復後再添加回來。想到整機直接掛掉的狀況,增長了ping報文響應。其餘場景不想了,能偷懶就行bash

上腳本:負載均衡

#!/bin/bash
set -u
set -e
#定義時間格式
cur_time(){
        date "+%Y/%m/%d %H:%M:%S"
}

#節點恢復 lvs恢復對節點的轉發規則
add_node(){
        ipvsadm -a -t $vip:$port -r $ip:$port -g #增長tcp轉發規則
        ipvsadm -a -u $vip:$port -r $ip:$port -g #增長udp轉發規則
        echo "$(cur_time) $ip:$port status success add node:ipvsadm -d -t $vip:$port -r $ip:$port " >> $file.log #寫日誌
        echo "$(cur_time) $ip:$port status success add node:ipvsadm -d -u $vip:$port -r $ip:$port " >> $file.log #寫日誌
        sed -i "/^$ip:$port/d" $file.node #移除恢復節點
}

#節點故障 lvs刪除節點轉發規則
delete_node(){
        ipvsadm -d -t $vip:$port -r $ip:$port #增長tcp轉發規則
        ipvsadm -d -u $vip:$port -r $ip:$port #增長udp轉發規則
        echo "$(cur_time) $ip:$port status error delete node:ipvsadm -d -t $vip:$port -r $ip:$port " >> $file.log #寫日誌
        echo "$(cur_time) $ip:$port status error delete node:ipvsadm -d -u $vip:$port -r $ip:$port " >> $file.log #寫日誌
        echo "$ip:$port" >> $file.node #記錄故障節點 用於add恢復
}

file=`echo "$0"|awk -F"." '{print$1}'` #日誌文件名
vip="192.168.29.4" #lvs的虛IP
ip_info=$(ipvsadm -ln|grep -v $vip|awk  'NR>3{print$2}'|sort|uniq) #獲取現有ipvs表的轉發規則
for ip_port in $ip_info; do
        ip=$(echo $ip_port|awk -F: '{print$1}') #切割獲取IP
        port=$(echo $ip_port|awk -F: '{print$2}') #切割獲取端口

        for ((i=0;i<6;i++));do
            #ping這個IP若是不通說明節點已經掛了,直接就刪除轉發規則
                ping -W 2 -c 1 $ip &>/dev/null #直接ping這個IP
                if [ $? == 0 ];then
                        echo "$(cur_time) $i ping $ip status success" >> $file.log
                        break
                elif [ $i == 5 ];then
                        delete_node #5次失敗說明節點已經異常,能夠移除轉發
                else
                        echo "$(cur_time) $i ping $ip status error" >> $file.log
                        sleep 1
                fi
        done
        #判斷節點是否有在監聽lvs上的轉發端口,沒有監據說明程序已經掛了,能夠有多個端口
        #這邊要事先作好ssh的免密,就是用ssh執行遠程命令,後端Real Server不能禁止lvs禁止訪問22端口
        if [ $(ssh root@$ip "netstat -ant|grep "$port"|grep "LISTEN"|wc -l") -ne 1 ] ; then
                delete_node
        fi
done

#檢查$file.node存的故障檢點是否已經恢復
for ip_port in $(cat $file.node) ; do
        ip=$(echo $ip_port|awk -F: '{print$1}')
        port=$(echo $ip_port|awk -F: '{print$2}')

        ping -W 2 -c 1 $ip &>/dev/null

        if [ $? != 0 ];then
                continue
        fi
        #檢查是否已經恢復對端口的監聽
        if [ $(ssh root@$ip "netstat  -ant|grep "$port"|grep "LISTEN"|wc -l") -eq 1 ];then
                add_node #恢復lvs轉發
        fi
done
相關文章
相關標籤/搜索