728x90

ES 운영중에는 롤링 리스타트를 수행할 일이 매우 많다. 동적으로 변경할 수 없는 설정의 적용, 플러그인 설치나 삭제의 적용, 엘라스틱서치의 버전 업그레이드 등 다양한 상황에서 롤링 리스타트가 필요하다. 그리고 무엇보다 장애 상황에서 문제를 일으키고 있는 노드를 재기동하기 위해 많이 수행된다. 

롤링 리스타트는 크게 샤드 할당 비활성화, flush 수행, 노드 재기동, 샤드 할당 활성화, green 상태까지 대기 순으로 수행된다. 

 

샤드 할당 비활성화

노드를 재기동하기 위해 엘라스틱서치 프로세스를 종료시키면 클러스터 구성에서 노드가 빠진다. 

빠진 노드가 데이터 노드라면 주 샤드를 새로 지정하고 줄어든 복제본 개수를 맞추기 위해 복제본 샤드를 새로 할당해 생성하는 작업이 수행된다.  사실 롤링 리스타트 과정에서는 복제본 샤드를 새로 생성하는 작업이 필요없다.

재기동한 노드가 클러스터에 합류하면 자신이 들고 있던 샤드를 복제본 샤드로 다시 띄우기 때문이다. 하지만 클러스터 입장에서는 노드가 재기동을 위해 빠졌는지 장애로 인해 빠졌는지 구분할 방법이 없다. 그저 노드가 빠지면 일정 시간 대기한 뒤 복제본 샤드 할당 작업을 수행할 뿐이다. 

불필요한 작업을 막기 위해 엘라스틱 클러스터의 샤드 할당 작업을 제어할 수 있다. 클러스터 설정 API 를 통해 cluster.routing.allocation.enable 설정을 동적으로 변경하면 된다. 다음과 같이 수행한다. 

 

PUT _cluster/settings
{
	"transient":{
    "cluster.routing.allocation.enable": "primaries"
	}
}

primaries 는 주 샤드만 할당을 허용하는 설정이다. 이 설정에는 다음과 같은 값을 지정할 수 있다.

  • all : 모든 종류의 샤드 할당을 허용한다. 가장 기본적인 상태이며 작업 중이나 장애 상황이 아니면 이 상태여야 한다. 재기동이 끝나면 샤드 할당을 다시 활성화하는 과정이 있다. 이때 all로 지정된다. 
  • primaries :  주 샤드의 할당만을 허용한다. 
  • new_primaries :  새로 생성된 인덱스의 주 샤드 할당만을 허용한다. 
  • none : 모든 샤드 할당을 불허한다. 이렇게 주 샤드의 할당도 불허하면 새로 인덱스가 생기는 상황 등 특정한 타이밍에 일부 인덱스의 이룹 데이터가 서비스 되지 않는 상황이 발생할 수 있다. 

엘라스틱서치 6.7 미만의 구버전에서는 primaries 지정이 불가능하다. none으로 지정해서 롤링 리스타트를 수행해야 한다. 

데이터 노드가 아니라면 불필요한 샤드 할당이 일어나지 않기 때문에 이 과정을 생략해도 된다. 재기동이 끝나고 샤드 할당을 다시 활성화 하는 과정 역시 생략해도 된다. 

 

flush 수행

flush 를 수행해서 translog를 비우고 데이터를 디스크에 안전하게 기록한다. 루씬 인덱스에 반영되지 않고 아직 translog에 남아 있는 내용은 노드 재기동시 샤드 복구 과정에서 처리 되기 때문에 이 작업은 반드시 필요한 작업은 아니다. 하지만 이런 작업에는 시간과 자원이 소요된다. 미리 flush를 수행하고 재기동을 하는 것이 좋다. 

POST _flush

엘라스틱서치 6.7 미만의 구 버전에서는 flush 가 아니라 synced flush 를 수행해야 한다. 

POST _flush/synced

synced flush는 flush 를 수행한 이후에 샤드에 sync_id라는 마커를 발급한다. 재기동 이후 샤드 복구 과정에서 sync_id를 비교해서 더 이상 샤드에 새로운 색인 작업이 들어오지 않았는지 확인한다. sync_id가 같은 샤드는 내용이 같은 샤드로 파악한다. 

 

최신 버전에서는 이런 방법을 사용하지 않는다. 샤드 이력 보존이라는 메커니즘을 사용하기 때문에 flush 만 수행해도 같은 효과가 난다. 

sysnced flush 는 지원 중단 선언되었으며 8 버전부터는 삭제되었다. 

 

노드 재기동

사드 할당을 비활성화 하고 flush 를 무사히 완료 했으면 노드를 재기동 한다. 프로세스를 kill 하고 새로 띄우면 된다. 프로세스를 새로 띄우기 전에 반드시 기존 프로세스가 완전히 종료됐는지 확인하고 띄워야 한다. 

이후 노드가 완전히 기동하고 클러스터에 합류할 때까지 대기한다. 다음과 같이 cat nodes API 를 호출해서 재기동한 노드가 클러스터에 잘 붙었는지 확인한다. 

GET _cat/nodes

클러스터의 상태가 좋지 않거나 장애 상황에서 재기동을 수행 중이라면 cat nodes API 의 수행에 오랜 시간이 걸릴 수 있다. 

cat nodes API 의 수행 자체가 클러스터에 부담을 줄 수 있다. 이런 상황이라면 직접 엘라스틱서치의 로그를 보며 노드가 잘 기동했는지 확인한다. 로그에서 started 가 확인되면 일단 노드가 기동은 된 것이다. 

 

샤드 할당 활성화 

노드 재기동에 성공했으면 샤드 할당을 다시 활성화 한다. 

PUT _cluster/settings
{
  "transient" {
      "cluster.routing.allocation.enable" : "all"
    }
}

green 상태까지 대기 

이후 클러스터 상태가 green 이 될때까지 대기한다. 

GET _cat/health?v

green 상태가 되면 다시 샤드 할당을 비활성화하고 다음 노드르 ㄹ재기동하는 작업을 필요한 만큼 반복된다. 

728x90
복사했습니다!