기본 3노드 클러스터 구성을 위한 단계별 가이드

탄력적인 기본 3노드 Elasticsearch 클러스터를 빠르게 설정하는 방법을 알아보세요. 이 단계별 튜토리얼은 `elasticsearch.yml`의 필수 구성, `cluster.initial_master_nodes`를 사용한 클러스터 검색 부트스트래핑, 서비스 시작, 그리고 실제 cURL 명령을 사용하여 노드 전반의 상태 및 샤드 복제 확인을 다룹니다.

48 조회수

기본 3노드 클러스터 구성을 위한 단계별 가이드

복원력 있는 Elasticsearch 클러스터를 설정하는 것은 검색 및 분석 인프라에서 고가용성과 수평적 확장성을 달성하는 데 기본이 됩니다. 3노드 클러스터는 서비스 중단 없이 단일 노드 장애를 견딜 수 있는 중복성을 제공하므로 훌륭한 시작점입니다. 이 종합 가이드는 개발 환경 또는 소규모 프로덕션 배포에 이상적인 기본 3노드 Elasticsearch 클러스터를 설치, 구성 및 확인하는 과정을 안내합니다.

이 튜토리얼이 끝날 때쯤이면 Elasticsearch의 핵심 분산 기능을 활용하여 데이터를 안전하게 분산하고 복제할 수 있는 작동 가능한 클러스터를 갖게 될 것입니다.


전제 조건

구성을 시작하기 전에 다음 사항이 준비되어 있는지 확인하십시오.

  1. 3개의 별도 서버/VM: 각 서버는 하나의 노드를 호스팅합니다. 이 가이드에서는 3개의 독립된 머신 또는 Docker 컨테이너가 준비되어 있다고 가정합니다.
  2. Java 개발 키트(JDK): Elasticsearch는 모든 노드에 호환되는 JDK가 설치되어 있어야 합니다 (예: Elasticsearch 버전에 따라 JDK 17).
  3. 네트워크 연결: 3개의 노드 모두 필요한 포트(기본 HTTP 포트: 9200, 기본 전송 포트: 9300)를 통해 서로 통신할 수 있는지 확인하십시오.
  4. 동일한 Elasticsearch 설치: 모든 노드에 동일한 버전의 Elasticsearch를 다운로드하여 압축 해제하십시오.

1단계: 각 노드의 elasticsearch.yml 구성

Elasticsearch 설치의 config/ 디렉터리에 있는 구성 파일인 elasticsearch.yml은 각 노드가 클러스터 내에서 어떻게 동작할지 정의하는 데 중요합니다. 각 노드별로 특정 설정을 조정해야 합니다.

세 가지 역할을 암시적으로 정의할 것입니다. 즉, 마스터 후보 노드 1개와 데이터 후보 노드 3개입니다. 3노드 클러스터의 경우, 모든 노드가 마스터, 데이터 및 수집(ingest) 역할을 모두 갖도록 허용하는 것이 일반적인 관행입니다.

모든 노드에 대한 공통 설정

다음 설정이 세 구성 파일 전체에서 동일한지 확인하십시오.

# 클러스터 이름: 모든 노드에서 동일해야 함
cluster.name: my-three-node-cluster

# 검색 설정 (초기 조인에 중요)
# 검색 부트스트랩을 위해 알려진 노드 목록 사용
discovery.seed_hosts: ["node1_ip:9300", "node2_ip:9300", "node3_ip:9300"]

# 쿼럼(N/2 + 1)에 필요. 3개 노드의 경우 2개의 투표가 필요합니다.
cluster.initial_master_nodes: ["node1_name", "node2_name", "node3_name"]

# 네트워크 설정 (올바른 IP에 바인딩하도록 보장)
network.host: 0.0.0.0 # 또는 호스트의 특정 개인 IP

# HTTP 포트 (외부 액세스)
http.port: 9200

# 전송 포트 (내부 클러스터 통신)
transport.port: 9300

노드별 고유 설정

각 노드는 고유한 node.name이 필요하며, 동일한 머신에서 실행하거나 스토리지를 공유하는 경우 잠재적으로 고유한 path.data가 필요할 수 있습니다.

노드 1 구성 (node1_ip)

