[Elasticsearch] 클러스터 rolling restarts

서버|2018. 2. 2. 10:06

클러스터의 무중단 서비스를 위해 노드의 순차적인 재시작이 필요한 경우가 있다.

- OS 업그레이드

- 플러그인 설치

- 엘라스틱 업그레이드


결론부터 정리하면 샤드가 배치되어 있는 데이터 노드에서 아래 1번부터 5번까지의 과정을 반복하면 된다.

 

1. shard allocation 옵션을 disabled 처리

1
2
3
4
5
$ curl -XPUT 'localhost:9200/_cluster/settings?pretty=true' -d '{
    "transient" : {
        "cluster.routing.allocation.enable" : "none"
    }
}'
cs


2. 노드 shutdown

1
$ kill -9 {PID}
cs


3. Elasticsearch 플러그인 설치


4. Elasticsearch 서버 구동


5. shard allocation 옵션을 enable 한다.

1
2
3
4
5
$ curl -XPUT 'localhost:9200/_cluster/settings?pretty=true' -d '{
    "transient" : {
        "cluster.routing.allocation.enable" : "all"
    }
}'
cs


자~ 여기서 궁금한 점이 생길 것이다.

귀찮게 그냥 Elasticsearch 서버 kill 하고 서버 시작하면 안돼?

안된다. :)


노드가 죽으면 Elasticsearch 클러스터에서는 샤드의 재배치 작업을 진행하게 된다.

재배치 작업이 무슨 말이냐? 에 대한 궁금증을 풀기 위해 테스트를 해보자.



Elasticsearch 서버 그냥 재시작


아래는 정상적인 상태의 클러스터 환경이다.

member_201709 인덱스의 설정은 shard : 5, replica : 1로 설정되어 있다.

그렇기에 다음과 같이 primary 샤드 5개가 있고, replica 샤드 5개가 클러스터의 데이터 노드에 골고루 배치되어 있다.

두꺼운 테두리가 primary 샤드이다.


이 상태에서 Carmilla Black 노드를 강제로 죽이겠다.

Carmilla Black 노드에 배치되어 있던 replica 샤드 3, 4는 Unassigned 상태가 된다.

그렇게 몇 분이 지나면 다음과 같이 클러스터 샤드의 재배치 작업이 진행된다. (고비용의 I/O 발생)

여기서 눈여겨 봐야 할 것은 Unassigned 된 replica 샤드 3, 4번만 재배치 되는 것이 아닌 전체 샤드의 재배치 작업이 발생된다는 점이다.


[재배치 상태 변화]

replica 3번 샤드 -> Thirty-Three 노드로 배치

replica 4번 샤드 -> Argus 노드로 배치

primary 0번 샤드 -> Midnight 노드로 배치


이제 죽였던 노드를 다시 살려보자.

새로운 노드가 클러스터에 참여하게 되면서 샤드의 재배치 작업이 또 발생한다.


이와 같은 동작은 노드를 죽이거나 살렸을 때 샤드의 재배치와 같은 고비용의 I/O를 발생시킨다.

만약 샤드의 크기가 몇 십 몇 백 기가바이트라면?

예상하겠지만 엄청난 시간이 소요될 것이다.



Elasticsearch 서버 rolling restarts


자 그럼 이와 같은 샤드의 재배치 작업 없이 클러스터의 노드를 재시작 하려면 어떻게 해야 할까?

위의 1~5번의 절차를 따라하면 된다.

샤드의 변화를 확인해 보기 위해 한번 해보자.


1. 현재 클러스터 노드 상태


2. Deathlok 노드의 shard allocation 옵션을 disabled 처리


3. Deathlok 노드 shutdown

이와 같은 상태로 계속 유지된다. 즉, 클러스터의 재배치 작업이 발생하지 않는다.


4. 노드 startup

노드가 추가 되었다. 아직은 샤드가 할당되지 않는다. allocation 옵션을 none으로 했기 때문이다.


5. 추가된 노드에 shard allocation 옵션을 all 처리

Unassigned 된 0, 1 샤드가 새로 추가된 노드에 할당된다.

테스트를 보면서 알겠지만 장애 상황이 아닌 일반적인 서버 재구동이 필요할 경우에는 rolling restart를 해야 한다.








댓글()