고가용성 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 파일은 클러스터 설정을 정의하는 곳입니다. 적절한 구성으로 각 노드에서 이 파일을 편집하십시오.
모든 노드를 위한 공통 구성
-
cluster.name: 동일한 클러스터에 참여시키려는 모든 노드에서 이 값은 동일해야 합니다.
yaml cluster.name: my-ha-cluster -
node.name: 각 노드를 식별하는 데 유용한 고유한 이름입니다.
yaml node.name: node-1 -
network.host: Elasticsearch를 특정 네트워크 인터페이스에 바인딩합니다.0.0.0.0을 사용하여 사용 가능한 모든 인터페이스에 바인딩하거나 특정 IP 주소를 사용하십시오.
yaml network.host: 0.0.0.0 # 보안/다중 NIC 설정의 경우 특정 IP 주소 # network.host: 192.168.1.101 -
http.port: HTTP 클라이언트 통신을 위한 포트(기본값 9200)입니다.
yaml http.port: 9200 -
transport.port: 노드 간 통신을 위한 포트(기본값 9300)입니다. 일관되어야 합니다.
yaml transport.port: 9300
디스커버리 설정 (HA에 필수)
이 설정은 노드가 서로를 찾고 클러스터를 형성하는 방법을 알려줍니다.
-
discovery.seed_hosts: 클러스터 내 마스터-적격 노드의 주소 목록입니다. 노드가 초기 마스터-적격 노드를 발견하는 방법입니다. 모든 마스터-적격 노드의 IP 주소 또는 호스트 이름을 제공하십시오.
yaml discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"] -
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