# 노드 1에 대한 고유 식별자
node.name: node-1

# 경로가 다른 경우
# path.data: /var/lib/elasticsearch/data_node1

노드 2 구성 (node2_ip)

# 노드 2에 대한 고유 식별자
node.name: node-2

노드 3 구성 (node3_ip)

# 노드 3에 대한 고유 식별자
node.name: node-3

cluster.initial_master_nodes에 대한 중요 참고 사항: 이 설정은 클러스터가 처음 시작될 때만 사용됩니다. 클러스터가 형성되면 Elasticsearch는 마스터 선출을 내부적으로 관리합니다. 완전히 다운된 클러스터를 다시 시작해야 하는 경우 이 이름이 초기 구성과 일치하는지 확인해야 합니다.


2단계: 역할 설정 (선택 사항이지만 권장됨)

기본 구성에서는 노드가 모든 역할(마스터, 데이터, 수집, 조정)을 맡을 수 있지만, 대규모 배포에서는 역할을 분리합니다. 강력한 3노드 설정을 위해 모든 노드가 마스터가 될 수 있도록 보장합니다.

다음 역할 구성을 세 노드 모두의 elasticsearch.yml 파일에 추가하십시오.

# 이 초기 설정을 위해 모든 노드에서 표준 역할 활성화
node.roles: [ master, data, ingest, remote_cluster_client ]

복원력을 위한 쿼럼 처리

3개 노드가 있으면 클러스터는 쿼럼(3개 노드 중 2개 유지)을 유지하면서 노드 1개의 손실을 감당할 수 있습니다. 이는 1단계에서 제공된 cluster.initial_master_nodes 목록을 통해 관리됩니다.


3단계: 클러스터 노드 시작

각 노드에서 Elasticsearch를 순차적으로 시작합니다. 현대의 Elasticsearch는 순서에 상관없는 시작을 잘 처리하지만, 일반적으로 cluster.initial_master_nodes에 나열된 노드부터 먼저 시작하는 것이 가장 안전합니다.

노드 1, 노드 2 및 노드 3에서:

Elasticsearch 설치 디렉터리로 이동하여 다음을 실행하십시오.

# 포그라운드에서 실행하는 경우 (디버깅에 유용)
bin/elasticsearch

# 백그라운드에서 실행하는 경우 (프로덕션 권장)
bin/elasticsearch -d

각 노드의 로그(logs/elasticsearch.log)를 모니터링하여 성공적인 시작 메시지, 특히 클러스터에 성공적으로 조인했음을 나타내는 메시지를 확인하십시오.


4단계: 클러스터 상태 확인

모든 노드가 시작되면 모든 노드의 HTTP 포트(기본값 9200)를 통해 액세스할 수 있는 _cat/health API를 사용하여 클러스터 상태를 확인합니다.

노드에 접근할 수 있는 머신(예: curl 사용)에서 다음으로 액세스하십시오.

상태 확인:

curl -X GET "http://node1_ip:9200/_cat/health?v"

예상 출력 스니펫:

epoch timestamp cluster status node.total node.data shards pri relo init unassigned unpersisted
1701331200 12:00:00 my-three-node-cluster green 3 3 0 0 0 0 0 0

statusgreen이고 node.total3이면 클러스터가 올바르게 작동 중인 것입니다.

노드 멤버십 확인

모든 노드가 서로를 인식하고 있는지 확인하려면 노드 목록을 확인하십시오.

curl -X GET "http://node1_ip:9200/_cat/nodes?v"

node-1, node-2, node-3에 해당하는 세 개의 독립적인 항목이 표시되어야 하며, 각 항목은 IP 주소와 역할(m은 마스터 후보, d는 데이터)을 보여줍니다.


5단계: 복제가 포함된 테스트 인덱스 생성

클러스터의 데이터 분산 및 복제 처리 능력을 확인하려면 최소한 하나의 복제본을 지정하여 인덱스를 생성해야 합니다.

3노드 클러스터에서는 number_of_replicas1로 설정하면 모든 기본 샤드에 대해 다른 노드에 분산된 하나의 복사본(복제본)이 있어 즉각적인 내결함성을 제공합니다.

인덱스 생성 명령:

```bash
curl -X PUT "http://node1_ip:9200/test_data_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 3