ELKR (ElasticSearch + Logstash + Kibana + Redis) 를 이용한 로그분석 환경 구축하기
큰 서비스들을 운영하는 회사들은 자체적인 로그 수집, 정제, 분석 솔루션들을 가지고 있거나 자체적으로 대용량 ES Cluster, Hadoop Cluster 등을 운영합니다.
하지만 초기 스타트업은 한치앞을 내다 볼 수 없기때문에 최소 비용으로 최대의 효과를 낼 수 있는 여러 오픈소스들을 조합하여 잘 사용해야 합니다.
초기에 크지 않은 비용으로 간단하게 로그분석 환경구축을 하고, 이후 서비스가 성장하면서 시스템이 커질 경우 비교적 용이하게 Scale Out 해 나갈 수 있는 ElasticSearch와 Redis를 이용해서 로그 분석 시스템을 구성하는 방법을 소개합니다.
이 포스팅은 ElasticSearch와 Redis, Logstash, Kibana등에 경험이 많지않은 개발자를 대상으로 설치, 및 설정, 실제 실무에서의 적용 방법등을 간략하게 소개하는 글입니다.
구성은 다음과 같습니다.
로그 데이터의 흐름은 다음과 같습니다.
-
1Nginx 는 각각의 물리적인 3대의 서버에서 구동된다고 가정합니다.
-
2각 서버에는Nginx의 로그를 수집하기 위한 Logstash가 동작합니다.
-
3다량의 로그가 빠르게 쌓일 경우를 대비해 Redis를 중간데이터 수집 Queue로 사용 합니다.
-
4Redis에 쌓인 로그들을 ElasticSearch에 적재하는 Indexer Logstash가 동작하면서 Redis로그를 ElasticSearch로 적재합니다.
-
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과 같은 툴을 이용해 자동화 하면 서비스를 확장하는데 있어서 많은 비용과 시간을 줄일 수 있습니다.