Skip to main content

ELK 파이프라인


Intro

로그 데이터를 RDBMS에 쌓으면 검색이 느리고 불편하다. 특정 에러 메시지가 들어간 로그를 찾으려고 LIKE '%keyword%' 쿼리를 돌리면 데이터가 쌓일수록 감당이 안 된다. ELK 스택을 직접 구성해보면서 개념을 정리했다.


1. Elasticsearch​

1-1. RDBMS와는 다른 'Schemaless'​

Elasticsearch는 RDBMS와 달리 Schema-less(스키마리스) 구조다.

  • JSON 기반: 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 필드: 원문 그대로 저장된다. 완전 일치 검색에 쓴다.
  1. Phrase 검색 ("")
  • 큰따옴표로 감싸면 띄어쓰기까지 포함된 하나의 덩어리로 인식한다.
대소문자 구분

기본적으로 대소문자를 구분하지 않는다. 구분이 필요하면 분석기(Analyzer) 를 직접 정의해서 인덱스를 만들어야 한다.


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

로그 데이터를 수집(Filebeat) → 가공(Logstash) → 적재(ES) 하는 파이프라인을 직접 구성해봤다.

3-1. 아키텍처 흐름​

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

왜 Logstash를 거칠까?

Filebeat에서 ES로 바로 쏠 수도 있다. 근데 그러면 비정형 데이터가 정제 없이 그대로 들어간다. Logstash를 중간에 두면 불필요한 필드를 제거하거나 포맷을 통일할 수 있다.

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

1) Filebeat 설정 (filebeat.yml).​

Download

실습에 필요한 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 파일을 만든다.

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 전처리를 거쳐야 비정형 로그가 분석 가능한 형태로 바뀐다!!