Elasticsearch 클러스터 설정: 단계별 구성 가이드

이 종합 가이드는 Elasticsearch 클러스터를 설정하고 구성하기 위한 단계별 과정을 제공합니다. 설치부터 노드 구성에 이르는 필수 단계를 배우고, 클러스터 이름, 노드 역할, 네트워크 구성 및 디스커버리(discovery)와 같은 중요한 설정을 포함합니다. 실용적인 예제와 모범 사례를 활용하여 분산 검색 및 분석 엔진을 최적의 성능과 확장성을 위해 최적화하세요.

39 조회수

Elasticsearch 클러스터 설정: 단계별 구성 가이드

견고한 Elasticsearch 클러스터를 설정하는 것은 강력한 분산 검색 및 분석 기능을 활용하기 위한 기본 단계입니다. 소규모 프로젝트를 위한 배포든 대규모 엔터프라이즈 솔루션을 위한 배포든, 핵심 구성 원칙을 이해하는 것은 최적의 성능, 확장성 및 안정성을 보장하는 데 매우 중요합니다. 이 가이드는 Elasticsearch 클러스터를 구성하는 포괄적인 단계별 지침을 제공하며, 초기 설치부터 노드 설정 미세 조정에 이르는 필수적인 측면을 다룹니다.

적절한 클러스터 설정은 Elasticsearch 인스턴스가 원활하게 실행되도록 보장할 뿐만 아니라, 증가하는 데이터 볼륨과 쿼리 로드를 처리할 수 있도록 준비시킵니다. 잘못된 구성은 성능 병목 현상, 데이터 불일치, 심지어 클러스터 불안정성을 초래할 수 있습니다. 이 가이드를 따르면 특정 요구 사항에 맞춘 복원력 있고 효율적인 Elasticsearch 환경을 구축하는 지식을 얻게 될 것입니다.

필수 조건

구성으로 들어가기 전에 다음 사항이 갖춰져 있는지 확인하십시오:

  • Java 개발 키트(JDK): Elasticsearch에는 호환되는 JDK가 필요합니다. Elasticsearch 7.x 및 이후 버전에는 JDK 11 이상이 필요합니다. Java 설치를 확인하십시오:
    bash java -version
  • 시스템 리소스: Elasticsearch 노드에 충분한 RAM, CPU 및 디스크 공간을 할당하십시오. 정확한 요구 사항은 데이터 볼륨과 쿼리 복잡성에 따라 달라집니다.
  • 네트워크 접근: 노드가 구성된 전송 포트(기본값은 9300)를 통해 서로 통신할 수 있는지 확인하십시오.

설치

이 가이드는 구성에 중점을 두지만, 성공적인 설정은 올바른 설치에서 시작됩니다. Elasticsearch는 패키지 관리자(apt, yum)를 통해, 아카이브를 다운로드하여, 또는 Docker를 사용하여 설치할 수 있습니다. 운영 체제 또는 배포 방법에 따른 자세한 설치 지침은 공식 Elasticsearch 문서를 참조하십시오.

핵심 구성 파일

Elasticsearch의 주요 구성 파일은 elasticsearch.yml이며, 일반적으로 Elasticsearch 설치 디렉터리의 config/ 디렉터리에 위치합니다. 이 파일 내의 주요 설정은 클러스터 동작을 좌우합니다.

클러스터 설정: 주요 구성 지시어

1. 클러스터 이름 (cluster.name)

이 설정은 클러스터를 고유하게 식별합니다. 동일한 클러스터의 모든 노드는 동일한 cluster.name을 공유해야 합니다. 설정하지 않으면 기본값은 elasticsearch입니다.

  • 중요성: 노드가 올바른 클러스터를 발견하고 가입하는 데 필수적입니다. 동일 네트워크 내의 다른 클러스터는 고유한 이름을 가져야 합니다.
  • 예시 (elasticsearch.yml):
    yaml cluster.name: my-production-cluster

2. 노드 역할 (node.roles)

