Skip to main content

ELK Stack: 핵심 개념과 파이프라인

작성일: 2025.10.01


Intro

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 MethodRDBMS 대응설명
Create (생성)POSTINSERT데이터를 인덱스에 저장
Read (조회)GETSELECT저장된 데이터 검색
Update (수정)PUTUPDATE데이터 수정 (전체 덮어쓰기)
Delete (삭제)DELETEDELETE데이터 삭제
Performance Tip: _bulk

대량의 데이터를 저장할 때는 한 건씩 요청하는 것보다 _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 kql kql

kql

💡 KQL 핵심 규칙

  1. Text vs Keyword
  • 일반 필드(Text): 문장이 분석기에 의해 쪼개져 저장됩니다. 부분 일치 검색에 유리합니다.
  • keyword 필드: 원문 그대로 저장됩니다. 100% 완전 일치 검색 시 사용합니다.
  1. Phrase 검색 ("")
  • 큰따옴표로 감싸면 띄어쓰기까지 포함된 하나의 문장 덩어리로 인식합니다. (쪼갤 수 없는 문자열)
대소문자 구분

기본적으로 검색 시 대소문자를 구분하지 않으나, 명확한 구분이 필요한 경우 분석기(Analyzer) 를 직접 정의하여 인덱스를 생성해야 합니다.


3. 데이터 파이프라인: Filebeat & Logstash

로그 데이터를 수집(Filebeat) 하고 가공(Logstash) 하여 적재(ES) 하는 과정을 실습합니다.

3-1. 아키텍처 흐름

Filebeat (수집) ➡ Logstash (필터링/가공) ➡ Elasticsearch (적재)

왜 Logstash를 거칠까?

Filebeat에서 ES로 바로 쏠 수도 있지만(Output: Elasticsearch), 이 경우 비정형 데이터가 정제 없이 그대로 들어갑니다. Logstash를 중간에 두면 불필요한 필드를 제거하거나 포맷을 통일하는 등 데이터 전처리가 가능합니다.

3-2. 설정 및 실행 (Windows)

1) Filebeat 설정 (filebeat.yml).

Download

실습에 필요한 FilebeatLogstash의 이전 버전은 아래 공식 링크에서 다운로드할 수 있습니다.

다운로드 :::

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 파일을 생성합니다.

work

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. 결과 확인

work

Elasticsearch-head 또는 Kibana Dev Tools에서 bank-data 인덱스가 정상적으로 생성되었는지 확인합니다.


Other) Logstash 없이 Filebeat로만 처리 했을 경우?

- filebeat.yml 수정
1. ElasticSearch Output - 주석 해제
2. Logstash Output - 주석 처리

주의 사항 : output은 ES or Logstash 중 하나만 열어 놓고 해야 함 (충돌 가능성)

work

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