ElasticSearch自愈之節(jié)點丟失恢復
點擊上方“IT那活兒”公眾號,關注后了解更多內容,不管IT什么活兒,干就完了!!!
背 景
Elasticsearch是一個開源的、分布式的、高可用的、實時的搜索和分析引擎,它有助于快速收集、存儲和分析大量數據,廣泛應用于大規(guī)模數據的實時搜索和分析。
而在現實運維中,隨著業(yè)務的擴展,數據量不斷增大,為保障業(yè)務性能,ES集群不斷的擴容節(jié)點,擴大集群,有的集群多達上百個節(jié)點,雖集群內部具有副本冗余機制,但由于PCSERVER的不穩(wěn)定性(磁盤故障、網絡故障、硬件BUG、內核、內部錯誤等)或集群的性能壓力或程序Bug,可能會導致集群節(jié)點丟失。
目前我們運維已經做到7*24短信告警監(jiān)控,只是在大半夜,有可能無法即時收到短信進行恢復,為能即時恢復集群狀態(tài),進而對節(jié)點丟失場景研究,并編寫自動化腳本,定義autocron task自動恢復集群。
下面是我們的一個業(yè)務的集群,由于業(yè)務壓力,經常性會丟失1~2個節(jié)點,并基于該場景做自動恢復。
場景介紹
2.1 腳本設計思路
- 集群節(jié)點數統(tǒng)計,對節(jié)點的數量統(tǒng)計,節(jié)點數不同則設置不同的值,根據實際情況設置;
- 對剩余節(jié)點判斷,小于3則對節(jié)點直接拉起;
- 等待5分鐘,可根據實際情況調整,對集群狀態(tài)進行判斷。
目前該場景權適用于部分節(jié)點丟失的情況,由于考慮主機硬件問題導致的所有節(jié)點故障,存在主機PING告警,在主機重啟后,進行判斷后再拉起,在未來可對這一塊進一步調整優(yōu)化。
2.2 具體腳本
#!/bin/bas
MONITOR_HOME="/app/check_es"
app_home="/app"
hostip="xxxxxxxx"
node="node_xxxxxxx_9200"
node_number1=`curl -u username:xxxxxxxx http://xxxxxxxx:9200/_cat/nodes|grep 'xxxxxxxx'|wc -l`
if [ ${node_number1} -ne 5 ];then
curl -u username:xxxxxxxx http://xxxxxxxx:9200/_cat/nodes?v |grep 'xxxxxxxx'|awk '{print $10}' > $MONITOR_HOME/now.txt
grep -vwf $MONITOR_HOME/now.txt $MONITOR_HOME/last.txt > $MONITOR_HOME/check.txt
if [[ ${node_number1} < 3 ]];then
cd $MONITOR_HOME
./mess.sh -b "`date` $hostip ERROR: 丟失節(jié)點數超過3個,請檢查" -t 18974885939,1536793399
else
if [[ ${node_number1} > 2 ]];then
for i in `cat ${MONITOR_HOME}/check.txt`
do
echo "`date` 節(jié)點${i}異常,準備重啟" >> ${MONITOR_HOME}/error.log
if [ ${i} = ${node} ];then
pid=`ps -ef |grep ${i} |grep -v grep|grep -v controller|grep -v node_${hostip}_9201|grep -v node_${hostip}_9202|grep -v node_${hostip}_9203|grep -v node_${hostip}_9204|awk '{print $2}'`
else
pid=`ps -ef |grep ${i} |grep -v grep|grep -v controller|awk '{print $2}'`
fi
if [ !${pid} ];then
kill -9 ${pid}
cd ${app_home}/${i}/elasticsearch
./bin/elasticsearch -d
else
cd ${app_home}/${i}/elasticsearch
./bin/elasticsearch -d
fi
done
sleep 300s
node_number2=`curl -u username:xxxxxxxx http://xxxxxxxx:9200/_cat/nodes|grep 'xxxxxxxx'|wc -l`
node_status=`curl -u username:xxxxxxxx http://xxxxxxxx:9200/_cat/health|awk '{print $4}'`
if [ ${node_number2} -ne 5 ];then
echo "節(jié)點未恢復,請檢查"
else
if [[ ${node_status} = "red" ]];then
echo "節(jié)點已重新加入集群,正在恢復"
else
echo "集群已恢復"
fi
fi
fi
fi
fi
自愈帶來的成效:
ElasticSearch集群由于業(yè)務壓力過大,有時會OOM,導致集群節(jié)點crash掉,在無主機資源增加時,該腳本解決了在收到告警而手工拉起ES節(jié)點的困惑,對業(yè)務用戶來說也相對透明,通過該腳本受到一定的啟發(fā),在對于現網環(huán)境,可以不斷的對特殊場景進行自愈,以保障運維的穩(wěn)定性。