Hello World

Docker와 ELK Stack으로 로그 분석하기 본문

Back-End/좋은글

Docker와 ELK Stack으로 로그 분석하기

EnterKey 2016. 1. 10. 12:48
반응형

서비스를 운영하면서 로그의 중요성은 몇 번을 강조해도 모자람이 없습니다. 장애가 났거나 CS처리를 위해 또는 개발을 진행하면서Debugging을 위해 하루에도 몇 번 또는 수십번씩 여러 대의 서버에 남겨진 로그를 찾아가며 분석을 진행합니다.

 

하지만 여러 대의 서버에 기록된 로그를 한꺼번에 분석하는 것은 쉬운 일이 아닙니다분산된 로그를 가져와서 shell을 이용 pipeawk, grep등을 이용해서 분석을 진행하는 것은 번거롭기도 하지만때로는 짜증이 날 때도 있습니다.

 

예를 들어, Web 서버가 2대가 있고 이 2대의 서버가 Loadbalancing되어 로그를 남긴다고 했을 때, 다음과 같이 처리할 수 있을 것입니다.

  1. Web 서버 1에 접속해서 로그를 확인하고 없으면 Web 서버 2에 접속해서 로그를 확인
  2. Web 서버 1과 2의 로그를 별도의 저장소에 이름을 달리하여 저장하고 로그를 확인

  

이 때 awk, sed, grep 등을 이용해서 별도의 script를 작성한다면 조금 더 편하지겠지만…. 그래도 불편한 것은 사실입니다.

 

그러나더 이상 힘들게 script를 작성할 필요 없이 UI를 제공해서 쉽게 분석할 수 있도록 도와주는 멋진 녀석들이 등장했습니다.

그 중 대표적인 것이 splunk와 ELK(Elastic Search, Logstash, Kibana)입니다. 


하지만 splunk 아주 좋은 성능을 보여주지만 아주 비싼 몸값을 자랑합니다.(데이터양에 따라 가격이 결정되기에... 대량 구매 할인도 있고, 월 단위 서비스 방식으로 하면 싸다고 하지만...???) 그에 반해 ELK는 open source 이며 예쁜 모습과 좋은 성능을 가지고 있습니다.(Marvel 등의 Plugin은 돈 주고 사야되지만 말이죠.)





1. ELK 소개

그럼 이제 ELK에 대해 간단하게 알아보도록 하겠습니다.

ELK Elastic Search, Logstash, Kibana 이렇게 3개가 모여서 전체를 이루며 앞글자를 따서 ELK라고 부릅니다.

 

(참고로, Logstash Kibana는 2013년까지 다른 개발자들에 의해 개발되었으며, 2013년 관련 개발자들이 Elaticsearch로 합류했습니다그리고 올해 초 Elastic으로 사명을 바꾸고 ELK에 집중하겠다고 밝혔습니다.)


그림1. ELK 데이터 흐름도

 


ELK는 위의 그림처럼 동작합니다. Log가 저장소에 남겨지면 Logstash가 해당 Log를 Elasticsearch로 보내서 Indexing 처리를 하면Kibana가 예쁘게 보여줍니다.(이 때 데이터 이동에 따른 변환은 약간의 설정으로 알아서 처리합니다.)

 

각각에 대해 간단하게 알아보면,

  1. ElasticSearchApache Lucene을 바탕으로 개발한 분산 검색엔진으로 비정형(schema-less) 데이터를 쉽게 저장하고 처리할 수 있으며실시간 검색과 플러그인을 이용한 확장을 지원하는 등의 장점을 가지고 있습니다또한 인덱스 갱신 주기도 빠른 편이며운영중 스키마 변경이 가능합니다.
  2. Logstash는 하나 또는 여러 개의 입력값(streams)을 간단하게 우리가 원하는 데이터로 변경해 주는 ETL(for Extract, Transform, Load)이라고 생각하면 됩니다설정은 JSON 형태로 input, filter, output만 선언해 주면 되며, input의 형태는file이나 S3 bucket(Amazon AWS), RabbitMQ, redis등을 지원합니다.
  3. Kibana web-based data 분석 및 dashboard tool을 제공하며, ElasticSearch의 결과를 수 초내에 보여주는 역할을 담당합니다.

 




2. Docker를 활용한 ELK 구축하기

그럼 이제 ELK를 구축하고, 로그를 분석하는 방법에 대해 얘기를 해보겠습니다.

Elastic Search를 설치하고 Logstash를 설치하고 Kibana를 설치를 Docker를 이용해보겠습니다. (참고로, Docker는 2013년에 등장요즘 핫한 컨테이너 기반 가상화 도구입니다. 설치는 Mac OS X Yosemite 10.10.4에서 진행했음을 알려드립니다.)


1) Docker 설치하기

https://github.com/boot2docker/osx-installer/releases/latest 에서 package를 다운로드 한 뒤 설치하면 완료됩니다.


