고가용성 Elasticsearch 클러스터 설정 가이드

이 포괄적인 고가용성 Elasticsearch 클러스터 설정 가이드를 통해 지속적인 운영과 내결함성을 확보하세요. 여러 Elasticsearch 노드를 구성하고, 노드 역할 및 샤드 복제와 같은 중요 개념을 이해하며, 견고한 프로덕션 환경을 위한 검색 설정을 구현하는 방법을 알아보세요. 이 문서는 분산 검색 및 분석 엔진이 복원력 있고 안전하며 항상 사용할 수 있도록 단계별 지침, 실제 예제 및 필수 모범 사례를 제공합니다. HA Elasticsearch 구성을 숙달하여 데이터 손실 및 다운타임을 방지하십시오.

55 조회수

고가용성 Elasticsearch 클러스터 설정 가이드

Elasticsearch는 확장성과 복원력을 위해 설계된 강력한 분산 검색 및 분석 엔진입니다. 프로덕션 환경에서는 지속적인 운영과 장애 허용 오차를 보장하는 것이 무엇보다 중요합니다. 이 가이드는 여러 Elasticsearch 노드를 구성하여 강력한 고가용성(HA) 클러스터를 생성하는 데 필요한 필수 단계를 안내합니다. 이 지침을 따르면 노드 장애를 견디고 데이터 접근성을 유지하여 애플리케이션의 응답성을 유지하고 데이터를 안전하게 보존할 수 있는 클러스터를 설정하는 방법을 배우게 될 것입니다.

고가용성 Elasticsearch 클러스터를 설정하려면 노드 역할, 네트워크 구성 및 데이터 복제 전략을 신중하게 계획해야 합니다. 목표는 단일 실패 지점을 제거하기 위해 여러 시스템에 워크로드와 데이터를 중복 분산하는 것입니다. 이 글은 까다로운 프로덕션 사용 사례에 적합한 탄력적인 Elasticsearch 인프라를 구축하는 데 도움이 되는 핵심 개념, 실제 구성 단계 및 모범 사례를 다룰 것입니다.

Elasticsearch의 고가용성 이해

Elasticsearch의 고가용성은 몇 가지 핵심 메커니즘을 통해 달성됩니다:

  • 분산 아키텍처: Elasticsearch는 본질적으로 여러 노드에 데이터와 작업을 분산합니다.
  • 노드 역할: 각기 다른 노드는 서로 다른 목적을 수행할 수 있어 전문화된 리소스 할당 및 장애 격리가 가능합니다.
  • 샤드 복제: 각 인덱스는 샤드로 분할되며, 각 프라이머리 샤드는 하나 이상의 레플리카 샤드를 가질 수 있으며, 이들은 서로 다른 노드에 저장됩니다.
  • 마스터 노드 선출: 강력한 선출 프로세스는 클러스터 상태를 관리할 마스터 노드가 항상 사용 가능하도록 보장합니다.
  • Zen Discovery (Zen2): 이 모듈은 노드 발견 및 마스터 선출을 처리하여 노드들이 서로를 찾고 안정적으로 클러스터를 형성할 수 있도록 합니다.

필수 노드 역할

HA 설정에서 노드 역할을 이해하는 것은 중요합니다. HA의 주요 역할은 다음과 같습니다:

  • 마스터-적격 노드: 이 노드들은 인덱스 생성/삭제, 노드 추적, 샤드 할당을 포함한 클러스터 상태 관리를 담당합니다. data 역할을 동시에 가지지 않는 한, 데이터를 저장하거나 검색/인덱스 요청을 직접 처리하지 않습니다. HA를 위해서는 쿼럼을 형성하기 위해 홀수 개(일반적으로 3개)의 전용 마스터-적격 노드를 두어야 합니다.
  • 데이터 노드: 이 노드들은 샤드에 인덱싱된 데이터를 저장하고 검색, 집계 및 인덱싱과 같은 데이터 관련 작업을 수행합니다. 이들은 클러스터의 핵심 작업자입니다.
  • 조정 전용 노드: (선택 사항) 이 노드들은 요청 라우팅, 검색 축소 단계 처리 및 대량 인덱싱 관리에 사용될 수 있습니다. 데이터를 저장하거나 클러스터 상태를 보유하지 않지만, 데이터 및 마스터 노드의 부하를 덜어줄 수 있습니다.

샤드 및 레플리카

