ELK Stack: 핵심 개념과 파이프라인
작성일: 2025.10.01
1. Elasticsearch
1-1. RDBMS와는 다른 'Schemaless'
Elasticsearch는 RDBMS와 달리 Schema-less(스키마리스) 라는 유연한 특징을 가집니다.
- JSON 기반: Web Server와 Client 간의 통신 표준인 HTTP 프로토콜과 JSON 데이터를 기반으로 동작합니다.
- 유연성:
test테이블에id컬럼만 있다가 갑자기nickname컬럼이 포함된 데이터가 들어와도, ES는 이를 거부하지 않고 동적으로 매핑하여 저장합니다.
1-2. REST API와 CRUD
ES는 복잡한 SQL 문법 대신 직관적인 REST API를 사용합니다.
| 작업 (CRUD) | HTTP Method | RDBMS 대응 | 설명 |
|---|---|---|---|
| Create (생성) | POST | INSERT | 데이터를 인덱스에 저장 |
| Read (조회) | GET | SELECT | 저장된 데이터 검색 |
| Update (수정) | PUT | UPDATE | 데이터 수정 (전체 덮어쓰기) |
| Delete (삭제) | DELETE | DELETE | 데이터 삭제 |
대량의 데이터를 저장할 때는 한 건씩 요청하는 것보다 _bulk API를 사용하여 한 번에 처리하는 것이 성능상 훨씬 유리합니다.
1-3. 역색인 (Inverted Index)
ES가 방대한 데이터 안에서도 순식간에 검색 결과를 찾아내는 비결은 역색인(Inverted Index) 구조에 있습니다.
- 정색인(Forward Index): "1번 문서에는 '사과, 배'가 있다." (일반적인 DB 방식)
- 역색인(Inverted Index): "'사과'는 1, 3번 문서에 있다." (Elasticsearch 방식)
(▲ 데이터를 저장할 때 문장을 단어(Term) 단위로 쪼개어 매핑 테이블을 생성합니다.)
2. Kibana Query Language (KQL)
Kibana의 Discover 탭에서 데이터를 찾을 때 사용하는 쿼리 언어입니다.
✅ 예제 시나리오
주소가 "상암동 170"이면서, 도시명이 "상암"인 데이터를 찾고 싶을 때
address: "상암동 170" and city.keyword: "상암"


💡 KQL 핵심 규칙
- Text vs Keyword
- 일반 필드(Text): 문장이 분석기에 의해 쪼개져 저장됩니다. 부분 일치 검색에 유리합니다.
keyword필드: 원문 그대로 저장됩니다. 100% 완전 일치 검색 시 사용합니다.
- Phrase 검색 (
"")
- 큰따옴표로 감싸면 띄어쓰기까지 포함된 하나의 문장 덩어리로 인식합니다. (쪼갤 수 없는 문자열)
기본적으로 검색 시 대소문자를 구분하지 않으나, 명확한 구분이 필요한 경우 분석기(Analyzer) 를 직접 정의하여 인덱스를 생성해야 합니다.
3. 데이터 파이프라인: Filebeat & Logstash
로그 데이터를 수집(Filebeat) 하고 가공(Logstash) 하여 적재(ES) 하는 과정을 실습합니다.
3-1. 아키텍처 흐름
Filebeat (수집) ➡ Logstash (필터링/가공) ➡ Elasticsearch (적재)
Filebeat에서 ES로 바로 쏠 수도 있지만(Output: Elasticsearch), 이 경우 비정형 데이터가 정제 없이 그대로 들어갑니다. Logstash를 중간에 두면 불필요한 필드를 제거하거나 포맷을 통일하는 등 데이터 전처리가 가능합니다.
3-2. 설정 및 실행 (Windows)
1) Filebeat 설정 (filebeat.yml).
실습에 필요한 Filebeat와 Logstash의 이전 버전은 아래 공식 링크에서 다운로드할 수 있습니다.
다운로드 :::
Filebeat가 데이터를 ES로 바로 보내지 않고 Logstash로 보내도록 설정합니다.
- filebeat.yml 수정
1. Filebeat inputs - paths 수정
2. ElasticSearch Output - 주석 처리
3. Logstash Output - 주석 해제
주의 사항 : output은 ES or Logstash 중 하나만 열어 놓고 해야 함 (충돌 가능성)
# Filebeat Inputs
filebeat.inputs:
- type: log
enabled: true
paths:
- C:\logs\*.log # 로그 파일 경로
# 1. ES 출력 주석 처리 (충돌 방지)
# output.elasticsearch:
# hosts: ["localhost:9200"]
# 2. Logstash 출력 활성화
output.logstash:
hosts: ["localhost:5044"]
2) Logstash 파이프라인 설정 (bank.conf)
config 폴더 내에 .conf 파일을 생성합니다.

3) 실행 명령
Step 1. Logstash 실행 환경변수 설정 후, 작성한 config 파일을 로드하여 실행합니다.
# 환경변수 설정 (Windows 예시)
set JAVA_HOME="C:\02.devEnv\ELK\logstash-7.11.1\jdk"
setx PATH "%PATH%;%JAVA_HOME%\bin"
# Logstash 실행
logstash -f ..\config\bank.conf
Step 2. Filebeat 실행
filebeat -e -c filebeat.yml
Step 3. 결과 확인

Elasticsearch-head 또는 Kibana Dev Tools에서 bank-data 인덱스가 정상적으로 생성되었는지 확인합니다.
Other) Logstash 없이 Filebeat로만 처리 했을 경우?
- filebeat.yml 수정
1. ElasticSearch Output - 주석 해제
2. Logstash Output - 주석 처리
주의 사항 : output은 ES or Logstash 중 하나만 열어 놓고 해야 함 (충돌 가능성)

→ 정상적으로 생성은 되나 logstash config에서 세팅을 해주지 않은 파일이 올라가기 때문에 정형화 되지 않은 값들이 올라감 Logstash의 전처리 과정은 무의미할 수 있는 비정형 로그를 분석 가능한 데이터로 변환하는 데 핵심적인 역할을 함!!