고가용성 Elasticsearch 클러스터 설정 가이드
노드 역할, 발견, 복제본, JVM 크기 조정 및 상태 확인을 통해 고가용성 Elasticsearch 클러스터를 설정합니다.
고가용성 Elasticsearch 클러스터 설정 가이드
Elasticsearch는 노드 장애가 발생해도 가용성을 유지할 수 있지만, 마스터 선출, 데이터 배치, 복제본 및 발견을 올바르게 계획해야 합니다. 단일 노드 클러스터는 개발 환경에서 작동할 수 있지만, 호스트 장애로부터 검색 워크로드를 보호할 수 없습니다.
이 가이드는 전용 마스터 후보 노드, 데이터 노드, 샤드 복제본 및 기본 검증 명령을 사용하여 고가용성 Elasticsearch 클러스터를 설정하는 방법을 보여줍니다.
Elasticsearch의 고가용성 이해
Elasticsearch의 고가용성은 여러 주요 메커니즘을 통해 달성됩니다:
- 분산 아키텍처: Elasticsearch는 본질적으로 여러 노드에 데이터와 작업을 분산합니다.
- 노드 역할: 서로 다른 노드는 서로 다른 목적을 수행할 수 있어 리소스 할당을 전문화하고 장애를 격리할 수 있습니다.
- 샤드 복제: 각 인덱스는 샤드로 나뉘며, 각 기본 샤드는 서로 다른 노드에 저장된 하나 이상의 복제본 샤드를 가질 수 있습니다.
- 마스터 노드 선출: 강력한 선출 프로세스를 통해 클러스터 상태를 관리할 마스터 노드가 항상 사용 가능하도록 보장합니다.
- Zen Discovery (Zen2): 이 모듈은 노드 발견 및 마스터 선출을 처리하여 노드가 서로를 찾고 안정적으로 클러스터를 형성할 수 있도록 합니다.
필수 노드 역할
HA 설정에서 노드 역할을 이해하는 것은 중요합니다. HA를 위한 주요 역할은 다음과 같습니다:
- 마스터 후보 노드: 이 노드는 인덱스 생성/삭제, 노드 추적 및 샤드 할당을 포함한 클러스터 상태를 관리합니다.
data역할도 가지고 있지 않는 한 데이터를 저장하거나 검색/인덱싱 요청을 직접 처리하지 않습니다. HA를 위해서는 쿼럼을 형성하기 위해 일반적으로 3개의 전용 마스터 후보 노드(홀수)가 있어야 합니다. - 데이터 노드: 이 노드는 샤드에 인덱싱된 데이터를 저장하고 검색, 집계 및 인덱싱과 같은 데이터 관련 작업을 수행합니다. 클러스터의 작업 동력입니다.
- 조정 전용 노드: (선택 사항) 이 노드는 요청을 라우팅하고, 검색 축소 단계를 처리하며, 대량 인덱싱을 관리하는 데 사용할 수 있습니다. 데이터나 클러스터 상태를 보유하지 않지만 데이터 및 마스터 노드의 작업을 오프로드할 수 있습니다.
샤드 및 복제본
Elasticsearch는 데이터를 샤드에 저장합니다. 각 인덱스는 하나 이상의 기본 샤드로 구성됩니다. 고가용성을 달성하려면 각 기본 샤드에 대해 하나 이상의 복제본 샤드를 구성해야 합니다. 복제본 샤드는 기본 샤드의 복사본입니다. 기본 샤드를 호스팅하는 노드가 실패하면 다른 노드의 복제본 샤드가 새 기본 샤드로 승격되어 데이터 손실 없이 지속적인 운영이 가능합니다.
HA 클러스터 설정을 위한 전제 조건
구성을 시작하기 전에 환경이 다음 기본 요구 사항을 충족하는지 확인하십시오:
- Elasticsearch 패키지 또는 아카이브: 공식 패키지에는 최신 Elasticsearch 버전에 번들로 제공되는 JDK가 포함되어 있습니다. 설치에서 별도의 JDK를 사용하는 경우 Elasticsearch 버전과 호환되는지 확인하십시오.
- 시스템 리소스: 각 노드, 특히 데이터 노드에 충분한 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: 동일한 클러스터에 가입하려는 모든 노드에 대해 동일해야 합니다.cluster.name: my-ha-clusternode.name: 각 노드의 고유한 이름으로, 식별에 유용합니다.node.name: node-1network.host: Elasticsearch를 특정 네트워크 인터페이스에 바인딩합니다. 사용 가능한 모든 인터페이스에 바인딩하려면0.0.0.0을 사용하거나 특정 IP 주소를 사용합니다.network.host: 0.0.0.0 # 또는 보안/다중 NIC 설정을 위한 특정 IP 주소 # network.host: 192.168.1.101http.port: HTTP 클라이언트 통신을 위한 포트(기본값 9200).http.port: 9200transport.port: 노드 간 통신을 위한 포트(기본값 9300). 일관성이 있어야 합니다.transport.port: 9300
발견 설정 (HA에 중요)
이 설정은 노드가 서로를 찾고 클러스터를 형성하는 방법을 알려줍니다.
discovery.seed_hosts: 클러스터의 마스터 후보 노드 주소 목록입니다. 이것은 노드가 초기 마스터 후보 노드를 발견하는 방법입니다. 모든 마스터 후보 노드의 IP 주소 또는 호스트 이름을 제공하십시오.discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]cluster.initial_master_nodes: 완전히 새로운 클러스터를 처음 부트스트래핑할 때만 사용됩니다. 이 목록에는 첫 번째 마스터 선출에 참여할 마스터 후보 노드의node.name이 포함되어야 합니다. 클러스터가 형성되면 이 설정은 무시됩니다.cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]- 중요 팁: 클러스터가 성공적으로 형성된 후에는
cluster.initial_master_nodes를 제거하거나 주석 처리하십시오. 재시작하거나 새 노드를 추가할 때 다시 설정하지 마십시오.
- 중요 팁: 클러스터가 성공적으로 형성된 후에는
노드 역할 구성
각 노드의 역할을 지정합니다. 일반적인 HA 설정에는 3개의 전용 마스터 노드와 여러 데이터 노드가 포함됩니다.
- 마스터 후보 노드 (예: node-1, node-2, node-3):
node.roles: [master] - 데이터 노드 (예: node-4, node-5, node-6):
node.roles: [data] - 혼합 역할 노드 (대규모 프로덕션 HA에는 권장되지 않음):
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를 위해서는 일반적으로 하나 이상의 복제본이 필요합니다. 즉, 데이터가 적어도 두 개의 다른 노드에 존재합니다. 이렇게 하면 하나의 노드가 실패하더라도 다른 곳에서 복제본을 사용할 수 있습니다.
인덱스를 생성할 때 다음 설정을 지정합니다:
curl -X PUT "localhost:9200/my_ha_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
}'
보안이 활성화된 경우 curl 명령에 HTTPS와 자격 증명 또는 API 키를 사용하십시오. 예:
curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic "https://localhost:9200/_cluster/health?pretty"
운영 확인
클러스터가 녹색이 된 후 프로덕션 트래픽이 이에 의존하기 전에 장애 동작을 확인하십시오:
- 하나의 데이터 노드를 중지하고 복제본이 승격되고 기본 샤드가 계속 사용 가능한지 확인합니다.
- 선출된 마스터 노드를 중지하고 다른 마스터 후보 노드가 선출되는지 확인합니다.
- 클러스터가 안정된 후
_cat/shards?v에서 할당되지 않은 샤드를 확인합니다. - 클라이언트가 단일 HTTP 엔드포인트 대신 여러 노드 또는 로드 밸런서를 통해 연결하는지 확인합니다.
최종 결론
Elasticsearch 고가용성은 세 가지 실용적인 선택에서 비롯됩니다: 안정적인 마스터 쿼럼 유지, 다른 노드에 샤드 복제본 배치, 클라이언트가 노드 손실에 탄력적으로 대응하도록 만드는 것입니다. 세 개의 전용 마스터 후보 노드, 기본 및 복제본 샤드를 보유할 충분한 데이터 노드, 그리고 노드 재시작 및 장애에 대한 테스트된 복구 절차로 시작하십시오.