티스토리 뷰


ELKR (ElasticSearch + Logstash + Kibana + Redis) 를 이용한 로그분석 환경 구축하기

큰 서비스들을 운영하는 회사들은 자체적인 로그 수집, 정제, 분석 솔루션들을 가지고 있거나 자체적으로 대용량 ES Cluster, Hadoop Cluster 등을 운영합니다.

하지만 초기 스타트업은 한치앞을 내다 볼 수 없기때문에 최소 비용으로 최대의 효과를 낼 수 있는 여러 오픈소스들을 조합하여 잘 사용해야 합니다.

초기에 크지 않은 비용으로 간단하게 로그분석 환경구축을 하고, 이후 서비스가 성장하면서 시스템이 커질 경우 비교적 용이하게 Scale Out 해 나갈 수 있는 ElasticSearchRedis를 이용해서 로그 분석 시스템을 구성하는 방법을 소개합니다.

이 포스팅은 ElasticSearchRedis, Logstash, Kibana등에 경험이 많지않은 개발자를 대상으로 설치, 및 설정, 실제 실무에서의 적용 방법등을 간략하게 소개하는 글입니다.

구성은 다음과 같습니다.


로그 데이터의 흐름은 다음과 같습니다.

  1. 1Nginx 는 각각의 물리적인 3대의 서버에서 구동된다고 가정합니다.
  2. 2각 서버에는Nginx의 로그를 수집하기 위한 Logstash가 동작합니다.
  3. 3다량의 로그가 빠르게 쌓일 경우를 대비해 Redis를 중간데이터 수집 Queue로 사용 합니다.
  4. 4Redis에 쌓인 로그들을 ElasticSearch에 적재하는 Indexer Logstash가 동작하면서 Redis로그를 ElasticSearch로 적재합니다.
  5. 5적재된 로그들은 Kibana와 SQL 플러그인 등으로 Visualization & 분석 할 수 있습니다.

2015–12–10일 기준 최신 버전들로 설치했습니다.

  • ElasticSearch : 2.1.0
  • Logstash : 2.1.0
  • Kibana : 4.3.0
  • Redis 3.0.5

1. ElasticSearch 설치

# wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/zip/elasticsearch/2.1.0/elasticsearch-2.1.0.zip
# unzip elasticsearch-2.1.0.zip
# cd elasticsearch-2.1.0/bin
# ./elasticsearch
Standalone 설치는 매우 간단합니다.
정상적으로 실행 된 상황이라면 http://localhost:9200 으로 접속 했을 때 간단한 health 정보가 표시됩니다.
2.ElasticSearch 플러그인 설치
ES에는 아주 훌륭한 플러그인들이 많이 있는데, 저는 주로 2가지를 필수로 설치합니다.
ElasticHQ : https://github.com/royrusso/elasticsearch-HQ
기존에 Head라는 플러그인을 썼는데 UI가 조금 마음에 들지 않아서 다른 것을 찾던중 깔끔한 UI에 Head보다 좀더 자세한 정보들을 보여주고 있는 HQ를 Head대신 최근에는 쓰고 있습니다.


ElasticSQL : https://github.com/NLPchina/elasticsearch-sql
ES내에 있는 JSON Document를 SQL로 검색 할 수 있는 플러그인 입니다. SQL에 익숙한 개발자가 대부분이다보니 매우 쉽고 간편하게 SQL을 이용해 ES 데이터를 분석 할 수 있습니다.


# ./bin/plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/2.1.0/elasticsearch-sql-2.1.0.zip
# ./bin/plugin install royrusso/elasticsearch-HQ
3.Kibana 설치
# wget https://download.elastic.co/kibana/kibana/kibana-4.3.0-linux-x64.tar.gz
# tar xvfz kibana-4.3.0-linux-x64.tar.gz
# cd kibana-4.3.0-linux-x64/bin
# ./kibana
기본설정으로 Kibana를 실행하면 localhost:9200으로 ES에 접속됩니다.
http://localhost:5601로 Kibana에 접속해봅니다.


