> For the complete documentation index, see [llms.txt](https://esbook.kimjmin.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://esbook.kimjmin.net/03-cluster/3.3-master-and-data-nodes.md).

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

### 마스터 노드 (Master Node)

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

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

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

### 데이터 노드 (Data Node)

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

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

{% tabs %}
{% tab title="Node-1 (마스터)" %}
{% code title="config/elasticsearch.yml" %}

```yaml
node.master: true
node.data: false
```

{% endcode %}
{% endtab %}

{% tab title="Node-2 (데이터)" %}
{% code title="config/elasticsearch.yml" %}

```yaml
node.master: false
node.data: true
```

{% endcode %}
{% endtab %}

{% tab title="Node-3 (데이터)" %}
{% code title="config/elasticsearch.yml" %}

```yaml
node.master: false
node.data: true
```

{% endcode %}
{% endtab %}

{% tab title="Node-4 (데이터)" %}
{% code title="config/elasticsearch.yml" %}

```yaml
node.master: false
node.data: true
```

{% endcode %}
{% endtab %}
{% endtabs %}

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

![마스터 전용 노드와 데이터 노드 구분](/files/-LnKpwBWIwwxZXr1cEMp)

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

![Kibana 모니터링 화면에서 마스터 노드와 데이터 노드 확인](/files/-LnKqZrQzuaRIRdn6sLK)

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

### Split Brain

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

![네트워크 단절로 인한 클러스터 분리](/files/-LnKtagPohTrQzGWTr4D)

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

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

{% code title="elasticsearch.yml" %}

```yaml
discovery.zen.minimum_master_nodes: 2
```

{% endcode %}

&#x20; minimum\_master\_nodes 값은 `(전체 마스터 후보 노드 / 2) + 1` 개로 설정되어야 합니다. 마스터 후보 노드가 5개인 경우 3 으로 설정합니다.

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

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

![클러스터 분리 시 마스터 노드가 절반 이상인 클러스터만 생존](/files/-LnKxRWUMYG5ATpsysHP)

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