운영 환경에서 Elasticsearch 최신 버전 설치부터 데이터 색인·운영 튜닝까지 한번에

Elasticsearch는 대량의 데이터를 실시간으로 검색하고 분석할 수 있는 강력한 오픈소스 엔진입니다. 로그 분석, 전자상거래 상품 검색, 추천 시스템, 데이터 모니터링 등 다양한 산업 분야에서 핵심 인프라로 활용되고 있으며, 그 유연성과 확장성 덕분에 전 세계적으로 널리 사용되고 있습니다.
하지만 Elasticsearch를 제대로 활용하기 위해서는 단순 설치를 넘어, 운영 환경(프로덕션)에 최적화된 구성과 튜닝이 필요합니다. 잘못된 설정은 성능 저하, 데이터 유실, 클러스터 불안정 같은 문제로 이어질 수 있기 때문에 초기 설계 단계에서부터 세심한 접근이 중요합니다.

이번 가이드는 최신 버전(8.x)을 기준으로, 프로덕션 환경에서의 Elasticsearch 구축 과정을 단계별로 정리했습니다. 설치 절차와 클러스터 구성 방법, 데이터 구조에 적합한 색인 설계, 대규모 데이터 처리 시 성능 최적화 기법, 그리고 인증·권한 관리와 네트워크 보안까지 포괄적으로 다룹니다.

이 내용을 따라가면, 단일 서버에서 간단한 테스트를 하는 수준을 넘어, 안정적이면서 확장 가능한 검색·분석 플랫폼을 직접 구축할 수 있을 것입니다. 또한 운영 중 발생할 수 있는 장애를 예방하고, 장기적으로 유지보수 효율을 높이는 데에도 큰 도움이 될 것입니다.


설치 (리포지토리 추가 → 서비스 기동)

Ubuntu/Debian 환경을 기준으로, Elasticsearch를 설치하고 기본 설정을 구성하는 방법을 설명합니다.

필수 사전 준비

  • 하드웨어: 최소 4 vCPU, 8GB RAM, SSD 이상의 디스크를 권장합니다.
  • OS 설정:
    • 스와핑 비활성화: vm.swappiness=1로 설정해 메모리 사용을 최적화합니다.
    • 파일 핸들: /etc/security/limits.conf 파일에 nofile 65535memlock unlimited를 추가해 Elasticsearch가 메모리를 잠그도록 허용합니다.
    • vm.max_map_count=262144로 가상 메모리 맵 카운트를 늘려줍니다.

APT 리포지토리 등록 및 설치

  1. Elasticsearch GPG 키를 등록합니다.
    Bash

    curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic.gpg
    
  2. 8.x 버전의 APT 리포지토리를 추가합니다.
    Bash

    echo "deb [signed-by=/usr/share/keyrings/elastic.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
    
  3. 패키지 목록을 업데이트하고 Elasticsearch를 설치합니다.
    Bash

    sudo apt update && sudo apt install -y elasticsearch
    

JVM 메모리 및 기본 설정

  • JVM 힙: 시스템 메모리의 50% 이내 (최대 32GB)에서 -Xms-Xmx 값을 동일하게 설정합니다.
    -Xms4g
    -Xmx4g
    

    /etc/elasticsearch/jvm.options.d/heap.options에 위 내용을 추가합니다.

  • elasticsearch.yml 설정: /etc/elasticsearch/elasticsearch.yml 파일을 열어 다음 설정을 추가합니다.
    • cluster.name: prod-es
    • node.name: es-1 (노드별로 고유하게 설정)
    • network.host: 0.0.0.0
    • discovery.type: single-node (단일 노드일 경우에만 사용)

서비스 기동

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch

설치 직후 보안이 기본으로 활성화되므로, 최초 실행 시 출력되는 elastic 계정의 비밀번호와 TLS 관련 정보를 반드시 기록해 두세요.


운영형 클러스터 구성 (3노드 예시)

