개요
최근 운영 중인 리눅스 서버들을 모니터링 하기 위해서 Prometheus와 Grafana를 통해 각 서버들의 메트릭을 수집하고 시각화를 해봤었다.
(Prometheus의 node-exporter로 서버 모니터링하기)
이번에는 각 서버들의 로그 수집을 위해 Elastic Stack(elastic search + logstash + kibana) + Filebeat로 로그 관리 시스템을 구축해보려고 한다.
로그 서버를 구축하는 이유는 다음과 같다.
- 각 서버들로부터 수집한 로그를 분석해 서버에 오류나 문제가 발생한 것이 있는지
- 더 견고한 운영 환경을 만들기 위해
ELK Stack ?
ELK
는 분석 및 저장 기능을 담당하는 ElasticSearch
,
수집 기능을 하는 Logstash
,
이를 시각화하는 도구인 Kibana
의 앞 글자만 딴 단어이다.
- Elasticsearch: JSON 기반의 분산현 오픈소스 검색 및 분석 엔진.
- Logstash를 통해 수신된 데이터를 저장소에 저장하는 역할을 담당.
- 데이터를 중심부에 저장하여 예상되는 항목을 검색하고 예상치 못한 항목을 밝혀낼 수 있음.
- Logstash: 여러 소스에서 동시에 데이터를 수집하여 변환하고, Elasticsearch와 같은 "stash"로 전송하는 서버사이드 데이터 처리 파이프라인을 의미함.
- 수집할 로그를 선정해서 지정된 대상 서버(ElasticSearch)에 인덱싱하여 전송하는 역할을 담당함.
- Kibana: Elasticsearch에서 색인된 데이터를 검색하여 시각화하며, 막대 차트, 원형 차트, 표, 히스토그램, 지도 등을 생성하여 데이터를 분석할 수 있도록 해줌.
그리고 약자(ELK
)에는 없지만 ELK 스택을 구현하기 위해서는 Beats
라는 도구도 필요하다.
Beats
는 단일 목적의 데이터 수집기인 오픈 소스 플랫폼이다.
- Filebeat
- 경량화된 설계로 작동. 시스템 자원을 적게 사용하여 데이터를 수집하므로 성능상의 이점 존재
- 수집한 로그 데이터를 Elasticsearch 또는 Logstash와 같은 저장소로 실시간 전송함.
- 중앙 집중화된 로그 시스템에서 로그 데이터를 효과적으로 처리할 수 있는 장점이 있음
ELK 아키텍처 및 흐름
출처: guru99.com
ELK 다음과 같은 흐름을 가진다.
- 1. 데이터 원천에 beats가 붙어서 데이터를 수집함.
- 2. beats가 수집한 데이터를 logstash에서 적절하게 처리한 뒤 ES로 전송함.
- Ex. GMT 형식의 timestamp 값을 KST로 변환하는 등.
- 3. ES는 이 데이터를 인덱싱하여 저장함.
- 4. ES와 연결된 Kibana UI에서 해당 데이터 조회 가능.
그렇다면 ELK는 어떤 환경에서 사용해야 적합한가?
MSA 기반 애플리케이션에서 발생하는 로그 관리용
MSA에는 여러 대의 분산된 마이크로 서버가 돌아가고 있기 때문에,
한 서버에서 장애가 발생할 경우 다른 마이크로 서비스로 장애가 쉽게 전파된다.
이 에러가 다시 다른 마이크로 서비스로 전파되고, 또 전파되고 ..
이렇게 되면 에러가 어디서, 왜 발생했는지 추적하기가 어려워진다.
그래서 이러한 에러 추적 및 모니터링을 위해 각 마이크로 서버의 로그를 한데(중앙집중) 모아서 관리해야 할 환경이라면
ELK 스택을 도입하는 걸 적극적으로 고민해봐야 한다.
일반적인 로그 관리용
MSA가 아닌 모놀레틱 아키텍쳐 시스템에서라도 기본적인 로그 데이터를 수집하기 위해 ELK 스택을 사용해볼 수 있다.
마찬가지로 시스템에서 발생하는 로그를 저장해 추후 에러 발생 시 관련된 에러 로그를 쉽게 추적할 수 있으니까.
또한 슬랙과 같은 서드파티 툴과 함께 사용되어서 알림을 동반한 모니터링도 가능하다.
하지만 관리해야하는 서버 대수가 많지 않은 환경에서는 ELK 스택을 도입하는 것은 오버 스펙이 아닐까하는 생각이 든다.
쉘 스크립트를 사용해서 서버 로그를 남기거나,
에러 발생에 대한 경우에는 슬랙이나 텔레그램과 같은 메신저가 제공하는 API를 사용해서
프로그램 내에 알림 기능을 구현하는게 가능하기 때문이다.
시스템 아키텍처
아래 사진은 이번 실습에서 어떠한 구조로 ELK 스택이 구축되고,
어떠한 흐름으로 진행되는지 정리해본 구성도라고 보면 될 것 같다.
아키텍처 구조는 다음과 같다.
- 로그 파일들을 Filebeat에서 읽어와 logstash로 전송
- logstash는 수집한 로그를 필터링해 Elasticsearch로 전송
- kibana에서 이를 시각화 처리
ELK Stack 구축하기
1. Docker로 ELK 띄우기
소스코드 clone
아래 명령을 실행해 해당 레포지토리를 clone 해주자.
git clone https://github.com/deviantony/docker-elk
이제 현재 경로에 docker-elk
라는 디렉토리가 생성 되었을거다. 해당 경로로 이동해주자.
cd docker-elk
1-1. 환경변수 설정
.env
파일을 열어서
ELASTIC_PASSWORD
LOGSTASH_INTERNAL_PASSWORD
KIBANA_SYSTEM_PASSWORD
위 환경 변수의 값을 수정해주자.(초기값: changeme
)
1-2. Elasticsearch 설정 업데이트
elasticsearch/config/elasticsearch.yml
파일을 아래와 같이 수정
---
cluster.name: docker-cluster
network.host: 0.0.0.0
xpack.security.enabled: false
1-3. Kibana 설정 업데이트
kibana/config/kibana.yml
파일의 33번째줄부터 마지막 줄(xpack
관련) 모두 삭제 또는 주석
1-4. Logstash 설정 업데이트
logstash/pipeline/logstash.conf
파일을 아래와 같이 수정
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => "http://elasticsearch:9200"
user => "elastic"
password => "${LOGSTASH_INTERNAL_PASSWORD}"
index => "logstash-%{+YYYY.MM.dd}"
}
}
1-5. 컨테이너 실행
docker-compose up -d --build
docker-compose up setup
2. Filebeat 설정
2-1. 설치
- debian 계열 기준
- https://www.elastic.co/kr/downloads/beats/filebeat
1. Download and install the Public Signing Key
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg
2. You may need to install the apt-transport-https
package on Debian before proceeding
sudo apt-get install apt-transport-https
3. Save the repository definition to /etc/apt/sources.list.d/elastic-8.x.list
echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
4. Run apt-get update
, and the repository is ready for use. For example, you can install Filebeat by running
sudo apt-get update && sudo apt-get install filebeat
5. To configure Filebeat to start automatically during boot, run
sudo systemctl enable filebeat
2-2. 설정 업데이트
/etc/filebeat/filebeat.yml
파일을 아래와 같이 수정
filebeat.inputs:
- type: log
paths:
- {각자 환경에 맞는 로그 경로}/*.log
output.logstash:
hosts: ["<logstash 서버 IP>:5044"]
2-3. filebeat 실행
sudo filebeat -e -c /etc/filebeat/filebeat.yml -d "publish"
3. 로그 확인
3-1. kibana 접속
http://<kibana_서버IP>:5601
접속
3-2. index 설정
Management -> Stack Management 접속
kibana -> Data view 접속
Create data view 설정
위에서 설정
1-4 Logstash 설정 업데이트에서 설정했던 것처럼
logstash-날짜형식
으로 데이터가 잡히고 있음.
해당 인덱스가 잡히도록 패턴을 logstash-*
으로 설정해주었음.
3-3. 로그 확인하기
Analytics의 Discover 접속
날짜 등의 필터를 걸어서 로그를 확인할 수 있게 되었다!