Elasticsearch 노드에는 리소스 할당 및 성능을 최적화하기 위해 특정 역할을 할당할 수 있습니다. 일반적인 역할에는 master, data, ingest, ml이 포함됩니다. 소규모 클러스터의 경우 단일 노드가 여러 역할을 가질 수 있습니다.

  • 마스터 자격 노드 (Master-eligible node): 인덱스 생성/삭제, 노드 추적, 샤드 할당과 같은 클러스터 전체 작업을 담당합니다. 안정성을 위해 프로덕션 환경에서는 전용 마스터 노드를 두는 것이 좋습니다.
    yaml node.roles: [ master ]
  • 데이터 노드 (Data node): 데이터를 저장하고 인덱싱 및 검색과 같은 데이터 관련 작업을 수행합니다. 전용 데이터 노드는 성능에 매우 중요합니다.
    yaml node.roles: [ data ]
  • 인제스트 노드 (Ingest node): 인덱싱 전에 문서를 사전 처리하는 데 사용됩니다(예: 인제스트 파이프라인 사용).
    yaml node.roles: [ ingest ]
  • 머신러닝 노드 (Machine Learning node): 이상 감지 및 기타 작업을 위한 머신러닝 기능을 실행합니다.
    yaml node.roles: [ ml ]
  • 코디네이팅 전용 노드 (Coordinating-only node): 검색 및 대량 요청을 처리하지만, 데이터를 저장하거나 마스터 선출에 참여하지 않습니다. 데이터 또는 마스터 노드로부터 과도한 쿼리 로드를 오프로드하는 데 유용합니다.
    yaml node.roles: [ ] # 특정 역할이 없으면 기본적으로 master/data가 아닐 경우 코디네이팅 전용을 의미합니다

모범 사례: 프로덕션 환경에서는 더 나은 내결함성 및 성능을 위해 노드를 특정 역할(예: 데이터 노드와 마스터 노드 분리)에 전용하십시오. 소규모 설정의 경우 노드가 역할을 결합하여 가질 수 있습니다.

3. 네트워크 설정 (network.host, http.port, transport.port)

이 설정은 Elasticsearch 노드가 통신하는 방식을 제어합니다.

  • network.host: 노드가 바인딩할 IP 주소 또는 호스트 이름입니다. 다중 노드 클러스터의 경우 다른 노드가 도달할 수 있는 IP 주소로 설정하십시오. 0.0.0.0을 사용하면 사용 가능한 모든 네트워크 인터페이스에 바인딩됩니다.
    yaml network.host: 192.168.1.100 # or network.host: _site_ # or network.host: 0.0.0.0
  • http.port: HTTP REST API를 위한 포트입니다 (기본값: 9200).
    yaml http.port: 9200
  • transport.port: 노드 간 통신을 위한 포트입니다 (기본값: 9300).
    yaml transport.port: 9300

경고: 노드가 transport.port를 통해 통신할 수 있도록 방화벽 규칙에 유의하십시오.

4. 디스커버리 설정 (discovery.seed_hosts, cluster.initial_master_nodes)

이 설정은 노드가 클러스터를 찾고 참여하는 데 중요합니다.

  • discovery.seed_hosts: 새 노드가 클러스터를 발견하기 위해 연결할 수 있는 클러스터 내 다른 노드의 IP 주소 또는 호스트 이름 목록입니다.
    ```yaml
    discovery.seed_hosts:
    • "host1:9300"
    • "host2:9300"
    • "192.168.1.101:9300"
      ```
  • cluster.initial_master_nodes: 클러스터가 처음 시작될 때 초기 마스터 노드가 될 수 있는 노드 이름 목록입니다. 이는 클러스터 부트스트랩에 필수적입니다. 클러스터가 실행된 후에는 이러한 설정이 새 노드 참여에 덜 중요해지지만, 클러스터 재시작 시나리오에는 여전히 중요합니다.
    ```yaml
    cluster.initial_master_nodes:
    • "node-1"
    • "node-2"
    • "node-3"
      ```

팁: 클라우드 환경이나 동적 네트워크에서는 DNS 또는 클라우드 공급자 디스커버리 메커니즘과 같은 서비스를 사용하는 것을 고려하십시오.

다중 노드 클러스터 구성

다중 노드 클러스터를 설정하려면 각 노드의 elasticsearch.yml 파일을 구성해야 합니다. 다음 사항을 확인하십시오:

  1. cluster.name이 모든 노드에서 동일해야 합니다.
  2. 각 노드는 고유한 node.name을 가져야 합니다 (예: node-1, node-2).
  3. network.host는 다른 노드가 도달할 수 있는 IP 주소로 설정되어야 합니다.
  4. discovery.seed_hosts는 최소한 정족수 이상의 마스터 자격 노드 주소를 나열해야 합니다.
  5. cluster.initial_master_nodes는 초기 부트스트랩을 위해 마스터 자격으로 지정된 모든 노드의 이름을 포함해야 합니다.