Elasticsearch는 데이터를 샤드에 저장합니다. 각 인덱스는 하나 이상의 프라이머리 샤드로 구성됩니다. 고가용성을 달성하려면 각 프라이머리 샤드에 대해 하나 이상의 레플리카 샤드를 구성해야 합니다. 레플리카 샤드는 프라이머리 샤드의 복사본입니다. 프라이머리 샤드를 호스팅하는 노드에 장애가 발생하면 다른 노드의 레플리카 샤드가 새 프라이머리로 승격될 수 있어 데이터 손실 없이 지속적인 작업을 보장합니다.

HA 클러스터 설정을 위한 전제 조건

구성을 시작하기 전에 환경이 다음 기본 요구 사항을 충족하는지 확인하십시오:

  • Java Development Kit (JDK): Elasticsearch는 호환되는 JDK(일반적으로 OpenJDK)를 필요로 합니다. 모든 노드에 설치되어 있는지 확인하십시오.
  • 시스템 리소스: 각 노드, 특히 데이터 노드에 충분한 RAM(예: 8-32GB), CPU 코어 및 빠른 I/O 디스크 공간(SSD 권장)을 할당하십시오.
  • 네트워크 구성: 모든 노드는 특정 포트(노드 간 통신 기본값 9300, HTTP API 9200)를 통해 서로 통신할 수 있어야 합니다. 방화벽이 적절하게 구성되어 있는지 확인하십시오.
  • 운영 체제: 프로덕션 배포에는 안정적인 Linux 배포판(예: Ubuntu, CentOS, RHEL)이 일반적으로 선호됩니다.

HA 클러스터 설정 단계별 가이드

이 섹션에서는 다중 노드 Elasticsearch 클러스터를 설치하고 구성하는 프로세스를 설명합니다.

1단계: 모든 노드에 Elasticsearch 설치

클러스터의 일부가 될 각 서버에 Elasticsearch를 설치하십시오. 패키지 관리자(Debian/Ubuntu의 경우 APT, RHEL/CentOS의 경우 YUM)를 사용하거나 아카이브를 직접 다운로드할 수 있습니다.

예시 (APT를 통한 Debian/Ubuntu):

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
sudo apt install elasticsearch

설치 후 서비스를 활성화하고 시작합니다(먼저 구성하겠지만).

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch

2단계: 각 노드에 elasticsearch.yml 구성

일반적으로 /etc/elasticsearch/에 위치한 elasticsearch.yml 파일은 클러스터 설정을 정의하는 곳입니다. 적절한 구성으로 노드에서 이 파일을 편집하십시오.

모든 노드를 위한 공통 구성

  1. cluster.name: 동일한 클러스터에 참여시키려는 모든 노드에서 이 값은 동일해야 합니다.
    yaml cluster.name: my-ha-cluster

  2. node.name: 각 노드를 식별하는 데 유용한 고유한 이름입니다.
    yaml node.name: node-1

  3. network.host: Elasticsearch를 특정 네트워크 인터페이스에 바인딩합니다. 0.0.0.0을 사용하여 사용 가능한 모든 인터페이스에 바인딩하거나 특정 IP 주소를 사용하십시오.
    yaml network.host: 0.0.0.0 # 보안/다중 NIC 설정의 경우 특정 IP 주소 # network.host: 192.168.1.101

  4. http.port: HTTP 클라이언트 통신을 위한 포트(기본값 9200)입니다.
    yaml http.port: 9200

  5. transport.port: 노드 간 통신을 위한 포트(기본값 9300)입니다. 일관되어야 합니다.
    yaml transport.port: 9300

디스커버리 설정 (HA에 필수)

이 설정은 노드가 서로를 찾고 클러스터를 형성하는 방법을 알려줍니다.

  1. discovery.seed_hosts: 클러스터 내 마스터-적격 노드의 주소 목록입니다. 노드가 초기 마스터-적격 노드를 발견하는 방법입니다. 모든 마스터-적격 노드의 IP 주소 또는 호스트 이름을 제공하십시오.
    yaml discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]

  2. cluster.initial_master_nodes: 새 클러스터를 처음 부트스트랩할 때만 사용됩니다. 이 목록에는 첫 번째 마스터 선출에 참여할 마스터-적격 노드의 node.name이 포함되어야 합니다. 클러스터가 형성되면 이 설정은 무시됩니다.
    yaml cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

    • 중요 팁: 클러스터가 성공적으로 형성된 후 cluster.initial_master_nodes를 제거하거나 주석 처리하여 노드가 다시 시작될 때 의도치 않게 새 클러스터를 형성하는 것을 방지하십시오.

노드 역할 구성