단일 노드에서 확장할 때, 3개 이상의 노드로 구성하여 고가용성을 확보하는 것이 일반적입니다.

  • 설정 샘플: elasticsearch.yml에 아래 설정을 추가합니다.
    YAML

    # 클러스터 내 모든 노드의 IP 주소
    discovery.seed_hosts: ["10.0.0.11", "10.0.0.12", "10.0.0.13"]
    # 최초 클러스터 구성을 위한 마스터 노드 목록
    cluster.initial_master_nodes: ["es-1", "es-2", "es-3"]
    
  • 노드 역할: 소규모 클러스터에서는 모든 노드가 master, data, ingest 역할을 모두 수행하도록 설정하는 것이 효율적입니다.

보안 (운영 필수)

Elasticsearch 8.x 버전은 보안 기능이 기본으로 활성화되어 있습니다. 운영 환경에서는 이를 더욱 강화해야 합니다.

  • 사용자 및 역할 관리: elastic 계정의 비밀번호를 즉시 변경하고, 각 프로젝트나 팀에 맞는 최소 권한의 사용자 계정을 생성하세요.
  • 네트워크 방화벽: 외부에서는 HTTP 포트인 9200과 Transport 포트인 9300만 접근 가능하도록 방화벽 규칙을 설정합니다.
  • TLS (HTTPS): 8.x는 HTTP와 Transport 계층 모두 TLS를 지원합니다. 이를 통해 노드 간 통신과 외부 접속을 암호화할 수 있습니다.

색인 설계 (샤드·레플리카·라이프사이클)

데이터를 효율적으로 저장하고 관리하기 위한 핵심 전략입니다.

  • 샤드 (Shard): 샤드는 인덱스를 분할하여 저장하는 단위입니다. 샤드당 50~100GB의 데이터가 저장되도록 샤드 개수를 조정하는 것을 권장합니다.
  • 레플리카 (Replica): 데이터의 복제본입니다. 레플리카를 1로 설정하면 노드 장애 시에도 데이터가 유실되지 않고 검색이 가능합니다.
  • ILM (Index Lifecycle Management): 로그 데이터처럼 시간이 지나면 중요도가 낮아지는 데이터는 핫(Hot) → 웜(Warm) → 콜드(Cold) → 삭제(Delete) 단계별로 디스크와 샤드 설정을 다르게 하여 비용을 절감합니다.

매핑 및 분석기 (한글 포함)

데이터 필드에 대한 매핑과 분석기를 설정하여 검색 품질을 향상시킵니다.

  • 한국어 분석기: Elasticsearch 8.x는 analysis-nori 플러그인을 기본으로 포함하고 있어, 한국어 텍스트 분석에 최적화된 설정을 쉽게 적용할 수 있습니다.
  • 매핑 예시:
    JSON

    "properties": {
      "title": { "type": "text", "analyzer": "nori_tokenizer" },
      "created_at": { "type": "date" },
      "price": { "type": "scaled_float", "scaling_factor": 100 }
    }
    

    정렬 및 집계용으로는 keyword 타입을 병행 사용하는 것이 좋습니다.


색인(인덱싱) 실전

대량의 데이터를 Elasticsearch에 빠르게 넣는 방법입니다.

  • 벌크(Bulk) 색인: 한 번의 API 호출로 여러 문서를 색인하는 벌크 API를 사용하세요. 5~15MB 또는 1천~5천 개 문서를 묶어 보내는 것이 효율적입니다.
  • 대량 적재 시 튜닝: 대량의 데이터를 색인할 때는 refresh_interval을 30초 정도로 늘리고, replica0으로 임시 설정하여 색인 속도를 높일 수 있습니다. 작업 완료 후에는 원래 설정으로 되돌려야 합니다.

 

Disclaimer: 본 블로그의 정보는 개인의 단순 참고 및 기록용으로 작성된 것이며, 개인적인 조사와 생각을 담은 내용이기에 오류가 있거나 편향된 내용이 있을 수 있습니다.