Skip to main content

Command Palette

Search for a command to run...

[Elasticsearch] ELK stack에 관하여

Updated
4 min read

-elastic

▶ 들어가며

이번에는 ELK Stack에 관해서 찍먹을 해보자.
전체적인 플로우를 먼저 잡아두면, 이 기술을 왜 사용하는지, 어떤 구조로 동작하는지 이해하기가 훨씬 쉬워진다.

그래서 이번 글에서는 ELK Stack을 구성하는 요소들이 각각 어떤 역할을 하는지,
그리고 전체 흐름이 어떻게 연결되는지를 가볍게 정리해보려고 한다.


▶ ELK Stack 전체 구조

-ELK stack

위 사진은 ELK Stack의 전체적인 구조를 보여주는 대표적인 그림이다. ELK Stack의 핵심 요소는 이름 그대로 아래 3가지이다.

로고가 아주 찰떡이야

  • Elasticsearch

  • Logstash

  • Kibana

그리고 가장 왼쪽에 있는 data 구간은 Beats라는 별도의 구성요소로 구분된다.

그럼 이제 각 단계가 어떤 역할을 하는지 하나씩 살펴보자.


▶ Beats

-Beats

사진에서 가장 왼쪽에 있는 요소들이 Beats이다.
Beats는 “가벼운 수집 프로그램”들이고, 서버에 설치해서 데이터를 긁어 Elasticsearch 또는 Logstash로 보내는 데이터 수집기 역할을 한다.

즉 Beats는 서버에 설치해서 백그라운드에서 동작하는
👉 경량 수집 agent 프로그램이라고 이해하면 된다.

Beats는 종류가 여러 가지가 있는데 대표적으로 아래와 같다.

  • Filebeat : 서버의 로그 파일(log file)을 수집

  • Metricbeat : CPU, RAM, Disk 사용량 같은 서버 metric 정보를 수집

  • Packetbeat : 네트워크 패킷(wire data)을 분석하여 트래픽 정보를 수집

  • Winlogbeat : Windows 이벤트 로그를 수집

!! Beats가 하는 일을 정리하면 이런 느낌이다!!

  • 웹서버, 백엔드 서버, DB 서버, 운영 서버 등에 설치

  • 로그 파일을 읽거나, metric을 수집하거나, 네트워크 패킷을 분석해서

  • Elasticsearch 또는 Logstash로 전송

즉, 빅데이터 관점에서 보면 Beats는
👉 Ingestion(수집) 단계에 해당한다고 보면 된다.


▶ Logstash

-logstash

Logstash는 ELK에서 Beats로부터 로그를 받아서
👉 가공한 뒤 목적지로 보내는 중간 처리 서버 역할을 한다.

Logstash는 단순 전달이 아니라, 로그 데이터를 검색 가능한 형태로 바꿔주는 파이프라인 엔진이라고 볼 수 있다.

Logstash는 크게 아래 3단계 구조로 동작한다.

  • Input : 데이터를 입력받음

  • Filter : 데이터를 파싱하고 변환함

  • Output : 데이터를 Elasticsearch 등 목적지로 보냄

예를 들어 앱 서버가 아래처럼 단순 텍스트 로그를 보낸다고 해보자.

user=kim age=26

Logstash는 이를 입력으로 받은 뒤, filter 단계에서 파싱 해서 아래처럼 JSON 형태로 구조화할 수 있다.

{ "user": "kim", "age": 26 }

이렇게 구조화된 데이터는 Elasticsearch에서 검색하기 훨씬 쉬워진다.
즉 Logstash는
👉 로그를 분석 가능한 형태로 바꾸는 전처리(ETL) 단계라고 볼 수 있다.

-Logstash 설정 예시

Logstash는 logstash.conf 같은 설정 파일을 코드처럼 작성해두고, 이 설정대로 파싱 및 변환 작업을 수행한다.

예시 설정은 다음과 같다.

input {
  http {
    port => 8080
  }
}

filter {
  json {
    source => "message"
  }

  mutate {
    convert => { "age" => "integer" }
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "users"
  }

  stdout { codec => rubydebug }
}

위 설정을 보면,

  • HTTP로 들어오는 요청을 받아서

  • JSON 파싱 후

  • age를 integer로 변환하고

  • Elasticsearch에 저장하는 구조이다.

그리고 중요한 점은 Logstash는 필수는 아니다.

Beats가 바로 Elasticsearch로 보내는 구조도 가능하지만,
로그가 너무 지저분하거나 여러 시스템의 로그를 하나의 형태로 통합해야 하는 경우 Logstash가 필요해진다.

즉 Logstash는 빅데이터 관점에서 보면
👉 Streaming ETL / Transform 단계라고 이해하면 된다.


▶ Elasticsearch

-elasticsearch

Elasticsearch는 전처리된 로그/데이터를 저장하면서 동시에
👉 검색 가능한 구조(index)로 만들어주는 단계이다.

즉, 단순 저장소(DB)가 아니라 검색/분석이 가능하도록 인덱스를 만들어서 저장하는 저장소 검색엔진이라고 이해하면 된다.

Elasticsearch는 데이터를 SQL 테이블 row 형태로 저장하는 것이 아니라,
JSON 형태의 Document로 저장한다.

예를 들어 아래 데이터는 Elasticsearch에서 document 한 개가 된다.

{ "user": "kim", "name": "bo", "age": 26 }

이 document는 특정 index(예: users)에 저장된다.

그리고 Elasticsearch가 단순 DB가 아니라 검색엔진이라고 불리는 이유는, 저장 과정에서 검색을 위한 구조를 만들어두기 때문이다. 대표적으로 Elasticsearch는
👉 Inverted Index(역색인) 구조를 사용한다.

