Elasticsearch 패치시 간략한 팁 & 인덱스를 하나씩 날짜의 역순으로 오픈하는 스크립트


(강용균) #1

어제 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

(system) #2