ELK Stack 실무 스터디 가이드

데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약

#logging #search #observability 2026.03

1. ELK Stack란?

ELK Stack은 Elasticsearch, Logstash, Kibana 세 오픈소스 도구의 앞글자를 딴 로그 및 데이터 분석 플랫폼입니다. 최근에는 Beats 계열 경량 수집기도 포함하여 Elastic Stack으로 불리기도 합니다.

ELK는 대규모 로그, 메트릭, 보안 이벤트 등을 실시간으로 수집 · 저장 · 검색 · 시각화하여 인프라 및 애플리케이션의 observability를 확보하는 데 핵심적인 역할을 합니다.

3대 핵심 능력

📡 데이터 수집

Logstash와 Beats가 다양한 소스(파일, 네트워크, 클라우드)에서 로그와 메트릭을 수집, 변환, 정규화하여 Elasticsearch로 전송합니다.

🔍 저장 & 검색

Elasticsearch는 분산 검색 엔진으로 대량의 데이터를 색인화하고, REST API를 통해 빠른 전문 검색과 집계를 지원합니다.

📊 시각화 & 대시보드

Kibana는 Elasticsearch 데이터를 기반으로 실시간 차트, 지도, 대시보드를 생성하여 직관적인 데이터 탐색과 모니터링을 제공합니다.

2. 왜 써야 하는가?

전통적인 RDBMS 기반 로깅이나 단순 파일 분석과 비교했을 때 ELK Stack이 제공하는 장점은 명확합니다. 아래 표는 주요 대안과의 차이를 보여줍니다.

항목 ELK Stack 전통 RDBMS Splunk Graylog
실시간 검색 ✅ 뛰어남 (역색인) ❌ 느림 (정규화 쿼리) ✅ 매우 빠름 ✅ 우수
비정형 데이터 ✅ 자유로운 스키마 ❌ 고정 스키마 ✅ 자유로움 ✅ 일부 유연함
확장성 ✅ 수평 확장 용이 ❌ 수직 확장 한계 ✅ 확장 가능 ✅ 확장 가능
비용 🟢 오픈소스 무료 🟢 라이선스 비용 🔴 고가 🟢 오픈소스
시각화 ✅ Kibana (강력) ❌ 별도 툴 필요 ✅ 내장 대시보드 ✅ 내장 대시보드

💡 결론: 로그 기반 observability, 보안 분석, DevOps 모니터링에 가장 비용 효율적이고 강력한 선택입니다. 특히 오픈소스 생태계와 풍부한 플러그인이 장점입니다.

3. 핵심 개념

ELK Stack의 데이터 흐름은 수집 → 처리 → 저장 → 시각화의 단계로 이루어집니다. 아래 다이어그램은 전체 아키텍처를 단순화하여 나타냅니다.

+-----------+ +----------+ +----------------+ +---------+ | Beats | | Logstash | | Elasticsearch | | Kibana | | (Filebeat,|----->| (수집/ |----->| (분산 색인/ |<----->| (시각화/ | | Metric..)| | 변환) | | 검색 엔진) | | 대시 | +-----------+ +----------+ +----------------+ +---------+ | | | | v v v v [애플리케이션] [파서/변환] [샤드/복제본] [사용자]

주요 용어

4. 퀵스타트

Docker Compose를 사용하면 로컬 환경에서 ELK Stack을 빠르게 구성할 수 있습니다. 아래 단계를 따라 해보세요.

Step 1: 설치 (Docker Compose)

# 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

Step 2: Logstash 설정 (logstash.conf)

input {
  tcp {
    port => 5000
    codec => json
  }
}
filter {
  mutate { remove_field = ["@version"] }
}
output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "quickstart-%{+YYYY.MM.dd}"
  }
}

Step 3: Python으로 데이터 전송

아래 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!")

Step 4: Kibana에서 확인

# 브라우저에서 http://localhost:5601 접속
# Stack Management → Index Patterns → "quickstart-*" 생성
# Discover 메뉴에서 전송된 로그 검색

⚠️ 보안 참고: 실제 운영 환경에서는 xpack.security.enabled=true로 설정하고 TLS 인증을 적용하세요.

5. 핵심 설정 레퍼런스

다음 표는 Elasticsearch, Logstash, Kibana에서 자주 사용되는 설정 항목을 요약합니다.

구분 설정 항목 설명 기본값
Elasticsearchcluster.name클러스터 식별 이름elasticsearch
node.name노드 이름hostname
path.data데이터 저장 경로/var/lib/elasticsearch
discovery.seed_hosts클러스터 발견 호스트 목록[]
indices.memory.index_buffer_size인덱스 버퍼 메모리 비율10%
Logstashpipeline.workers병렬 처리 워커 수CPU 코어 수
pipeline.batch.size배치당 이벤트 수125
path.config파이프라인 설정 파일 경로/etc/logstash/conf.d
Kibanaserver.portKibana 서버 포트5601
elasticsearch.hostsElasticsearch 접속 주소http://localhost:9200
kibana.indexKibana 내부 상태 저장 인덱스.kibana

📘 팁: 성능 튜닝 시 heap size (ES_HEAP_SIZE)와 refresh interval을 먼저 확인하세요.

6. 실무 팁 & 트러블슈팅

운영 환경에서 자주 겪는 문제와 해결 방법을 정리했습니다.

🔴 문제: Elasticsearch 노드가 노란색/빨간색 상태

원인: 샤드 복제본이 할당되지 않음 (디스크 부족, 노드 장애).
해결: GET _cluster/health로 상태 확인, GET _cat/shards로 미할당 샤드 파악, 디스크 공간 확보 또는 복제본 수 조정.

🔴 문제: Logstash에서 데이터가 Elasticsearch로 전송되지 않음

원인: 네트워크 설정, 인증 오류, 파이프라인 문법 오류.
해결: Logstash 로그 확인 (docker logs logstash), bin/logstash -f config.conf --config.test_and_exit로 문법 검증, hosts 주소와 포트 확인.

🔴 문제: Kibana 대시보드 로딩 속도 느림

원인: 많은 데이터, 비효율적인 쿼리, Kibana 힙 메모리 부족.
해결: 인덱스 패턴에 필터 적용, 쿼리 캐시 활성화, server.maxPayloadBytes 증가, Kibana heap 크기 조정.

✅ 모범 사례: ILM (Index Lifecycle Management)을 적용하여 오래된 인덱스를 자동으로 롤오버 및 삭제하고, hot-warm-cold 아키텍처로 비용을 최적화하세요.

7. 참고 자료

공식 문서와 유용한 리소스입니다.