3.3 마스터 노드와 데이터 노드 - Master & Data Nodes

이 문서의 허가되지 않은 무단 복제나 배포 및 출판을 금지합니다. 본 문서의 내용 및 도표 등을 인용하고자 하는 경우 출처를 명시하고 김종민(kimjmin@gmail.com)에게 사용 내용을 알려주시기 바랍니다.

마스터 노드 (Master Node)

Elasticsearch 클러스터는 하나 이상의 노드들로 이루어집니다. 이 중 하나의 노드는 인덱스의 메타 데이터, 샤드의 위치와 같은 클러스터 상태(Cluster Status) 정보를 관리하는 마스터 노드의 역할을 수행합니다. 클러스터마다 하나의 마스터 노드가 존재하며 마스터 노드의 역할을 수행할 수 있는 노드가 없다면 클러스터는 작동이 정지됩니다.

elasticsearch.yml에 디폴트 설정은 node.master: true로 되어 있습니다. 기본적으로는 모든 노드가 마스터 노드로 선출될 수 있는 마스터 후보 노드 (master eligible node) 입니다. 만약에 현재 마스터 역할을 수행하고 있는 노드가 네트워크상에서 끊어지거나 다운되면 다른 마스터 후보 노드 중 하나가 마스터 노드로 선출이 되어 마스터 노드의 역할을 대신 수행하게 됩니다. 마스터 후보 노드들은 처음부터 마스터 노드의 정보들을 공유하고 있기 때문에 즉시 마스터 역할의 수행이 가능합니다.

클러스터가 커져서 노드와 샤드들의 개수가 많아지게 되면 모든 노드들이 마스터 노드의 정보를 계속 공유하는 것은 부담이 될 수 있습니다. 이때는 마스터 노드의 역할을 수행 할 후보 노드들만 따로 설정해서 유지하는 것이 전체 클러스터 성능에 도움이 될 수 있습니다. 마스터 노드로 사용하지 않는 노드들은 설정값을 node.master: false 로 하여 마스터 노드의 역할을 하지 않도록 합니다.

데이터 노드 (Data Node)

데이터 노드는 실제로 색인된 데이터를 저장하고 있는 노드입니다. 클러스터에서 마스터 노드와 데이터 노드를 분리하여 설정 할 때 마스터 후보 노드들은 node.data: false 로 설정하여 마스터 노드 역할만 하고 데이터는 저장하지 않도록 할 수 있습니다. 이렇게 하면 마스터 노드는 데이터는 저장하지 않고 클러스터 관리만 하게 되고, 데이터 노드는 클러스터 관리 작업으로 부터 자유롭게 되어 데이터 처리에만 집중할 수 있습니다.

다음은 4개의 노드를 실행하는데 node-1 은 마스터의 역할만 실행하는 전용 노드 (영어로는 Dedicated Master Node 라고 부릅니다), node-2, node-3, node-4 는 마스터 역할은 하지 않고 데이터 저장만 하는 노드로 설정하는 예제입니다.

Node-1 (마스터)
Node-2 (데이터)
Node-3 (데이터)
Node-4 (데이터)
Node-1 (마스터)
config/elasticsearch.yml
node.master: true
node.data: false
Node-2 (데이터)
config/elasticsearch.yml
node.master: false
node.data: true
Node-3 (데이터)
config/elasticsearch.yml
node.master: false
node.data: true
Node-4 (데이터)
config/elasticsearch.yml
node.master: false
node.data: true

위와 같이 설정한 4개의 노드를 하나의 클러스터로 묶고 데이터를 입력하게 되면 데이터는 다음과 같이 node-2, node-3, node-4 에만 저장이 됩니다.

마스터 전용 노드와 데이터 노드 구분

Kibana의 Monitoring 화면에서 노드의 역할들을 확인할 수 있습니다. 대부분의 Elastic Stack 모니터링 도구에서 마스터 노드는 별(⭑) 표시로 구분합니다.

Kibana 모니터링 화면에서 마스터 노드와 데이터 노드 확인

실제 운영 환경에서는 위 예제처럼 마스터 후보를 노드는 1개만 설정하면 안 되고 최소 3개 이상의 홀수개로 설정해야 합니다. 이유는 다음의 Split Brain 문제에서 설명합니다.

Split Brain

마스터 후보 노드를 하나만 놓게 되면 그 마스터 노드가 유실되었을 때 클러스터 전체가 작동을 정지 할 위험이 있습니다. 그래서 최소한의 백업용 마스터 노드를 설정하게 되는데 이 때 마스터 후보 노드들은 3개 이상의 홀수 개를 놓는 것을 권장하고 있습니다. 만약에 마스터 후보 노드를 2개 혹은 짝수로 운영하는 경우 네트워크 유실로 인해 다음과 같은 상황을 겪을 수 있습니다.

네트워크 단절로 인한 클러스터 분리

위와 같이 네트워크 단절로 마스터 후보 노드인 node-1 과 node-2 가 분리되면 각자가 서로 다른 클러스터로 구성되어 계속 동작하는 경우가 있을 수 있습니다. 이 상태에서 각자의 클러스터에 데이터가 추가되거나 변경되고 나면 나중에 네트워크가 복구 되고 하나의 클러스터로 다시 합쳐졌을 때 데이터 정합성에 문제가 생기고 데이터 무결성이 유지될 수 없게 됩니다. 이런 문제를 Split Brain 이라고 합니다.

Split Brain의 방지를 위해서는 마스터 후보 노드를 3개로 두고 클러스터에 마스터 후보 노드가 최소 2개 이상 존재하고 있을 때에만 클러스터가 동작하고 그렇지 않은 경우 클러스터는 동작을 멈추도록 해야 합니다. 6.x 이전 버전 에서는 elasticsearch.yml 에서 discovery.zen.minimum_master_nodes 설정을 이용하여 지정이 가능합니다.

elasticsearch.yml
discovery.zen.minimum_master_nodes: 2

minimum_master_nodes 값은 (전체 마스터 후보 노드 / 2) + 1 개로 설정되어야 합니다. 마스터 후보 노드가 5개인 경우 3 으로 설정합니다.

7.0 부터는 discovery.zen.minimum_master_nodes 설정이 사라지고 대신 node.master: true 인 노드가 추가되면 클러스터가 스스로 minimum_master_nodes 노드 값을 변경하도록 되었습니다. 사용자는 최초 마스터 후보로 선출할 cluster.initial_master_nodes: [ ] 값만 설정하면 됩니다.

위 설정을 하고 나면 네트워크가 단절 되었을 때 minimum_master_nodes 가 2 이상인 클러스터만 살아있고 그렇지 않은 클러스터는 동작을 멈추게 됩니다.

클러스터 분리 시 마스터 노드가 절반 이상인 클러스터만 생존

위의 경우 데이터는 노드 node-4, node-5의 데이터만 사용이 가능하고 node-6은 네트워크가 복구될 때 까지 동작하지 않고 노드가 분리되기 이전 상태 그대로 유지됩니다. 이렇게 하면 나중에 클러스터가 복구 되었을 때 node-4, node-5에 추가되거나 변경, 삭제 된 데이터의 정보들만 node-6으로 업데이트 되고 데이터 정합성에는 문제가 없게 됩니다. 이처럼 Split Brain 문제를 피하기 위해서 마스터 후보 노드 개수는 항상 홀수로 하고 가동을 위한 최소 마스터 후보 노드 설정은 (전체 마스터 후보 노드)/2+1 로 설정해야 합니다.