[Elasticsearch] ELK stack에 관하여

-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 전체 과정 정리
전체 흐름을 정리하면 다음과 같다.
서버에서 로그/metric 데이터가 생성됨
Beats가 해당 데이터를 수집해서 전송함
Logstash가 있다면 데이터를 파싱/변환/정제함
Elasticsearch가 데이터를 저장하고 검색 가능한 구조로 인덱싱함
Kibana가 Elasticsearch 데이터를 시각화하여 보여줌

EndFragment