각 노드의 역할(들)을 지정합니다. 일반적인 HA 설정에는 3개의 전용 마스터 노드와 여러 데이터 노드가 포함됩니다.

  • 마스터-적격 노드 (예: node-1, node-2, node-3):
    yaml node.roles: [master]
  • 데이터 노드 (예: node-4, node-5, node-6):
    yaml node.roles: [data]
  • 혼합 역할 노드 (대규모 프로덕션 HA에는 권장되지 않음):
    yaml node.roles: [master, data]
    • 모범 사례: 프로덕션 환경에서 진정한 고가용성과 안정성을 위해서는 마스터 및 데이터 역할에 별도의 노드를 전용으로 사용하십시오. 이렇게 하면 중요한 마스터 프로세스가 리소스 집약적인 데이터 작업으로부터 격리됩니다.

3단계: JVM 힙 크기 구성

/etc/elasticsearch/jvm.options 파일을 편집하여 JVM 힙 크기를 설정하십시오. 일반적으로 사용 가능한 RAM의 50%를 할당하되, 30-32GB를 초과하지 않는 것이 좋습니다. 예를 들어, 서버에 16GB RAM이 있다면 8GB를 할당하십시오:

-Xms8g
-Xmx8g

4단계: 시스템 설정

프로덕션 환경에서는 모든 노드에서 vm.max_map_count 및 열린 파일에 대한 ulimit을 늘리십시오. 이 줄들을 /etc/sysctl.conf에 추가하고 적용하십시오 (sudo sysctl -p).

vm.max_map_count=262144

그리고 /etc/security/limits.conf(또는 /etc/security/limits.d/99-elasticsearch.conf)에:

elasticsearch - nofile 65536
elasticsearch - memlock unlimited

5단계: Elasticsearch 서비스 시작

구성된 모든 노드에서 Elasticsearch 서비스를 시작하십시오. 마스터-적격 노드를 먼저 시작하는 것이 권장되기도 하지만, 최신 디스커버리 기능에서는 discovery.seed_hosts가 올바르게 구성되어 있다면 순서가 덜 중요합니다.

sudo systemctl start elasticsearch

서비스 상태와 로그를 확인하여 오류가 없는지 확인하십시오:

sudo systemctl status elasticsearch
sudo journalctl -f -u elasticsearch

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

모든 노드가 실행 중이면 Elasticsearch API를 사용하여 클러스터 상태를 확인하십시오. 클러스터의 어떤 노드에도 쿼리할 수 있습니다.

curl -X GET "localhost:9200/_cat/health?v&pretty"

예상 출력:

epoch      timestamp cluster        status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1678886400 12:00:00  my-ha-cluster  green      6          3       0    0    0    0        0             0                  -                 100.0%
  • status: green(모든 프라이머리 및 레플리카 샤드가 할당됨) 또는 yellow(모든 프라이머리 샤드가 할당되었지만 일부 레플리카 샤드는 아직 할당되지 않음)여야 합니다. red는 심각한 문제를 나타냅니다.
  • node.total: 시작한 총 노드 수와 일치해야 합니다.
  • node.data: 데이터 노드 수와 일치해야 합니다.

모든 노드가 클러스터에 성공적으로 참여했는지 확인하십시오:

curl -X GET "localhost:9200/_cat/nodes?v&pretty"

예상 출력 (3개 마스터, 3개 데이터 노드 예시):

ip         heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
192.168.1.101          21          87   0    0.00    0.01     0.05 m           *      node-1
192.168.1.102          20          88   0    0.00    0.01     0.05 m           -      node-2
192.168.1.103          22          86   0    0.00    0.01     0.05 m           -      node-3
192.168.1.104          35          90   1    0.10    0.12     0.11 d           -      node-4
192.168.1.105          32          89   1    0.11    0.13     0.10 d           -      node-5
192.168.1.106          30          91   1    0.12    0.10     0.09 d           -      node-6

이는 node-1이 선출된 마스터(master 열 아래 *)이고 다른 노드들이 클러스터의 일부임을 보여줍니다.

7단계: 인덱스 샤딩 및 복제 구성

새로 생성되는 인덱스의 경우 Elasticsearch는 기본적으로 하나의 프라이머리 샤드와 하나의 레플리카(index.number_of_shards: 1, index.number_of_replicas: 1)를 가집니다. HA를 위해서는 일반적으로 최소 하나의 레플리카가 필요하며, 이는 데이터가 최소 두 개의 다른 노드에 존재함을 의미합니다. 이렇게 하면 하나의 노드가 실패하더라도 다른 곳에서 레플리카를 사용할 수 있습니다.

인덱스를 생성할 때 다음 설정을 지정하십시오:

```bash
curl -X PUT "localhost:9200/my_ha_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"number_of_shards": 3