어제 meetup 에서 cluster 재기동시에 replica 를 재사용하지 않게 될때 부하가 너무 많이 걸린다고 하신 분이 계셨습니다.
저도 동일한 문제를 겪고 있습니다.
재기동시 방법을 조금이나마 더 안전하게 하는 방법을 공유하려고 합니다.
오늘 날짜에 대한 인덱싱 작업을 멈춥니다.
cluster 를 shutdown 하기 전에 오늘 날짜의 인덱스를 제외하고 모든 인덱스를 close 합니다.
그리고 cluster 를 shutdown 후에 elasticsearch 패치 작업을 합니다.
모든 노드를 구동시키게 되면 빠른 시간 안에 오늘 날짜의 index 는 빠르게 recovery 됩니다.
recovery 된 후에 멈췄던 오늘 날짜에 대한 인덱싱 작업을 다시 진행합니다.
그리고 날짜의 역순으로 인덱스를 하나씩 open 합니다.
하나의 index 를 open 하고 완전히 recovery 될때 까지 기다렸다가 이전의 index 를 하나 open 합니다.
이 과정을 반복하여 모든 index 를 open 합니다.
하지만 이 과정을 사람이 모니터링하면서 진행하기 귀찮아서 저는 스크립트를 하나 만들었습니다.
필요하신 분은 자신에 맞게 수정하셔서 운영에 사용하셔도 될 것 같습니다.
사용법 : ./open_index_monthly.sh 2015-06
#!/bin/sh
PREFIX="sec_log_"
if [ $# -eq 1 ]
then
MONTH=$1
else
exit
fi
INDEX_DATE_LIST=`curl -s localhost:9200/_cat/indices | grep $PREFIX$MONTH | awk -F $PREFIX '{print $2}' | awk '{print $1}' | sort -r`
for INDEX_DATE in $INDEX_DATE_LIST
do
INDEX_NAME="$PREFIX$INDEX_DATE"
CNT=`curl -s localhost:9200/_cat/indices | grep $INDEX_NAME | grep close | wc | cut -c6-7`
if [ $CNT -eq 1 ]
then
DATE=`date +"%Y%m%d_%H%M%S"`
echo "$DATE index is opening : $INDEX_NAME"
curl -s -XPOST http://localhost:9200/$INDEX_NAME/_open
echo ""
while [ 1 ]
do
CNT=`curl -s localhost:9200/_cat/shards | grep $INDEX_NAME | grep -v STARTED | wc | cut -c6-7`
DATE=`date +"%Y%m%d_%H%M%S"`
echo "$DATE Recovering Shard Count : $CNT"
if [ $CNT -eq 0 ]
then
DATE=`date +"%Y%m%d_%H%M%S"`
echo "$DATE index is opened : $INDEX_NAME"
break
fi
sleep 10
done
else
echo "index is already opened : $INDEX_NAME"
fi
done