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