아래 공식문서에서 discovery 파트와 Quorum-based decision making, Voting configurations 부분을 참고하였다 (버전 7.x)
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html
두 줄 요약:
1) 새로운 노드를 추가하거나 클러스터를 새로 형성할 때 클러스터 내 소속될 노드를 찾는 discovery 과정이 발생한다. 특정 클러스터에 새로운 노드를 추가하고 싶으면 해당 노드의 elasiticsearch.yml 파일에 클러스터 이름을 해당 클러스터로 해주어야 한다
2) 클러스터의 마스터 후보 노드의 개수는 최소 3개여야 하며 마스터 후보 노드가 과반수 이상 한꺼번에 중지되면 클러스터는 동작하지 않는다
ex) 마스터 후보 노드가 5개인 클러스터에서 3개 중지시키면 동작하지 않음
아래는 그 과정과 왜 그렇게 해야되는지에 대한 설명을 공식문서를 참고해서 정리하였다
cluster formation 모듈이 클러스터를 형성하기 위해 다른 노드를 찾는 과정을 말한다. 아래 두 가지 상황에서 발생한다.
seed hosts providers*에 있는 seed addresses와 마지막으로 알려진 클러스터에 있었던 마스터 후보 노드의 주소에서부터 Discovery 과정이 시작된다.
각각의 노드는 제공된 seed address와 연결하고, 연결된 노드가 어떤 노드인지를 식별하고, 마스터 후보인지 확인해보면서 seed address에 해당하는 노드들을 조사함
성공적으로 1번이 끝나면 각각의 노드는 원격 노드와 마스터 후보 peer 노드 리스트를 공유한다. 원격 노드는 마스터 후보 peer 노드와 차례로 응답함.
*seed hosts providers는 크게 두 가지 종류가 있음
setting 기반 provider: elasticsearch.yml의 discovery.seed_hosts
필드에 seed host의 주소를 지정. (seed hosts provider의 기본값)
file 기반 provider: 별도의 외부 파일에 seed host의 주소를 지정해놓고 사용
이 외에도 플러그인을 통해 설정 가능
또한 각 노드는 동일한 클러스터 이름을 갖는 노드들끼리 클러스터를 형성한다. A라는 클러스터가 존재하는 상황에서 새로운 노드가 시작되었고, 해당 노드의 클러스터 이름이 B라면 해당 노드는 A클러스터에 합류하는게 아니라 B라는 이름의 새로운 클러스터를 따로 형성하여 B에 조인한다. 따라서 새 노드를 기존 클러스터에 조인시키고자 할 때 클러스터 이름에 주의해줘야 한다. 클러스터 이름은 elasticsearch.yml에서 지정해줄 수 있다.
노드가 추가되거나 제거됨에 따라 Elasticsearch 는 새 마스터를 선택하거나 새 클러스터 상태를 커밋해야 한다. 일반적으로 이 결정을 내리는 데 참여하는 노드들은 현재 클러스터에 있는 모든 마스터 후보 노드들의 집합이다. (이 마스터 후보 노드들의 집합을 voting configuration이라고 함) 하지만 상황에 따라 마스터 후보 노드의 일부만 결정에 참여할 수도 있다.
마스터 노드가 다운된 상황이라고 하자. 어떤 노드가 새로운 마스터 노드로 선출될 지 결정할 때, 이 투표 구성에 있는 노드 중 절반 이상이 응답한 후에만 선출이 가능하다. 이 방식을 쿼럼 기반 의사 결정, Quorum-based decision making이라고 한다.
따라서 마스터 후보 노드의 절반 이상을 동시에 모두 종료된 상태라면 마스터 노드 선출이 불가능하게 된다. 이 경우에는 클러스터는 green(safe) 상태에서 벗어나 더 이상 사용할 수 없게 된다.
앞으로 등장하는 절반 이상이나 과반수라는 용어는 n/2+1 이상이라는 뜻으로 사용하였다. n이 홀수라면 n/2는 가장 가까운 정수로 반올림한 값이다.
ex)
마스터 후보 노드가 2개일 때:
노드 1개가 다운되었을 때 투표에 참여할 수 있는 노드가 과반수 이하가 됨 (2개 중 2개 모두가 참여해야 하는데 1개밖에 없음)
마스터 후보 노드가 3개일 때:
노드 1개가 다운되어도 투표에 참여할 수 있는 노드가 2개이므로 과반수를 넘음 (3개 중 2개가 참여해야 하는데 1개가 다운되어도 여전히 2개가 남아있어 조건 충족)
다만 노드 2개가 동시에 다운되어서 1개가 남은 경우에는 과반수 기준을 충족시키지 못하므로 클러스터가 이용 블가능한 상태가 됨
따라서 es는 마스터 후보 노드의 최소 개수로 3개 이상을 권장한다. 3개보다 작은 경우 마스터 후보 노드 하나만 다운이 되어도 시스템에 장애가 발생해 redundancy를 보장하지 못하기 때문이다.
또한 투표 구성에 있는 (기본값: 모든 마스터 후보 노드) 노드의 절반 이상을 동시에 중지시키도 안 된다.
+) 추가
이전 버전에서는 *split brain 문제를 고려하여 마스터 후보 노드의 개수를 홀수로만 설정할 것을 권장하였다.(는 걸로 알고 있으나 틀리다면 댓글 부탁드립니다^^..)
최근 버전은 (버전 7.x 기준) 마스터 후보 노드가 짝수라면 후보 노드 하나를 제외시켜서 의도적으로 훌수로 만든 뒤 투표 구성을 이룬다. 따라서 마스터 후보 노드의 개수가 4개여도 상관이 없다.
*split brain 문제란 네트워크 단절 등의 이유로 클러스터 하나가 두 개로 분리되어서 각각 따로 돌아가는 상황을 말한다. 각각의 클러스터에서 작업이 이루어지다가 이후 하나의 클러스터로 합쳐졌을 때 데이터 정합성에 어긋나 문제가 발생할 수 있다.
ex) 마스터 후보 노드가 4개일 때, 이전 버전에서 투표 구성은 이 4개의 후보 노드가 전부 참여하는 걸로 이루어진다 따라서 무조건 3개 이상의 마스터 후보 노드가 필요하다.
이 클러스터가 두 개의 클러스터로 분리되어서 각각 마스터 후보 노드 2개씩 들어간다고 할 때, 두 개의 클러스터 모두 과분수 3을 충족하지 못하므로 동작하지 않는다.
현재는 마스터 후보 노드가 4개더라도 3개의 마스터 후보 노드만 투표에 참여한다. 여기서 과반수로 필요한 마스터 후보 노드는 2개가 된다. 이 클러스터가 두 개의 클러스터로 분리되어서 아래와 같은 상황이 발생한다고 하자
cluster 1: 투표 구성 노드1, 투표 구성 노드2
cluster 2: 투표 구성 노드1, 마스터 후보 노드(투표 구성에 참여하지 않음)
두 개의 클러스터 중 투표 구성 노드가 과반수를 갖는 cluster 1이 살아남고 cluster 2가 작동이 되지 않는다. 추후 클러스터를 하나로 합칠 때 cluster 1의 데이터를 바탕으로 2를 복구하면 된다.
피드백은 언제나 환영입니다!
참고:
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html
https://esbook.kimjmin.net/03-cluster/3.3-master-and-data-nodes