담당하고 있는 서비스의 서버 운영환경에 로깅 및 모니터링 시스템이 미비되어 있어 서버 운영에 많은 불편함을 겪었습니다. ELK Stack 도입을 통해 직접 해당 시스템을 구축하게 되어 ELK에 대한 간단한 소개와 함께 그 방법을 글로 남깁니다.
ELK Stack은 ElasticSearch이라는 오픈소스 검색엔진을 중심으로 구성된 로그 관리 솔루션입니다. 높은 성능 및 확장성으로 로그 수집 및 검색 외에도 서버 상태 모니터링이나 이상 징후 탐색 등의 많은 분야에서 사용되고 있습니다.
모니터링 시스템에 있어 Prometheus와 Grafana의 조합 등 많은 선택지가 존재하지만, 매트릭스 모니터링 이외에도, 로그 데이터를 여러 형태로 가공하여 응용하는 것 또한 목표에 있었기에 ELK Stack을 선택하게 되었습니다.
ELK Stack의 중심이자 핵심이 되는 분산형 검색 엔진, ElasticSearch(이하 ELS)입니다. 데이터의 “역 인덱스” 구조화를 통해 매우 빠른 데이터 검색이 가능합니다. 오픈소스(주로 Apache 2.0 라이센스)로 무료로 사용이 가능하고, 대규모 분산 시스템 환경에서도 그 성능이 입증되어 많은 사랑을 받고 있습니다.
*역 인덱스(Inverted Index)란?
데이터를 전처리 과정을 통해, 마치 책에 있는 색인 페이지처럼, 단어를 기준으로 해당 단어를 포함하고 있는 문서의 위치를 저장해 놓는 자료구조를 뜻합니다. 전처리 과정이 필요하지만, 모든 문서를 차례대로 찾아가며 단어의 포함 여부를 판단하는 방식보다 데이터 검색 시, 훨씬 더 뛰어난 성능을 제공할 수 있습니다.
위와 같은 자료구조에선 특정 단어를 포함하는 문장을 탐색하려면, 모든 문장을 차례로 탐색해 가며 단어의 포함 여부를 확인해야 합니다.
역 인덱스 자료구조로 저장한 경우, 원하는 단어를 포함한 문장들을 즉시 찾아낼 수 있습니다.
LogStash는 다양한 데이터 소스로부터 데이터를 수집하여 가공, 전송을 책임지는 ‘데이터 처리 파이프라인’입니다. ELS 내의 기능으로도 데이터의 변환과 가공이 가능하지만, 강력한 기능과 다양한 전문 플러그인 등을 통한 확장성으로 데이터 파이프라인을 전담하여 ELK 시스템의 부하를 분산하고 안정성을 높입니다. 특히, ‘백 프레셔’ 기능을 통해 데이터 전송 흐름을 관리합니다.
*백 프레셔(back-pressure)
백 프레셔는 데이터 소비자(LogStash)가 데이터 생산자(Beats, Kafka 등)에게 데이터 전송속도를 조절하도록 피드백을 주어 그 속도를 제어하는 기법을 말합니다. LogStash는 ELS의 데이터 처리 현황이나 네트워크 연결 상태 등을 확인하여 데이터 생산자들의 데이터 전송 속도를 조절하거나, ELS로 향하는 데이터를 LogStash 내부에 잠시 저장해 놓는 등의 방식으로 데이터 처리의 안정성과 성능을 보장합니다.
ELK Stack에서 데이터 시각화 및 ELS GUI 환경을 담당하는 Kibana입니다. 다양한 플러그인을 통해 유연한 확장이 가능하고, 기본으로 제공해 주는 앱만으로도 ELS 사용을 한껏 쉽게 해줍니다. 특히, Beat의 Kibana 대시보드 구성 기능을 사용하면, Beat가 수집하는 데이터에 특화된 대시보드 템플릿도 기본으로 제공되어, 많은 수고를 들이지 않고 서버 모니터링 환경을 구성할 수 있습니다.
Beat는 경량 데이터 수집기입니다. 시스템의 자원을 많이 사용하지 않으면서 효율적인 데이터를 수집할 수 있도록 구성되었습니다. 무엇보다도, 다양한 데이터에 특화된 여러 종류의 Beat들이 제공되고 있어, 간단한 설치만으로도 서버 운영과 모니터링에 필수적인 데이터를 편하게 수집할 수 있습니다. 각 Beat 별로 기본적인 Kibana 대시보드 또한 제공하기 때문에 GUI 구성도 간편하게 할 수 있습니다.
[설치]
ELK Stack 구성요소 설치는 패키지 매니저를 통해 설치하거나, 설치 페이지에 직접 방문하여 binary 실행파일을 직접 다운받아 설치할 수 있습니다. 이번 포스팅에서 저는 binary 실행파일을 직접 다운받아 설치하였습니다.
https://www.elastic.co/kr/downloads/elasticsearch
이번 포스팅에서는 아래의 그림과 같이, 단일 인스턴스에서 간단한 구성으로 실습을 진행합니다.
(*ELS의 클러스터 구성을 통해, ELS 시스템의 부하를 조절하고 높은 가용성을 달성할 수 있지만, 이번 포스팅에선 다루지 않습니다. 이후 관련 포스팅에서 뵙겠습니다.)
ELS
설정
ELS의 주요 설정 파일은 elasticsearch.yml
파일과 jvm.options
가 있습니다. 이번 실습에서는 기본 설정만 사용하여도 문제가 없습니다. (elasticsearch.yml
파일은 주로 ELS 클러스터 구성에 사용되는 설정 파일입니다.) 아래의 ‘X-Pack’ 관련 설정만 disable 해주시면 됩니다.
*X-Pack이란?
X-Pack은 ELS, LogStash, Kibana에 대한 추가 기능을 제공하는 확장 팩입니다. 이전 버전에서는 기본 사항이 아니었지만, 6.3 버전부터 기본 사항으로 포함되기 시작했습니다. 주로 보안, 이상 탐지, 기계 학습 등의 기능을 제공합니다.
실행
각자의 설치 방법에 맞는 실행 방법으로 ELS를 실행하셨으면, 아래의 명령어로 health-check를 진행할 수 있습니다. (저는 직접 바이너리 파일을 설치했기 때문에, nohup
명령어로 바이너리 파일을 실행해 주었습니다.)
LogStash
설정
pipelines.yml
파일에 아래의 내용을 추가해줍니다. - pipeline.id: beats-pipeline
path.config: "./config/beats.conf"
beats.conf
파일을 추가하고, 아래의 내용을 추가해줍니다. input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "metricbeat-%{+YYYY.MM.dd}"
}
}
Kibana
*이번 실습에선 Kibana의 별다른 설정이 필요하지 않습니다.
MetricBeat
설정
metricbeat.yml
파일의 output 설정을, 기본 값인 output.elasticsearch
로 연결해둔 상태에서 아래의 명령어를 실행합니다. ./metricbeat setup -e
metricbeat.yml
파일에서, output.elasticsearch
관련 옵션을 주석 처리 해주시고, output 설정을 logstash로 변경해줍니다.위의 모든 설정을 마치고, 브라우저에 Kibana client 접속 주소인 localhost:5601 를 입력해 주시면 Kibana GUI 환경을 확인할 수 있습니다.
ELK를 처음 사용하시는 분들은 Analyrics/Discover
탭의 검색창과, Management/Dev Tools
를 통한 ELS 쿼리 요청으로 시작하시면 좋습니다.
이 글이 누군가에게 도움이 되길 바라며, 잘못된 부분이나 보충해야 할 부분이 있다면 댓글로 가감 없는 피드백 남겨주시면 감사하겠습니다.