데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약
ELK Stack은 Elasticsearch, Logstash, Kibana 세 오픈소스 도구의 앞글자를 딴 로그 및 데이터 분석 플랫폼입니다. 최근에는 Beats 계열 경량 수집기도 포함하여 Elastic Stack으로 불리기도 합니다.
ELK는 대규모 로그, 메트릭, 보안 이벤트 등을 실시간으로 수집 · 저장 · 검색 · 시각화하여 인프라 및 애플리케이션의 observability를 확보하는 데 핵심적인 역할을 합니다.
Logstash와 Beats가 다양한 소스(파일, 네트워크, 클라우드)에서 로그와 메트릭을 수집, 변환, 정규화하여 Elasticsearch로 전송합니다.
Elasticsearch는 분산 검색 엔진으로 대량의 데이터를 색인화하고, REST API를 통해 빠른 전문 검색과 집계를 지원합니다.
Kibana는 Elasticsearch 데이터를 기반으로 실시간 차트, 지도, 대시보드를 생성하여 직관적인 데이터 탐색과 모니터링을 제공합니다.
전통적인 RDBMS 기반 로깅이나 단순 파일 분석과 비교했을 때 ELK Stack이 제공하는 장점은 명확합니다. 아래 표는 주요 대안과의 차이를 보여줍니다.
| 항목 | ELK Stack | 전통 RDBMS | Splunk | Graylog |
|---|---|---|---|---|
| 실시간 검색 | ✅ 뛰어남 (역색인) | ❌ 느림 (정규화 쿼리) | ✅ 매우 빠름 | ✅ 우수 |
| 비정형 데이터 | ✅ 자유로운 스키마 | ❌ 고정 스키마 | ✅ 자유로움 | ✅ 일부 유연함 |
| 확장성 | ✅ 수평 확장 용이 | ❌ 수직 확장 한계 | ✅ 확장 가능 | ✅ 확장 가능 |
| 비용 | 🟢 오픈소스 무료 | 🟢 라이선스 비용 | 🔴 고가 | 🟢 오픈소스 |
| 시각화 | ✅ Kibana (강력) | ❌ 별도 툴 필요 | ✅ 내장 대시보드 | ✅ 내장 대시보드 |
💡 결론: 로그 기반 observability, 보안 분석, DevOps 모니터링에 가장 비용 효율적이고 강력한 선택입니다. 특히 오픈소스 생태계와 풍부한 플러그인이 장점입니다.
ELK Stack의 데이터 흐름은 수집 → 처리 → 저장 → 시각화의 단계로 이루어집니다. 아래 다이어그램은 전체 아키텍처를 단순화하여 나타냅니다.
주요 용어
Docker Compose를 사용하면 로컬 환경에서 ELK Stack을 빠르게 구성할 수 있습니다. 아래 단계를 따라 해보세요.
# docker-compose.yml (최소 구성)
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
ports:
- "9200:9200"
logstash:
image: docker.elastic.co/logstash/logstash:8.15.0
ports:
- "5000:5000"
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
kibana:
image: docker.elastic.co/kibana/kibana:8.15.0
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601:5601"
# 실행
docker compose up -d
input {
tcp {
port => 5000
codec => json
}
}
filter {
mutate { remove_field = ["@version"] }
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "quickstart-%{+YYYY.MM.dd}"
}
}
아래 Python 코드를 실행하여 Logstash로 JSON 로그를 전송하면 Elasticsearch에 색인됩니다.
import socket
import json
import time
HOST = 'localhost'
PORT = 5000
log_data = {
"timestamp": time.strftime("%Y-%m-%dT%H:%M:%S"),
"level": "INFO",
"service": "web-app",
"message": "User login successful",
"user_id": 12345
}
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(json.dumps(log_data).encode('utf-8'))
print("Log sent!")
# 브라우저에서 http://localhost:5601 접속
# Stack Management → Index Patterns → "quickstart-*" 생성
# Discover 메뉴에서 전송된 로그 검색
⚠️ 보안 참고: 실제 운영 환경에서는 xpack.security.enabled=true로 설정하고 TLS 인증을 적용하세요.
다음 표는 Elasticsearch, Logstash, Kibana에서 자주 사용되는 설정 항목을 요약합니다.
| 구분 | 설정 항목 | 설명 | 기본값 |
|---|---|---|---|
| Elasticsearch | cluster.name | 클러스터 식별 이름 | elasticsearch |
| node.name | 노드 이름 | hostname | |
| path.data | 데이터 저장 경로 | /var/lib/elasticsearch | |
| discovery.seed_hosts | 클러스터 발견 호스트 목록 | [] | |
| indices.memory.index_buffer_size | 인덱스 버퍼 메모리 비율 | 10% | |
| Logstash | pipeline.workers | 병렬 처리 워커 수 | CPU 코어 수 |
| pipeline.batch.size | 배치당 이벤트 수 | 125 | |
| path.config | 파이프라인 설정 파일 경로 | /etc/logstash/conf.d | |
| Kibana | server.port | Kibana 서버 포트 | 5601 |
| elasticsearch.hosts | Elasticsearch 접속 주소 | http://localhost:9200 | |
| kibana.index | Kibana 내부 상태 저장 인덱스 | .kibana |
📘 팁: 성능 튜닝 시 heap size (ES_HEAP_SIZE)와 refresh interval을 먼저 확인하세요.
운영 환경에서 자주 겪는 문제와 해결 방법을 정리했습니다.
원인: 샤드 복제본이 할당되지 않음 (디스크 부족, 노드 장애).
해결: GET _cluster/health로 상태 확인, GET _cat/shards로 미할당 샤드 파악, 디스크 공간 확보 또는 복제본 수 조정.
원인: 네트워크 설정, 인증 오류, 파이프라인 문법 오류.
해결: Logstash 로그 확인 (docker logs logstash), bin/logstash -f config.conf --config.test_and_exit로 문법 검증, hosts 주소와 포트 확인.
원인: 많은 데이터, 비효율적인 쿼리, Kibana 힙 메모리 부족.
해결: 인덱스 패턴에 필터 적용, 쿼리 캐시 활성화, server.maxPayloadBytes 증가, Kibana heap 크기 조정.
✅ 모범 사례: ILM (Index Lifecycle Management)을 적용하여 오래된 인덱스를 자동으로 롤오버 및 삭제하고, hot-warm-cold 아키텍처로 비용을 최적화하세요.
공식 문서와 유용한 리소스입니다.