elk系統logstash日誌處理端使用lvs作的負載均衡,端口監控發現logstash節點由於最大文件數到達限制掛了一臺,lvs不知道後端的logstash掛了。node
看告警虛擬IP恢復是由於轉發到正常的節點了,端口監控後續就一直波動恢復告警- -!,由於lvs沒有移除故障節點,處理不及時,丟的東西就多了。後端
這邊用利用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