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

안전한 노드 역할, 검색 설정, 네트워킹, 힙 크기 조정 및 상태 확인을 통해 Elasticsearch 클러스터를 구성합니다.

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

Elasticsearch 클러스터를 설정하는 것은 대부분 초기에 몇 가지 선택을 올바르게 하는 것에 달려 있습니다: 노드 이름, 검색, 역할, 네트워킹 및 메모리. 이러한 기본 사항이 잘못되면 클러스터가 불안정하게 형성되거나, 잘못된 인터페이스에 노출되거나, 노드 재시작 중에 어려움을 겪을 수 있습니다.

이 가이드는 Elasticsearch를 실제 워크로드에 적용하기 전에 검토해야 할 핵심 설정을 안내합니다. 예제는 elasticsearch.yml을 사용하며 소규모 3노드 클러스터를 가정하지만, 확장할 때도 동일한 확인 사항이 적용됩니다.

사전 요구 사항

구성에 들어가기 전에 다음 사항이 준비되어 있는지 확인하십시오:

  • Java 런타임: 많은 Elasticsearch 배포판에는 번들 JDK가 포함되어 있습니다. 자체 Java 런타임을 제공하는 경우 Elasticsearch 버전에 대한 지원 매트릭스를 확인하십시오.
    java -version
    
  • 시스템 리소스: Elasticsearch 노드에 충분한 RAM, CPU 및 디스크 공간을 할당하십시오. 정확한 요구 사항은 데이터 볼륨과 쿼리 복잡성에 따라 다릅니다.
  • 네트워크 액세스: 노드가 구성된 전송 포트(기본값은 9300)에서 서로 통신할 수 있는지 확인하십시오.

설치

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

핵심 구성 파일

Elasticsearch의 기본 구성 파일은 elasticsearch.yml이며, 일반적으로 Elasticsearch 설치 디렉토리의 config/ 디렉토리에 있습니다. 이 파일의 주요 설정이 클러스터 동작을 결정합니다.

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

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

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

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

2. 노드 역할 (node.roles)

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

  • 마스터 후보 노드: 인덱스 생성/삭제, 노드 추적, 샤드 할당과 같은 클러스터 전체 작업을 담당합니다. 안정성을 위해 프로덕션 환경에서는 전용 마스터 노드를 사용하는 것이 좋습니다.
    node.roles: [ master ]
    
  • 데이터 노드: 데이터를 저장하고 인덱싱 및 검색과 같은 데이터 관련 작업을 수행합니다. 전용 데이터 노드는 성능에 중요합니다.
    node.roles: [ data ]
    
  • 수집 노드: 인덱싱 전에 문서를 전처리하는 데 사용됩니다(예: 수집 파이프라인 사용).
    node.roles: [ ingest ]
    
  • 머신러닝 노드: 이상 탐지 및 기타 작업을 위한 머신러닝 기능을 실행합니다.
    node.roles: [ ml ]
    
  • 조정 전용 노드: 검색 및 대량 요청을 처리하지만 데이터를 저장하거나 마스터 선거에 참여하지 않습니다. 데이터 또는 마스터 노드에서 무거운 쿼리 부하를 분산하는 데 유용합니다.
    node.roles: []
    

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

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

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

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

경고: 방화벽 규칙을 확인하여 노드가 transport.port에서 통신할 수 있는지 확인하십시오.

4. 검색 설정 (discovery.seed_hosts, cluster.initial_master_nodes)

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

  • discovery.seed_hosts: 새 노드가 클러스터를 검색하기 위해 연결할 수 있는 다른 노드의 IP 주소 또는 호스트 이름 목록입니다.
    discovery.seed_hosts:
      - "host1:9300"
      - "host2:9300"
      - "192.168.1.101:9300"
    
  • cluster.initial_master_nodes: 새로운 클러스터를 부트스트랩하는 데만 사용되는 마스터 후보 노드 이름 목록입니다. 클러스터가 형성된 후에는 이 설정을 제거하십시오. 오래된 부트스트랩 설정을 그대로 두면 나중에 재구축하거나 우발적인 클러스터 형성 시 혼란을 초래할 수 있습니다.
    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(Java Virtual Machine) 힙 크기는 jvm.options 파일(일반적으로 config/ 디렉토리)에서 구성됩니다. 힙 크기 조정으로 인한 성능 문제를 방지하려면 최소 및 최대 힙 크기를 동일한 값으로 설정하는 것이 좋습니다.

  • 모범 사례: 힙 크기를 시스템 RAM의 절반 이하로 설정하고 파일 시스템 캐시를 위한 메모리를 남겨 두십시오. 과도하게 큰 힙은 피하십시오. 많은 배포에서 압축된 일반 객체 포인터 임계값(일반적으로 30GB 미만이지만 JVM에 따라 다름) 미만으로 유지됩니다.

예시 (jvm.options):

-Xms4g
-Xmx4g

이렇게 하면 초기 및 최대 힙 크기가 4GB로 설정됩니다.

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 클러스터를 성공적으로 설정한 후에는 일반적으로 다음을 진행합니다:

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

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