Learning Elastic Stack ( Elastic-search, logstash, kibana, beats )
실시간 파이프라인 기능을 가진 오픈소스 데이터 수집엔진(DataFlow Engine)
파이프라인 : 데이터 처리를 위한 logstash 설정(input, filter, output)
$ logstash -e ‘input { stdin {}} output {stdout {} }’
// -e 옵션을 이용하면 설정 파일을 읽지 않고, 그 다음에 오는 명령을 설정으로 인식
// 위의 명령어는 stdin -> filter 없음 -> stdout으로 동작하는 로그 스태쉬를 실행
// 명령어를 입력 후 hello world를 입력하면 timestamp, host 정보를 붙여서 hello world가 필터 되는것을 확인!
/config 디렉토리에 위치!
$ logstash -f {설정파일 명}
// 설정파일을 읽어서 로그스태쉬를 실행시킴
// 설정 파일은 input, filter, output 으로 구성
==> Logstash를 파라미터 없이 시작하는 경우, pipeline.yml 파일을 읽어서 해당 파일에 정의된 모든 파이프라인을 시작
==> 반면 Logstash를 -e , -f 를 사용하는 경우 pipeline.yml를 사용하지 않음
1. Input 설정
ex) input 설정 예제
input {
file{
path => "/path/access.log"
start_position => "beginning"
sincedb_path => "NULL"
ignore_older => 0
}
}
startposition => Logstash를 시작할 때 file의 어디서부터 읽을지를 결정하는 설정
=> beginning 과 end(default) 설정을 지원함
주의 : 이 설정은 file을 최초 읽을 때만 적용된다는 점. startposition => “beginning” 인 경우 logstash를 여러번 restart 하더라도 동일한 내용이 출력될 것이라 생각하는데 그렇지 않음!
sincedb : logstash가 최초 시작될 때는 file을 읽을 위치가 start_position에 의해 결정되지만, 이후 실행시에는 sincedb에 저장된 offset부터 읽기 시작함!
$ cat ~/.sincedb_a8ae6517118b64cf101eba5a72c366d4
22253332 1 3 14323
=> 위의 예에서 22253332번 파일은 현재 14323번 offset까지 처리가 되었다는 걸 의미
=> logstash를 재실행하는 경우 start_position값과 상관없이 14323 offset부터 file 을 읽기 시작!
Logstash를 테스트 하는 동안에는 이 sincedb 때문에 테스트가 좀 번거로움 이경우 NULL 로 path 설정!
2 Filter 설정
Filter Plugin: Grok
=> 로그 스태쉬에서 기본적으로 사용할수 있는 필터 플러그인이다.
=> 불규칙적인 데이터를 정형화된 데이터로 만들어줌
=> 자주 쓰이는 정규표현식 패턴이 사전정의되어 있어 패턴을 골라서 사용가능
mutate
=> 데이터 필드 단위로 변형할수 있음 / 필드를 타입 변경, join, 이름 변경 가능
=> elastic search 에서 indexing된 data를 변경하는 것은 상대적으로 어려움. indexing 전에 필드를 변경해서 넘기는 것이 속도도 빠르고
불필요한 데이터 양도 줄일수 있음
date
=> String을 Data타입으로 변환함. 날짜를 string 타입으로 elastic search에서 indexing하면 query나 aggregation할때 문제 발생 가능
json : input 의 json 데이터 구조 유지
input {
file {
path => ""
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
csv {
separator => ","
columns => ["Date","Open","High","Low","Close","Volume","Adj Close"]
}
mutate {
convert => {
"Open" => "float"
"High" => "float"
"Low" => "float"
"Close" => "float"
"Volume" => "float"
"Adj Close" => "float"
}
}
}
output {
elasticsearch {
hosts => "127.0.0.1:9200"
index => "stock-%{+YYYY.MM.dd}"
}
stdout {
}
}
샘플 데이터 : sample-access.log
input {
file {
path => ""
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
grok {
match => { "message" => "%{COMMONAPACHELOG}" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch {
hosts => "127.0.0.1:9200"
index => "apache-log"
}
stdout {}
}
참고 : http://blog.naver.com/PostView.nhn?blogId=kbh3983&logNo=221063092376
ex) put /catalog/product/1
==> put 새로운 도큐먼트를 색인 ( index - type - 색인 생성 후 할당되는 id)
인덱스
타입
도큐먼트
노드
클러스터
샤드 및 복제본
요약,
관계형 데이터 베이스가 일반적인 crud 연산에 적합한 b트리를 만들고 관리하는 것과 달리 일래스틱 서치는 아파치 루씬 기능을 사용해 역색인 이라는 완전히 다른 데이터 구조로 데이터를 관리한다는점!!