이 덕분에 특정 단어가 포함된 document를 빠르게 찾을 수 있고, 검색 성능이 매우 뛰어나다.

자세한 내용은 다음 포스팅에서...

-Aggregation(집계) 기능

Elasticsearch는 단순히 검색만 하는 것이 아니라, Aggregation(집계) 기능도 제공한다.

예를 들어 다음과 같은 분석이 가능하다.

  • 특정 시간대별 로그 개수

  • status code 별 요청 수

  • 가장 많이 등장한 user top 10

  • 특정 키워드 검색 결과 집계

즉, Elasticsearch는 빅데이터 관점에서 보면
👉 저장 + 검색 + 집계 분석을 동시에 수행할 수 있는 핵심 저장소 역할을 한다.


▶ Kibana

-kibana

이전에도 설명했지만, Kibana는 Elasticsearch에 저장된 데이터를 시각화해 주는 GUI 단계이다. 즉 Kibana는 ELK Stack에서
👉 프론트엔드 역할을 한다고 보면 된다.

Kibana를 사용하면 아래와 같은 작업이 가능하다.

  • Elasticsearch index에 저장된 로그 검색

  • 필터 조건을 걸어 원하는 로그만 확인

  • 시간대별 트래픽 변화 그래프 확인

  • 대시보드(Dashboard)를 구성하여 모니터링 화면 제작

즉 Kibana는 단순히 데이터를 보여주는 툴이 아니라,
운영 환경에서 로그 분석과 모니터링을 할 수 있도록 도와주는 도구이다.


▶ ELK Stack 전체 과정 정리

전체 흐름을 정리하면 다음과 같다.

  1. 서버에서 로그/metric 데이터가 생성됨

  2. Beats가 해당 데이터를 수집해서 전송함

  3. Logstash가 있다면 데이터를 파싱/변환/정제함

  4. Elasticsearch가 데이터를 저장하고 검색 가능한 구조로 인덱싱함

  5. Kibana가 Elasticsearch 데이터를 시각화하여 보여줌

EndFragment

More from this blog

[Elasticsearch] Elasticsearch 기본용어와 CRUD 명령어

-elastic ▶ 들어가며 이번 글에서는 Elasticsearch를 공부하면서 가장 먼저 익혀야 하는 기본 용어를 정리하고,직접 코드를 쳐가며 CRUD(Create / Read / Update / Delete) 명령어에 익숙해지는 시간을 가져보려고 한다. Elasticsearch는 처음 보면 생소한 용어가 많아서 막막할 수 있는데,사실 구조적으로는 우리가 익숙한 MySQL과 닮은 부분이 굉장히 많다. 둘 다 데이터베이스라는 큰 틀 안에서 데...

Feb 17, 20264 min read

Jpa N+1 문제, 우리는 이렇게 잡았다 — 1:1 문의 Api 실전 최적화기

코드 리뷰 한 줄에서 시작된 쿼리 최적화 여정 1. 시작 — "일단 돌아가게 만들자" Finders 프로젝트에서 1:1 문의(Inquiry) API를 맡았다. 현상소에 문의를 남기고, 답변을 받고, 목록을 조회하는 — 평범한 CRUD다. "JPA 쓰면 쿼리 안 짜도 되는 거 아니야?" 솔직히 처음엔 그렇게 생각했다. JpaRepository에 findAll, findById 쓰면 끝이니까. // 첫 번째 버전의 목록 조회 (QueryDS...

Feb 11, 20268 min read

[모니터링] Sentry 도입부터 Discord 에러 알림까지 — 서버 감시 시스템 구축기

"서버 죽었는데 아무도 몰랐다"에서 "에러나면 1분 안에 안다"까지 1. 모니터링을 시작한 계기 프론트엔드: "API 안 되는데요?"백엔드: "엥? 언제부터요?"프론트엔드: "...2시간 전부터요?"백엔드: 😱 어느 날 서버가 죽어있었는데 아무도 몰랐다. 그날 이후, 모니터링 시스템 구축을 결심했다. (Issue #102) 2. 모니터링 도구 비교: 뭘 쓸까? 처음에는 여러 도구를 비교했다. 도구무료 티어장점단점 Sent...

Feb 11, 20268 min read

[CI/CD] 수동 태그에서 자동 릴리즈까지 — Git Flow와 Auto Release

🚀 우리 auto-release.yml 바로 보러가기 → 이 글에서 설명하는 워크플로우의 전체 코드를 바로 확인할 수 있다! main에 머지만 하면 버전 태그부터 릴리즈 노트까지 알아서 생긴다 1. 우리의 Git 전략: Git Flow (경량 버전) Finders 프로젝트는 Git Flow 전략을 사용하고 있다. 다만 hotfix나 release 브랜치 없이, 조금 가볍게 운영한다. main ← 운영 서버 (prod) 배포 브...

Feb 11, 20265 min read

[ci/cd] 대학생 팀의 배포 파이프라인 진화기

PR 하나면 끝나는 무중단 배포까지, 삽질의 기록 1. 시작은 단순했다 "서버에 올려야 하는데... 어떻게 하지?" Finders 프로젝트를 시작했을 때, 배포라는 걸 해본 적이 없었다. 그래서 처음에는 이렇게 했다. 1. SSH로 서버 접속 2. git pull 3. ./gradlew build 4. java -jar app.jar 당연히 문제가 생겼다. 빌드하는 동안 서버가 꺼져있음 (프론트: "API 왜 안 돼요?" 🔥) 빌...

Feb 11, 20267 min read
F

Finders Tech Blog

16 posts

[Elasticsearch] ELK stack에 관하여