Elasticsearch 설정의 중요성
“올바른 Elasticsearch 설정은 시스템 성능을 300% 이상 향상시킬 수 있습니다”
Elasticsearch는 강력한 검색 엔진이지만, 잘못된 설정으로 인해 성능 저하와 안정성 문제를 겪는 경우가 많습니다. 특히 한국의 대용량 서비스 환경에서는 적절한 설정이 필수입니다.
왜 설정이 중요한가?
- 검색 속도: 적절한 메모리 설정으로 응답시간 50% 단축
- 안정성: 클러스터 장애 발생률 80% 감소
- 확장성: 노드 추가 시 무중단 운영 가능
- 비용 효율성: 하드웨어 리소스 최적 활용
클러스터 기본 설정
1. cluster.name 설정
cluster.name: "production-search-cluster"
❌ 피해야 할 실수
- 기본값 “elasticsearch” 그대로 사용
- 환경별 구분 없이 동일한 이름 사용
✅ 모범 사례
- 환경별 명확한 구분:
prod-search,dev-search,staging-search - 서비스명 포함:
ecommerce-prod,log-analysis-dev
2. node.name 설정
node.name: "${HOSTNAME}-es-node"
권장 네이밍 규칙
- 서버 역할 + 순서:
master-01,data-02,ingest-03 - 지역 + 역할:
seoul-master-01,busan-data-01
노드 역할 최적화
마스터 노드 (Master Node)
node.master: true
node.data: false
node.ingest: false
node.ml: false
마스터 노드 설정 포인트
- 개수: 홀수 개 권장 (3개, 5개)
- 스펙: CPU 중심, 메모리 8GB 이상
- 용도: 클러스터 메타데이터 관리 전용
데이터 노드 (Data Node)
node.master: false
node.data: true
node.ingest: false
데이터 노드 최적화 팁
- 스토리지: SSD 필수, NVMe 권장
- 메모리: 32GB 이상 (Heap 16GB 설정)
- CPU: 높은 코어 수보다 높은 클럭 중요
인제스트 노드 (Ingest Node)
node.master: false
node.data: false
node.ingest: true
인제스트 노드 특징
- 데이터 전처리 전담
- 높은 CPU 성능 필요
- 로그 파이프라인 처리 최적화
네트워크 및 포트 설정
기본 네트워크 설정
network.host: "0.0.0.0"
http.port: 9200
transport.port: 9300
보안 강화 설정
# 외부 접근 제한
network.host: ["_local_", "_site_"]
# 포트 범위 설정
http.port: 9200-9300
transport.port: 9300-9400
한국 환경 고려사항
- 방화벽: 9200, 9300 포트 허용
- 로드밸런서: AWS ALB, NCP LB 연동 고려
- 네트워크 지연: 가용성 영역(AZ) 간 통신 최적화
메모리 관리 설정
JVM Heap 메모리 설정
# jvm.options 파일
-Xms16g
-Xmx16g
Heap 메모리 설정 원칙
- 전체 메모리의 50% 이하
- 32GB 이상 설정 금지 (Compressed OOPs 제한)
- Min과 Max 동일하게 설정
캐시 메모리 최적화
# 필드데이터 캐시
indices.fielddata.cache.size: "20%"
# 쿼리 캐시
indices.queries.cache.size: "10%"
# 요청 캐시
indices.requests.cache.size: "2%"
메모리 사용량별 권장 설정
| 전체 메모리 | Heap 설정 | fielddata | query cache |
|---|---|---|---|
| 16GB | 8GB | 15% | 10% |
| 32GB | 16GB | 20% | 10% |
| 64GB | 31GB | 25% | 15% |
인덱스 최적화 설정
샤드 설정 최적화
# 기본 샤드 설정
index.number_of_shards: 1
index.number_of_replicas: 1
# 자동 샤드 조정
cluster.max_shards_per_node: 1000
샤드 설정 가이드라인
- 단일 샤드 크기: 20-50GB 권장
- 노드당 샤드 수: 20개 이하 권장
- 검색 성능: 샤드 수 ↓, 인덱싱 성능: 샤드 수 ↑
리프레시 설정
# 실시간성 vs 성능 트레이드오프
index.refresh_interval: "30s" # 기본: 1s
# 대용량 인덱싱 시
index.refresh_interval: "-1" # 수동 리프레시
세그먼트 병합 최적화
index.merge.policy.max_merge_at_once: 10
index.merge.policy.segments_per_tier: 10
index.merge.scheduler.max_thread_count: 1
운영 환경별 권장 설정
🏢 대용량 로그 분석 환경
# 인덱스 템플릿
{
"index_patterns": ["logs-*"],
"settings": {
"number_of_shards": 3,
"number_of_replicas": 0,
"refresh_interval": "30s",
"index.codec": "best_compression"
}
}
특징
- 높은 인덱싱 성능 중심
- 압축률 우선 (스토리지 비용 절약)
- 복제본 최소화
🛒 실시간 검색 서비스
# 검색 성능 최적화
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 2,
"refresh_interval": "1s",
"index.queries.cache.enabled": true
}
}
특징
- 빠른 검색 응답 우선
- 높은 가용성 (복제본 2개)
- 쿼리 캐시 적극 활용
🏦 금융권 고가용성 환경
# 안정성 최우선
cluster.routing.allocation.same_shard.host: false
cluster.routing.allocation.awareness.attributes: "rack_id"
index.unassigned.node_left.delayed_timeout: "5m"
특징
- 노드 장애 시 자동 복구
- 랙 간 샤드 분산
- 지연된 할당으로 불필요한 복제 방지
성능 모니터링과 튜닝
핵심 모니터링 메트릭
1. 클러스터 상태
GET /_cluster/health
2. 노드 성능
GET /_nodes/stats
3. 인덱스 통계
GET /_cat/indices?v&s=store.size:desc
성능 문제 해결 체크리스트
🔍 검색 성능 이슈
- [ ] 쿼리 복잡도 확인
- [ ] 필드데이터 사용량 점검
- [ ] 샤드 크기 최적화
- [ ] 캐시 적중률 분석
⚡ 인덱싱 성능 이슈
- [ ] 리프레시 간격 조정
- [ ] 복제본 수 임시 감소
- [ ] 벌크 사이즈 최적화
- [ ] 스레드풀 설정 확인
실전 성능 튜닝 사례
Case 1: 전자상거래 검색 최적화
문제: 상품 검색 응답시간 3초 → 해결: 0.5초
# 개선 전
index.refresh_interval: "1s"
indices.fielddata.cache.size: "무제한"
# 개선 후
index.refresh_interval: "10s"
indices.fielddata.cache.size: "30%"
index.queries.cache.enabled: true
결과: 검색 성능 6배 향상, 메모리 사용량 40% 감소
Case 2: 로그 수집 시스템 최적화
문제: 일 10TB 로그 처리 병목 → 해결: 무중단 처리
# 벌크 인덱싱 최적화
thread_pool.write.queue_size: 1000
indices.memory.index_buffer_size: "20%"
index.translog.flush_threshold_size: "1gb"
결과: 인덱싱 처리량 300% 증가
한국 서비스 환경 특화 팁
🇰🇷 한글 검색 최적화
# 한글 형태소 분석기 설정
{
"settings": {
"analysis": {
"analyzer": {
"korean": {
"type": "custom",
"tokenizer": "nori_tokenizer",
"filter": ["lowercase", "nori_part_of_speech"]
}
}
}
}
}
🌐 멀티 클라우드 환경 고려
AWS 환경
- EBS GP3 스토리지 권장
- 인스턴스 타입: r5.xlarge 이상
- Auto Scaling Group 연동
네이버 클라우드 환경
- SSD 스토리지 필수
- 로드밸런서 헬스체크 설정
- Cloud DB for Elasticsearch 활용 검토
자주 묻는 질문 (FAQ)
Q1. 메모리가 부족할 때 어떻게 해야 하나요?
즉시 조치사항
- fielddata 캐시 사이즈 줄이기 (30% → 20%)
- 불필요한 인덱스 삭제
- 세그먼트 강제 병합 실행
Q2. 클러스터가 노란색 상태일 때 대처법은?
원인별 해결책
- 샤드 미할당:
cluster.routing.allocation.enable: "all" - 디스크 부족: 워터마크 설정 조정
- 노드 부족: 복제본 수 임시 감소
Q3. 인덱싱 성능이 느려질 때는?
체크포인트
- 리프레시 간격 늘리기 (1s → 30s)
- 복제본 수 0으로 설정 후 완료 시 복원
- 벌크 사이즈 최적화 (5-15MB)
마무리: 성공적인 Elasticsearch 운영을 위한 3가지 원칙
🎯 1. 점진적 최적화
한 번에 모든 설정을 바꾸지 마세요. 하나씩 변경하며 성능 변화를 측정하는 것이 안전합니다.
📊 2. 지속적인 모니터링
설정 후 끝이 아닙니다. 지속적인 모니터링을 통해 환경 변화에 맞춰 설정을 조정해야 합니다.
🔄 3. 백업과 복구 전략
최적화 작업 전 반드시 백업하세요. 문제 발생 시 빠른 롤백이 가능해야 합니다.
📚 추가 학습 자료
이 가이드가 도움이 되셨나요? 댓글로 여러분의 Elasticsearch 운영 경험을 공유해주세요! 실제 운영 환경에서의 팁과 노하우를 함께 나누면 더욱 유용한 콘텐츠가 될 것입니다.
2025년 최신 버전 기준으로 작성된 가이드입니다. Elasticsearch 8.x 버전의 새로운 기능과 설정 방법을 반영했습니다.