- Elasticsearch
점점 많아지는 문제를 해결하는 분산형 RESTful 검색 및 분석 엔진
- Logstash : 데이터 집계, 변환 및 Stash
오픈 소스 서버측 데이터 처리 파이프라인으로 다양한 소스에서 동시에 데이터를 수집하여 변환한 후 자주 사용하는 보관소로 보냄
- Kibana
Elasticsearch 데이터를 시각화하고 Elastic Stack 탐색 지원
위 세개의 제품 외에 Beats라는 경량화된 데이터 수집기를 사용하여 Logstash 또는 ElasticSearch로 전송한다.
위 오픈 소스들을 통틀어 Elastic Stack이라고 부른다.
현재 회사 서비스가 늘어나면서 관리하는 WAS 개수도 증가함에 따라 에러 로그를 검색 또는 오류 추이를 분석하여 확인하기가 어려웠다. 물론 Scouter APM / 제니퍼를 사용하여 실시간으로 에러를 확인하고도 있었지만, 모든 WAS의 데이터를 검색 또는 시각화하여 보기에는 어려움이 있어 Elastic Stack을 적용하였다.
일단 ES cluster를 다음과 같이 구성했다.
Master node |
es-server01 |
Data node |
es-server02, es-server03 |
Client node |
es-server04 |
각 노드의 구성은 https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html#coordinating-node 링크를 참고하면 된다.
추후에 가능하면 마스터 노드를 하나 추가하여야할 것 같다.
실시간으로 데이터 수집이 필요하지 않아 하루전 데이터 수집 및 변환하여 로그 분석용 및 검색기로 사용하고 있다.
WAS마다 계정의 아이디/비번을 입력해야하는 이슈가 있어서 AntBuilder로 WAS 간 scp 로그 이동을 하였다.
def ant = new AntBuilder()
def doScp(_ant, _ip, _filename, _service, _was_num, localdir, _pwd) {
def localFileNm = _filename
_ant.scp(file: _ip + _service + _filename,
localTofile: localdir + localFileNm + _service + _was_num,
verbose: false, , password : _pwd)
}
서비스별로 로그 패턴을 정규식으로 정의하여 elasticsearch에 데이터를 수집하여 아래와 같이 데이터를 시각화하였다.
********
최근에 SVN 접속 기록이 필요했다. SVN ACCESS MANAGER가 제공되고 있었지만, 계정들을 DB화해서 사용하고 있지 않아 아파치 로그를 정규식 패턴을 사용해 es 로 옮겨 아래와 같이 간단히 처리했다.
input {
file {
path => "../apache2/logs/...log"
}
}
filter {
grok {
patterns_dir => ["../patterns"]
match => {"message" => "\[%{HTTPDATE:loginDate}\] %{USERNAME:userId} %{WORD:action}"}
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch.."]
codec => "json"
index => "...-log-%{+YYYY.MM.dd}"
}
}
댓글