2) Docker 위에 ELK 설치하기

// docker 실행
# $> boot2docker up
// docker connect
# $> boot2docker ssh
 
## search elk
docker@boot2docker:~$> docker search elk
## docker elk image pull
docker@boot2docker:~$> docker pull sebp/elk
## docker elk container run
docker@boot2docker:~$> docker run -5601:5601 -9200:9200 -5000:5000 -it --name elk sebp/elk
## 생성된 elk container connect
docker@boot2docker:~$> docker exec -it elk /bin/bash



* 설치 관련 참고 자료 https://registry.hub.docker.com/u/sebp/elk/

(sebp/elk에는ubuntu 14.04와 ELK 최신 버전이 적용되어 있습니다.)




그림2. sebp/elk 구조


 

이렇게 간단하게 ELK의 설치가 끝났습니다이제 이 ELK를 이용 Nginx의 로그를 분석해보기로 하겠습니다.





3. ELK로 nginx Log 분석하기

이미 생성된 ELK 내에서 로그를 처리해도 되지만, 다른 서버에서 생성된 로그를 전달해서 처리할 수 있도록 nginx와 logstash-forwarder를 설치하겠습니다.


 

## docker ubnutu image pull
docker@boot2docker:~$> docker pull ubuntu:latest
## docker ubnutu image run
docker@boot2docker:~$> docker run -80:80 -it —link  elk:elk --name nginx Ubuntu
## docker ubnutu image connect
docker@boot2docker:~$> docker exec –it nginx /bin/bash
## nginx install
root@sdbfdsb:/# apt-get install nginx
## logstash-forwarder install
root@sdbfdsb:/# echo "deb http://packages.elastic.co/logstashforwarder/debian stable main" 
| tee -/etc/apt/sources.list
root@sdbfdsb:/# apt-get update
root@sdbfdsb:/# apt-get install logstash-forwarder
 


설치가 끝났으면 /etc/logstash-forwarder.conf를 수정하고 재시작합니다.

(참고 : https://github.com/elastic/logstash-forwarder)

 

 

이제 kibana로 접속(http://192.168.59.103:5601) 하면 다음 그림과 같이 nginx log를 확인할 수 있습니다.


그림3. kibana 실행 화면

 

 

간단하게 ELK 설치 및 nginx Log를 분석하는 것에 대해 알아보았습니다.


이외에도 Logstash GROK Pattern은 약 120가지의 Pattern(https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns)을 미리 제공해고 있으므로, nginx만이 아닌 다른 여러 가지 형태의 비정형 데이터를 처리할 수 있습니다


또한 geoip를 사용할 경우 어느 지역에서 얼마나 많은 트래픽이 발생할 수 있는지 알 수 있는 기능도 제공하고 있습니다.



그림4. geoip를 이용 kibana에서 지역별 traffic 현황


 

마지막으로, Elasticsearch도 인덱스 및 샤드도큐먼트 관리를 위한 많은 Plugin을 제공하고 있습니다.





마치며

지금까지 ELK를 이용 Log 분석을 할 수 있는 시스템을 쉽고 빠르게 구축해서 nginx의 Log를 간단하게 분석해 보았습니다티몬의 서비스가 계속해서 성장해서 더 많은 로그를 쉽고 빠르게 분석하고 이런 사례들을 개발자 컨퍼런스등에서 발표할 날이 빨리 왔으면 좋겠습니다여러분들도 이제 개발하면서 많은 데이터를 간단하게 분석할 일이 있으시다면 ELK를 한 번 써보시는 것은 어떨까요?

 

고맙습니다.



| 참고자료 :

* ELK Splunk 비교 : http://riskfocus.com/splunk-vs-elk-part-1-cost/

* ELK 관련 : elastic : https://www.elastic.co/

* ELK 설치하기

  1. https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4-on-ubuntu-14-04
  2. http://blog.embian.com/18
  3. https://www.elastic.co/guide/en/elasticsearch/reference/1.6/modules-plugins.html#modules-plugins
  4. https://registry.hub.docker.com/u/sebp/elk/

 

* Elastic Search Plugin

1) head는 인덱스와 샤드, 도큐먼트에 대한 관리, 상태를 점검합니다.


<head plugin 실행화면>

 


2) bigdesk는 서버와 검색엔진의 상태, 자원 현황을 실시간 모니터링합니다.


<bigdesk plugin 실행화면>


 

3) HQ는 head와 bigdesk의 기능이 합쳐진 형태로 화면 구성과 기능 사용성이 개선되었습니다.



<HQ plugin 실행화면>




| 출처 :

그림1. http://raulcd.com/elasticsearch-logstash-and-kibana-on-docker.html

그림2. https://registry.hub.docker.com/u/sebp/elk/

그림4. https://beingasysadmin.wordpress.com/2014/04/07/near-realtime-dashboard-with-kibana-and-elasticsearch/





반응형
Comments