본문 바로가기

ElasticSearch

[Elasticsearch] Splitbrain이란? 클러스터 마스터 노드가 홀수개면 좋은 이유

 

 Elasticsearch 뿐만 아니라 클러스터로 작동하는 모든 서비스들은 공통적으로 마스터 후보 노드를 홀수개로, 그리고 최소 살아있어야 하는 노드 수를 n/2+1로 설정하라고 권장한다.(살아있어야 하는 노드 수의 경우 최근에는 자동으로 설정되는 경우가 많은 것 같다.)

사실 클러스터를 구성하는 노드 수에 맞게 자동으로 살아있어야 하는 노드 수가 조절되는 경우 만약 노드가 시간 간격을 두고 하나씩 차례로 다운되는 것은 전혀 문제가 되지 않는다. 마스터 노드를 홀수개로, 최소 살아있어야 하는 노드 수 설정 등은 모두 splitbrain 상황을 대비하여 설정하는 것이다.

 splitbrain이란 간단하게 여러 개의 노드가 동시에 클러스터에서 떨어져나오는 현상이라고 생각하면 된다. (실제 동시에 다운된 것일 수도 있고, 네트워크가 분리된 것일 수도 있다). 예를 들어 노드가 6개로 구성된 클러스터에서 네트워크가 단절된 상황을 생각해보자. 노드 6개 중 3개는 A네트워크에, 나머지 3개는 B네트워크에 속해있다. 이 때 네트워크가 단절되면 A네트워크에 속한 노드 3개는 B네트워크에 속한 노드 3개가 다운되었다고 생각하고, 자기들끼리 클러스터를 유지해 나간다. 하지만 B네트워크에 속한 노드들은 실제로 다운된 것이 아니기 때문에 A네트워크에 속한 노드들과 똑같이 A네트워크에 속한 노드들이 다운된 것이라고 생각하고 자기들끼리 클러스터를 유지해 나간다.

 이 상황에서 네트워크가 복구되면, 두 클러스터 사이에 싱크가 맞지 않는다. Elasticsearch 내부적으로 이러한 상황에서 투표를 통해 두 클러스터 중 하나를 선택하여 그 클러스터를 기준으로 데이터를 맞추는데 이렇게 3/3으로 나눠지는 경우 다수결이 나오지 않는다. 따라서 n/2+1 조건을 주어 전체 클러스터를 구성하고 있는 6개 중 3개 이상이 다운되었다고 탐지되면 나눠진 클러스터 모두 작동하지 않게 설정하는 것이다. 다만 클러스터 전체를 짝수개로 할 경우 splitbrain이 발생하자마자 바로 서비스가 중단된다. 그렇기 때문에 클러스터 전체를 홀수개로 설정하여 splitbrain이 발생한다 하더라도 클러스터 하나는 작동하도록 가용성을 확보해 두는 것이다.

 

 결론은, 클러스터 마스터 노드를 홀수개로 설정하라. n/2+1개 조건을 설정하라. 두 가지 설정은 노드가 하나씩 죽었을때 의미가 있는 것이 아니고 단체로 죽었을때를 위해 설정하는 것이다.

'ElasticSearch' 카테고리의 다른 글

[ElasticSearch] Replica에 관하여  (0) 2020.09.09
[ElasticSearch] Rolling Restart 방법  (0) 2020.09.08