Elasticsearch 프로덕션 클러스터 구성 가이드

Elasticsearch 클러스터를 구축하는 과정은 단일 인스턴스 설정과 달리 다양한 추가 구성이 필요합니다. 여기에는 노드 역할 정의, 클러스터 검색 방식, 초기 마스터 노드 선정, 마스터 선출 프로세스, 그리고 보안 인증 설정 등이 포함됩니다. 이 문서는 운영 환경에 적합한 Elasticsearch 클러스터를 구성하기 위한 주요 설정들을 다룹니다.

클러스터 기본 설정

elasticsearch.yml 파일에서 클러스터의 식별자와 검색 방식을 설정합니다.

# 클러스터의 고유한 이름을 지정합니다.
cluster.name: my-production-cluster

# 단일 노드 설정은 클러스터 환경에서는 필요 없으므로 제거하거나 주석 처리합니다.
# discovery.type: single-node

노드 구성

노드 역할 정의

기본적으로 Elasticsearch 노드는 마스터, 데이터, 인제스트 등 모든 역할을 수행합니다. 그러나 프로덕션 환경에서는 서버 리소스와 클러스터 규모에 맞춰 노드 역할을 세분화하여 할당하는 것이 일반적입니다. 몇 가지 권장 사항은 다음과 같습니다.

  • 마스터 노드의 수는 최소 3개 이상을 유지하는 것이 좋습니다.
  • 마스터 노드는 데이터 인덱싱이나 검색을 직접 수행하지 않으므로, CPU, 메모리, 저장소 요구 사항이 상대적으로 낮습니다 (예: 2GB 메모리, 50GB 저장소, 중간 수준 CPU).
  • 데이터 노드는 데이터 인덱싱, 검색, 저장을 담당하므로, 높은 CPU, 메모리, 저장소 리소스가 필요합니다 (예: 8GB 이상 메모리, 500GB 이상 저장소, 고성능 CPU).
  • 서버 리소스가 제한적이거나 클러스터 규모가 작을 경우, 마스터와 데이터 역할을 겸하는 노드를 구성할 수도 있습니다.

노드 역할은 elasticsearch.yml에 다음 설정을 추가하여 지정합니다.

# 마스터 전용 노드로 설정
node.roles: ["master"]

# 마스터 및 데이터 노드로 설정
node.roles: ["master", "data"]

# 데이터 전용 노드로 설정 (인덱싱, 검색, 저장 담당)
# node.roles: ["data"]

마스터 노드 초기화 및 선출

클러스터가 처음 시작될 때 마스터 노드가 아직 선출되지 않은 상태에서는, 미리 지정된 초기 마스터 노드 목록에서 하나를 선택하여 클러스터를 부트스트랩합니다.

# 마스터 노드 선출을 위해 필요한 최소 투표 수.
# 일반적으로 (마스터 노드 수 / 2) + 1 로 설정하는 것이 권장됩니다.
# (예: 마스터 노드가 3개일 경우 2)
discovery.zen.minimum_master_nodes: 2

# 클러스터가 최초 시작될 때 사용될 초기 마스터 노드 목록을 지정합니다.
# 이 목록에 있는 노드 중 하나가 마스터 노드로 선출됩니다.
cluster.initial_master_nodes: ["es-node-01", "es-node-02", "es-node-03"]

노드 검색 설정

새로운 노드가 클러스터에 합류하거나 기존 노드가 다른 노드를 찾을 때, discovery.seed_hosts에 지정된 주소를 통해 연결을 시도합니다. 노드 간 통신은 transport.port를 사용합니다.

# 클러스터 내 다른 노드를 검색하기 위한 초기 호스트 목록.
# 새로운 노드가 클러스터에 합류할 때 이 목록의 노드들을 통해 클러스터를 검색하고 연결합니다.
# 높은 가용성을 위해 여러 노드의 IP와 Transport 포트 정보를 포함하는 것이 좋습니다.
discovery.seed_hosts: ["192.168.1.10:9300", "192.168.1.11:9300"]

네트워크 구성

Elasticsearch를 Docker와 같은 컨테이너 환경에서 실행하거나 NAT 환경에서 사용할 경우, 컨테이너 내부의 포트와 호스트 시스템의 외부 포트를 매핑해야 합니다. 클라이언트나 다른 노드들이 접근할 수 있도록 호스트의 IP와 포트 정보를 명시적으로 공개해야 합니다.

예를 들어, 호스트의 IP 주소가 172.16.0.100이고, 외부 HTTP 포트가 8000, 외부 Transport 포트가 8001이라고 가정해 봅시다. 내부적으로는 HTTP 9200, Transport 9300을 사용합니다.