node-1 예시:

cluster.name: my-production-cluster
node.name: node-1
node.roles: [ master, data ]
network.host: 192.168.1.100
http.port: 9200
transport.port: 9300
discovery.seed_hosts:
  - "192.168.1.100:9300"
  - "192.168.1.101:9300"
  - "192.168.1.102:9300"
cluster.initial_master_nodes:
  - "node-1"
  - "node-2"
  - "node-3"

**node-2 예시 (유사하며, node.name: node-2):
**

cluster.name: my-production-cluster
node.name: node-2
node.roles: [ master, data ]
network.host: 192.168.1.101
http.port: 9200
transport.port: 9300
discovery.seed_hosts:
  - "192.168.1.100:9300"
  - "192.168.1.101:9300"
  - "192.168.1.102:9300"
cluster.initial_master_nodes:
  - "node-1"
  - "node-2"
  - "node-3"

5. 힙 크기 (jvm.options)

Elasticsearch는 상당한 양의 메모리를 사용합니다. 자바 가상 머신(JVM) 힙 크기는 jvm.options 파일(일반적으로 config/ 디렉터리에 있음)에 구성됩니다. 힙 크기 조정으로 인한 성능 문제를 방지하기 위해 최소 힙 크기와 최대 힙 크기를 동일한 값으로 설정하는 것이 좋습니다.

  • 모범 사례: 힙 크기를 시스템 사용 가능 RAM의 50%를 초과하지 않도록 설정하고, 압축된 일반 객체 포인터(oops) 제한으로 인해 30~32GB를 절대 초과하지 않도록 하십시오.

예시 (jvm.options):

-Xms4g
-Xmx4g

이는 초기 및 최대 힙 크기를 모두 4기가바이트로 설정합니다.

6. 샤드 할당 및 복제 (cluster.routing.*)

이 설정은 샤드가 노드 전체에 분산되고 복제되는 방식을 제어합니다.

  • cluster.routing.allocation.disk.watermark.low, high, flood_stage:** 디스크 공간이 부족해지는 디스크에 샤드가 할당되는 것을 방지하기 위한 임계값입니다.
  • cluster.routing.allocation.enable: 샤드 할당을 제어합니다 (예: all, primaries, new_primaries, none).

예시:

cluster.routing.allocation.disk.watermark.low: "85%"
cluster.routing.allocation.disk.watermark.high: "90%"
cluster.routing.allocation.disk.watermark.flood_stage: "95%"

클러스터 상태 확인

노드가 시작되면 클러스터 상태 API를 사용하여 클러스터의 상태와 지위를 확인할 수 있습니다.

curl -X GET "localhost:9200/_cluster/health?pretty"

주요 출력 필드:

  • status: green (모든 샤드 할당됨), yellow (일부 복제본 할당되지 않음), red (일부 프라이머리 샤드 할당되지 않음).
  • number_of_nodes: 클러스터의 총 노드 수.
  • number_of_data_nodes: 데이터 노드로 지정된 노드 수.
  • active_shards, relocating_shards, initializing_shards, unassigned_shards.

팁: green 상태를 목표로 하십시오. yellow 상태는 데이터가 안전하지만(프라이머리 샤드가 할당됨) 고가용성을 위한 충분한 복제본이 부족할 수 있음을 나타냅니다. red 상태는 데이터가 위험에 처해 있으며 즉각적인 주의가 필요함을 의미합니다.

다음 단계

Elasticsearch 클러스터를 성공적으로 설정한 후에는 일반적으로 다음 단계로 진행합니다:

  • 인덱스 생성: 데이터를 저장하고 구성하는 방법을 정의합니다.
  • 매핑: 필드의 데이터 유형을 지정하여 문서의 스키마를 정의합니다.
  • 분석기 (Analyzers): 효과적인 전체 텍스트 검색을 위한 텍스트 분석을 구성합니다.
  • 보안: 인증 및 권한 부여를 구현합니다.

이 가이드는 안정적이고 성능이 우수한 Elasticsearch 클러스터를 위한 필수적인 기반을 제공합니다. 특정 워크로드에 따른 지속적인 모니터링 및 튜닝이 장기적인 성공의 핵심입니다.