EFK
Last updated
Last updated
각 마이크로서비스는 독립적인 물리적 장비나 가상머신에서 운영된다. 만약 각자의 로컬 파일 시스템에 로그를 남긴다면 여러 서비스에 걸쳐서 발생하는 트랜잭션의 흐름을 처음부터 끝까지 연결해가며 이해하는 것이 매우 어렵고 서비스 수준에서 로그를 통합하고 집계하는 것은 거의 불가능하다.
위와 같은 문제들을 해결하려면 로그의 출처와 관계없이 모든 로그를 중앙 집중적으로 저장하고 분석해야 한다. 이를 위해선 로그의 저장과 처리를 서비스 실행 환경에서 떼어 내야 한다. 각 서비스에서 발생한 로그들은 한곳에 모아진 후 중앙의 빅데이터 저장소로 보내지고, 빅데이터 솔루션을 이용해 로그를 분석하고 처리한다.
로그 스트림(log stream) : 로그 생성자가 만들어내는 로그 메시지의 스트림. (일반적인 자바 기반 시스템에서 Log4j 로그스트림)
로그 적재기(log shipper) : 메시지를 데이터베이스에 쓰거나, 대시보드에 푸시, 스트림 처리 종단점으로 보내는 등 여러 다른 종단점으로 메세지를 전송
ex) Logstash, Fluentd
로그 저장소(log store) : 로그 메시지 저장을 위한 대용량 데이터 저장소
ex) HDFS, Elasticsearch, NoSQL
로그 대시보드 : 로그 분석 결과를 시각화.
ex) Kibana, Graphite
로그 적재기 : 가장 많이 사용되는 Logstash나 Fluentd는 로그 파일을 수집하고 적재하는 데 사용할 수 있는 강력한 데이터 파이프라인 도구이다. 서로 다른 소스에서 스트리밍 데이터를 받아 다른 대상과 동기화하는 매커니즘을 제공하는 브로커 역할을 한다. 참고: comparing fluentd and logstash
각 서비스에 있는 Fluentd에서 저장소로 바로 전달하지 않고 중간에 Fluentd를 넣는 이유는 Fluentd가 앞에서 들어오는 로그들을 수집하고 저장소에 넣기 전 트래픽을 Throttling해서 로그 저장소의 용량에 맞게 트래픽을 조정 할 수 있다. 또는 로그의 종류에 따라서 각각 다른 로그 저장소로 라우팅하거나 여러개의 저장소에 저장할 수 있다.
로그 저장소 : 실시간 로그 메시지는 일반적으로 Elasticsearch에 저장된다. Elasticsearch를 사용하면 클라이언트가 텍스트 기반 인덱스를 바탕으로 쿼리할 수 있다. 이 외에도 HDFS는 일반적으로 아카이브된 로그 메시지를 저장하는 데 사용된다. MongoDB나 Cassandra는 매월 집계되는 트랜잭션 수와 같은 요약 데이터를 저장하는데 사용된다.
대시보드 : 로그 분석을 위해 가장 일반적으로 사용되는 대시보드는 Elasticsearch 데이터 스토어를 기반으로 사용되는 Kibana(키바나)가 있다. Graphite(그래파이트) 및 Grafana(Grafana)도 로그 분석 보고서를 표시하는데 사용된다.
Kibana Dashboard
전체 EFK 스택을 구성하기 전 간단한 Fluentd 사용 방법 및 로그파일 입출력을 테스트 해봅니다.
Fluentd 설치 및 테스트
./fluentd 폴더에 fluentd.conf 파일 추가
docker를 이용한 설치 및 구동
테스트
2017-01-30 14:04:37 +0000 sample.test: {"json":"message"}
Spring Boot 어플리케이션 로그 수집 테스트
Spring Boot 어플리케이션에 logback-spring.xml 추가 (/src/main/resources/)
fluentd.conf 설정
docker 컨테이너 재시작
테스트 결과
도커를 이용하여 전체 EFK 스택을 구성해 봅니다.
로그 파일 경로 지정을 위해 application.yml에 경로 추가
docker-compose를 이용하여 4개의 컨테이너를 실행시킨다.
fluent-client : 서비스의 로그파일을 읽어 중앙에 있는 fluentd-aggregator에게 전송한다.
fluent-aggregator : 각 fluent-client로부터 전달 된 로그들을 elasticsearch로 포워딩한다.
elasticsearch : 로그 저장소
kibana : elasticsearch에 저장돼 있는 로그들을 시각화한다.
실행을 위한 로컬 파일 목록
a. ./docker-compose.yml 작성
b. fluentd-client 도커파일 및 fluentd config 파일 생성
도커파일 생성
grok-parser : 로그파일을 항목별로 파싱하기 위한 라이브러리 (fluent.conf의 parser 영역에 패턴을 지정한다)
fluentd config 파일 생성
source : log파일을 읽어와(@type tail) grok을 통해 파싱한다(@type multiline_grok).
match : source에서 읽어온 데이터를 fluentd-aggregator에 포워딩한다(@type forward).
c. fluentd-aggregator 도커파일 및 fluentd config 파일 생성 도커파일 생성
fluent-plugin-elasticsearch : elasticsearch로 전송하기 위한 라이브러리
fluentd config 파일 생성
source : fluentd-client에서 포워딩한 데이터
match : source에서 읽어온 데이터를 elasticsearch로 전송한다(@type elasticsearch).
localhost:5601로 접속하여 kibana 작동 확인
a. Index Pattern 설정
index pattern : elasticsearch 인덱스 패턴
Time Filter field name : Time 필드가 있을 경우 설정
Selected Field와 Available Field를 Add/Remove 하여 컬럼에 노출될 데이터 및 순서를 변경할 수 있다.
커스텀 로깅 솔루션을 구축할 때 가장 많이 쓰이는 컴포넌트의 조합은 ELK(Elasticsearch, Logstash, Kibana) 또는 EFK(Elasticsearch, Fluentd, Kibana) 스택이다.
1. order-service 2. fluentd for each service 3. fluentd for aggregator 4. elasticsearch 5. kibana
정상 작동 시 아래와 같이 4개의 컨테이너가 구동된다.
b. 로그 확인