4.Redis 설치
# wget http://download.redis.io/releases/redis-3.0.5.tar.gz
# tar xvfz redis-3.0.5.tar.gz
# cd redis-3.0.5/src
# make
# ./redis-server &
# ./redis-cli
> info
5.Nginx 로그 설정
이제 Nginx Log Format을 ElasticSearch에 적재하기 용이한 JSON Format으로 설정합니다.
nginx.conf를 vi 에디터 등으로 열고 다음과 같은 설정을 추가합니다.
log_format json_format '{"@time": "$time_iso8601", '
'"@fields": { '
'"host": "$http_host", '
'"ip": "$remote_addr", '
'"request-time": "$request_time", '
'"status": "$status", '
'"request": "$request", '
'"size": "$body_bytes_sent", '
'"user-agent": "$http_user_agent", '
'"referrer": "$http_referer" } }';
AccessLog를 설정하는 부분에, JSON으로 로그를 찍도록 합니다. 저는 다음과 같이 설정했습니다.
location / {
proxy_pass http://axboot-admin;
access_log logs/axboot_admin_ssl_access_log json_format;
error_log logs/axboot_admin_ssl_error_log json_format;
proxy_intercept_errors on;
}
nginx를 재시작하고 로그가 JSON Format으로 쌓이는지 확인해봅니다.


6. Collector Logstash 설치
Nginx가 JSON 형태로 저장하는 로그를 Redis에 적재하는 Logstash를 설치합니다.
# wget https://download.elastic.co/logstash/logstash/logstash-all-plugins-2.1.0.zip
# unzip logstash-all-plugins-2.1.0.zip
# cd logstash-2.1.0
logstash가 로그를 수집, 적재 할 수 있도록 설정파일을 만듭니다.
input {
file {
path => "nginx 로그 파일의 절대경로"
type => nginx
codec => json
}
}
filter {
geoip {
source => "[@fields][ip]"
}
}
output {
redis {
host => "Redis Host"
port => "Redis Port"
data_type => "list"
key => "logstash"
}
}
Log 파일의 Input, Output에 대한 설정과 더불어 filter를 통해 ip정보를 기반으로 Geo Location 정보를 추출 할 수 있는 geoip 플러그인을 연결 했습니다.
Logstash를 실행하고, Redis에 로그가 적재되는지 확인해봅니다.
# ./bin/logstash -f logstash.conf
rdm을 통해 JSON을 한번 살펴보자


Nginx가 남긴 로그와 함께 GeoIP 플러그인이 추가한 geoip 정보도 JSON으로 Redis 에 잘 저장이 되어 있다.
7. Indexer Logstash 설치
이제 Redis에 쌓인 로그들을 ElasticSearch로 Indexing 하는 Logstash를 설정해보자.
input {
redis {
host => "Redis Host"
port => "Redis Port"
codec => "json"
data_type => "list"
key => "logstash"
}
}
output {
elasticsearch {}
}
Indexer Logstash는 편의상 ElasticSearch가 설치된 서버에 함께 설치했고, 위와 같이 logstash.conf 파일을 생성했다.
# ./bin/logstash -f logstash.conf
실행 후 Redis에 있던 로그들이 ElasticSearch로 적재 되었는지 Kibana에 접속해서 확인해보자.


잘 쌓이고 있네요! 이제 통계를 만들어봅니다.
1) 서버 접속자들의 위치를 지도상에 표시
  • Visualize => Tile Map 선택 후 다음과 같은 검색 조건으로 설정합니다.


현재 로그상에 있는 IP들이 모두 한국이다보니 한국쪽에 빨간점으로 표시가 되었네요.
2) Browser Agent별 접속 통계
  • Visualize => Vertical bar chart를 선택 후 다음과 같은 검색 조건으로 설정합니다.


8. 정리

클릭 몇번이면 Kibana에서 ES에 있는 데이터를 효율적으로 Visualization 할 수 있고, SQL Plugin을 사용해서 SQL 구문으로 통계 데이터를 추출 할 수도 있습니다.
초기 스타트업이라면 ELKR(ElasticSearch, Logstash, Kibana, Redis)를 사용해서 필요한 지표는 충분히 추출 가능 할 것 같습니다.
Logstash의 설정을 조금만 변경하면 Tomcat, Ruby 등의 WAS Log 또한 Logstash로 수집하여 에러가 발생하거나, 혹은 지표추적을 위해 남겨놓은 로그데이터들을 수집해서 장애알람 시스템이나, 지표추적 시스템으로도 사용 할 수 있습니다.
또 새롭게 서버를 늘려 나갈 때 마다 Nginx설치, Logstash설치 및 설정과 같은 반복적인 작업들은 Ansible과 같은 툴을 이용해 자동화 하면 서비스를 확장하는데 있어서 많은 비용과 시간을 줄일 수 있습니다.


'BigData' 카테고리의 다른 글

MapReduce란?  (0) 2019.03.16
Kafka 소개 및 정리  (0) 2018.08.09
댓글
공지사항
최근에 올라온 글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함