ElasticSearch自愈之节点丢失恢复
创始人
2025-07-05 17:01:48
0

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!

背 景

Elasticsearch是一个开源的、分布式的、高可用的、实时的搜索和分析引擎,它有助于快速收集、存储和分析大量数据,广泛应用于大规模数据的实时搜索和分析。

而在现实运维中,随着业务的扩展,数据量不断增大,为保障业务性能,ES集群不断的扩容节点,扩大集群,有的集群多达上百个节点,虽集群内部具有副本冗余机制,但由于PCSERVER的不稳定性(磁盘故障、网络故障、硬件BUG、内核、内部错误等)或集群的性能压力或程序Bug,可能会导致集群节点丢失。

目前我们运维已经做到7*24短信告警监控,只是在大半夜,有可能无法即时收到短信进行恢复,为能即时恢复集群状态,进而对节点丢失场景研究,并编写自动化脚本,定义autocron task自动恢复集群。

下面是我们的一个业务的集群,由于业务压力,经常性会丢失1~2个节点,并基于该场景做自动恢复。

场景介绍

2.1 脚本设计思路

图片

  • 集群节点数统计,对节点的数量统计,节点数不同则设置不同的值,根据实际情况设置;
  • 对剩余节点判断,小于3则对节点直接拉起;
  • 等待5分钟,可根据实际情况调整,对集群状态进行判断。

目前该场景权适用于部分节点丢失的情况,由于考虑主机硬件问题导致的所有节点故障,存在主机PING告警,在主机重启后,进行判断后再拉起,在未来可对这一块进一步调整优化。

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: 丢失节点数超过3个,请检查" -t 18974885939,1536793399
else
if [[ ${node_number1} > 2 ]];then
for i in `cat ${MONITOR_HOME}/check.txt`
do
echo "`date` 节点${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 "节点未恢复,请检查"
else
if [[ ${node_status} = "red" ]];then
echo "节点已重新加入集群,正在恢复"
else
echo "集群已恢复"
fi
fi
fi
fi
fi

自愈带来的成效:

ElasticSearch集群由于业务压力过大,有时会OOM,导致集群节点crash掉,在无主机资源增加时,该脚本解决了在收到告警而手工拉起ES节点的困惑,对业务用户来说也相对透明,通过该脚本受到一定的启发,在对于现网环境,可以不断的对特殊场景进行自愈,以保障运维的稳定性。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...