Elasticsearch 클러스터란?

📌 Elasticsearch는 여러 개의 노드(Node)가 하나의 클러스터(Cluster)로 묶여 동작하는 분산 시스템입니다.
각 노드는 데이터를 저장하고 검색하며, 클러스터 내 다른 노드들과 통신하여 데이터를 공유합니다.


클러스터를 구성하는 요소

Elasticsearch 클러스터는 여러 개의 노드로 구성되며, 각 노드는 역할에 따라 구분됩니다.

노드 유형 설명

마스터 노드 (Master Node) 클러스터 상태 관리 (샤드 할당, 노드 추가/삭제, 설정 변경 등)
데이터 노드 (Data Node) 실제 데이터를 저장하고 색인/검색 수행
코디네이팅 노드 (Coordinating Node) 검색 요청을 받아 데이터 노드에 분산 후 결과를 취합
머신러닝 노드 (ML Node) 이상 탐지 및 머신러닝 분석 수행
트랜스포트 노드 (Ingest Node) 데이터 전처리(ETL) 및 파이프라인 처리 수행

클러스터에서 노드 간 통신

(1) Elasticsearch 노드는 2개의 포트를 사용

  • HTTP 포트 (9200~9299) → 클라이언트와의 통신 (REST API 요청 처리)
  • TCP 포트 (9300~9399) → 클러스터 내부 노드 간 데이터 교환

기본적으로 1개의 물리 서버에 1개의 노드를 실행하는 것이 권장됨.


클러스터 구성 방법

(1) 여러 서버에서 하나의 클러스터 실행

서버 3대를 사용하여 3개의 노드를 실행하고, 하나의 클러스터로 구성할 수 있습니다.

# Node-1 설정 (서버 1)
cluster.name: my-cluster
node.name: node-1
network.host: 192.168.1.10
discovery.seed_hosts: ["192.168.1.11", "192.168.1.12"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
# Node-2 설정 (서버 2)
cluster.name: my-cluster
node.name: node-2
network.host: 192.168.1.11
discovery.seed_hosts: ["192.168.1.10", "192.168.1.12"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
# Node-3 설정 (서버 3)
cluster.name: my-cluster
node.name: node-3
network.host: 192.168.1.12
discovery.seed_hosts: ["192.168.1.10", "192.168.1.11"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

모든 노드의 cluster.name이 동일해야 하나의 클러스터로 동작.


(2) 하나의 서버에서 여러 개의 노드 실행

한 개의 물리 서버에서 여러 개의 Elasticsearch 노드를 실행할 수도 있습니다.
이 경우 각 노드는 다른 포트를 사용해야 하며, 클러스터명을 동일하게 설정해야 합니다.

🔹 Node-1 (es-cluster-1)

cluster.name: es-cluster-1
node.name: node-1
http.port: 9200
transport.port: 9300

🔹 Node-2 (es-cluster-1)

cluster.name: es-cluster-1
node.name: node-2
http.port: 9201
transport.port: 9301

🔹 Node-3 (es-cluster-2 - 다른 클러스터)

cluster.name: es-cluster-2
node.name: node-3
http.port: 9202
transport.port: 9302

Node-1과 Node-2는 같은 클러스터에서 동작하며, Node-3은 별도의 클러스터로 동작.


클러스터 실행 및 확인

(1) Elasticsearch 노드 실행

노드를 실행할 때 명령어를 사용하여 설정을 직접 입력할 수도 있습니다.

bin/elasticsearch -Ecluster.name=es-cluster-1 -Enode.name=node-1

(2) 실행된 노드 확인

노드 실행 후, 터미널에 출력되는 메시지를 확인할 수 있습니다.

[INFO ][o.e.c.s.MasterService    ] [node-1] elected-as-master ([1] nodes joined)

✅ elected-as-master 메시지를 통해 마스터 노드가 정상적으로 선출되었음을 확인 가능.


클러스터 노드 탐색 (Discovery)

(1) Discovery란?

새로운 노드가 추가될 때 기존 노드를 검색하여 같은 클러스터로 묶이는 과정을 Discovery라고 합니다.

(2) Discovery 과정

  1. discovery.seed_hosts에 설정된 노드 목록에서 검색을 시작.
  2. 해당 노드가 존재하면 cluster.name이 동일한지 확인.
  3. 동일하면 클러스터에 참여, 다르면 독립된 클러스터로 유지.
discovery.seed_hosts: ["192.168.1.10", "192.168.1.11", "192.168.1.12"]

최초 실행할 마스터 후보 노드 3~5개만 설정하면 자동으로 클러스터 탐색이 수행됨.


클러스터 상태 확인

(1) 현재 실행 중인 노드 조회

GET _cat/nodes?v

IP 주소 노드명 역할 상태

192.168.1.10 node-1 마스터 정상
192.168.1.11 node-2 데이터 정상
192.168.1.12 node-3 데이터 정상

(2) 현재 클러스터 상태 확인

GET _cluster/health?pretty

응답 예시

{
  "cluster_name": "my-cluster",
  "status": "green",
  "number_of_nodes": 3,
  "number_of_data_nodes": 2,
  "active_primary_shards": 5,
  "active_shards": 10
}

"status": "green"이면 정상 운영 중, "yellow" 또는 "red"는 문제 발생 가능.


Elasticsearch 클러스터 구성 시 고려 사항

(1) 마스터 노드 최소 3개 유지

  • Split Brain 방지를 위해 마스터 후보 노드는 항상 홀수 개(3, 5, 7개 등)로 설정.

(2) 데이터 노드와 마스터 노드 분리

  • 대규모 클러스터에서는 마스터 노드와 데이터 노드를 분리하여 성능 최적화.

(3) Discovery 설정 필수

  • discovery.seed_hosts를 설정하지 않으면 새로운 노드가 기존 클러스터에 합류하지 못할 수 있음.

결론

  • Elasticsearch는 여러 개의 노드로 이루어진 분산 클러스터 구조.
  • 클러스터를 구성하려면 모든 노드의 cluster.name을 동일하게 설정해야 함.
  • 마스터 노드와 데이터 노드를 분리하여 성능과 안정성을 향상할 수 있음.
  • Discovery 설정을 통해 노드가 자동으로 클러스터에 합류할 수 있도록 설정 필요.

 

+ Recent posts