# 모든 네트워크 인터페이스에서 수신 대기 (보안을 위해 특정 IP로 제한하는 것이 권장됩니다)
network.host: 0.0.0.0

# 내부 HTTP 통신 포트
http.port: 9200

# 외부 HTTP 클라이언트 및 노드에 알릴 HTTP 공개 포트
http.publish_port: 8000

# 외부 HTTP 클라이언트 및 노드에 알릴 HTTP 공개 호스트 주소
http.publish_host: 172.16.0.100

# 내부 Transport 통신 포트 (노드 간 통신)
transport.port: 9300

# 외부 노드에 알릴 Transport 공개 포트
transport.publish_port: 8001

# 외부 노드에 알릴 Transport 공개 호스트 주소
transport.publish_host: 172.16.0.100

보안 설정

클러스터와 데이터의 보안을 강화하기 위해 X-Pack 보안 기능을 활성화하는 것이 필수적입니다. 이 기능을 활성화하면 클러스터 간 통신에 SSL/TLS 암호화가 적용되고, 클라이언트 접근 시 인증이 요구됩니다.

# X-Pack 보안 기능 활성화
xpack.security.enabled: true

# 노드 간 통신을 위한 SSL/TLS 암호화 활성화
xpack.security.transport.ssl.enabled: true

클러스터 암호화 통신

xpack.security.enabled를 활성화하면, 노드 간 통신에 SSL/TLS를 사용해야 합니다.

CA(Certificate Authority) 생성

CA는 인증서를 발행하고 서명하는 신뢰할 수 있는 엔티티입니다. 운영 환경에서는 자체 CA를 구축하거나 공인 CA를 사용할 수 있습니다. 여기서는 Elasticsearch가 제공하는 elasticsearch-certutil 도구를 사용하여 자체 서명 CA를 생성합니다.

CA 파일 (기본 이름: elastic-stack-ca.p12)은 CA 인증서와 개인 키를 포함합니다.

# Elasticsearch 루트 디렉토리로 이동
cd /usr/share/elasticsearch

# CA 파일 생성 (CA 개인 키 비밀번호 설정)
./bin/elasticsearch-certutil ca --pass "MySecureCaPassword123!"

노드 인증서 생성

생성된 CA를 이용하여 각 노드에 배포할 인증서를 생성합니다. 이 인증서는 노드의 신원을 확인하고 통신을 암호화하는 데 사용됩니다.

인증서 파일 (기본 이름: elastic-certificates.p12)에는 노드의 공개 키, 식별 정보 및 CA의 디지털 서명이 포함됩니다.

# 생성된 CA를 사용하여 노드 인증서 생성
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --ca-pass "MySecureCaPassword123!"

생성된 elastic-certificates.p12 파일을 클러스터 내 모든 노드의 /usr/share/elasticsearch/config 디렉토리로 복사합니다.

노드 암호화 통신 설정

각 노드의 elasticsearch.yml에 다음 설정을 추가하여 생성된 인증서를 사용하도록 합니다.

# SSL/TLS 검증 모드를 'certificate'로 설정하여 인증서 기반의 상호 인증을 사용합니다.
xpack.security.transport.ssl.verification_mode: certificate

# 노드의 개인 키와 인증서가 포함된 키 저장소 파일 경로
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12

# 신뢰할 수 있는 CA 인증서가 포함된 신뢰 저장소 파일 경로
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

내장 사용자 비밀번호 설정

클러스터 암호화 설정 후 Elasticsearch를 재시작합니다. 그 다음 /usr/share/elasticsearch/bin 디렉토리로 이동하여 elasticsearch-setup-passwords 명령을 통해 내장 사용자(예: elastic, kibana)의 비밀번호를 설정합니다.

./bin/elasticsearch-setup-passwords interactive

이 명령을 실행하면 대화형 방식으로 각 내장 사용자의 비밀번호를 설정할 수 있습니다.

클러스터 시작

위의 모든 구성을 완료한 후, 각 노드를 순서대로 시작합니다. 클러스터가 성공적으로 시작되면, 설정된 HTTP 공개 주소와 포트(예: http://172.16.0.100:8000)로 접속하여 클러스터 상태를 확인할 수 있습니다.

# 모든 노드가 시작된 후, 다음 명령으로 클러스터 노드 정보를 확인합니다.
curl -u elastic:your_password "http://172.16.0.100:8000/_cat/nodes?v"

태그: elasticsearch 클러스터 구성 X-Pack 보안 SSL/TLS 노드 역할

7월 18일 16:05에 게시됨