✔ ELK Stack 란?
"ELK"는 Elasticsearch, Logstash 및 Kibana, 이 오픈 소스 프로젝트 세 개의 머리글자입니다. 오픈소스이기 때문에 무료로 사용 가능하다고 합니다.
1. Elastic Search ( Port : 9200 )
- Apache Lucene 기반의 Java 오픈소스 분산 검색 엔진이다.
- Elastic Search를 통해 루씬 라이브러리를 단독으로 사용할 수 있게 되었으며, 방대한 양의 데이터를 신속하게, 거의 실시간(NRT, Near Real Time)으로 저장, 검색, 분석할 수 있다.
- 오픈소스의 장점처럼 전문가들이 버그에 빠르게 대응한다.
- Document 간의 조인을 수행할 수 없다. ( 두 번 이상의 쿼리로 해결은 가능하다고 한다. )
- 트랜잭션이 제공되지 않는다.
2. Logstash ( Port : 5000 )
- 다양한 소스 (DB, csv 파일 등)의 로그 또는 트랜잭션 데이터를 수집, 집계, 파싱하여 Elastic Search에 전달한다.
- Input을 받아 커스텀 가능한 Filters로 가공하여 Output으로 내보내는 역할을 수행한다.
Logstash.conf 파일의 구성
input {
...
}
filter {
...
}
output {
...
}
3. Kibana ( Port : 5601 )
- Elastic Search와 함께 작동하도록 설계된 오픈 소스 분석 및 시각화 플랫폼이다.
- Elastic Search 색인에 저장된 데이터를 검색해보고 상호 작용할 수 있다.
- 고급 데이터 분석을 쉽게 수행하고 다양한 차트, 테이블 및 맵에서 데이터를 시각화할 수 있다.
✔ ELK Stack의 특징
장점
- 강력한 유연성과 호환성 : 엘라스틱 서치, 로그스태시, 키바나는 각각 데이터의 쿼리(검색), 수집, 시각화를 담당한다. 용도별로 분리하여 발전하는 솔루션이기에 구조적 안정성은 물론 다른 시스템과도 유연한 호환성을 가진다.
- 자유 스키마 : JSON 방식의 Key-Value 형식의 데이터를 사용하므로 형식에 자유롭다.
- 인덱스 와일드카드 지원 : 관계형 데이터베이스로 치면 테이블(Table)에 해당하는 개념인 인덱스(Index)의 Union 또는 Join이 경우에 따라 와일드 카드(*) 표기 하나로 끝날 수도 있다.
- 확장(Scale-out) 가능 데이터베이스 : 처음부터 확장을 고려하여 만들어졌기 때문에, 여러대의 서버를 엮어서 성능 향상을 기대할 수 있는 클러스터 방식을 구성할 때 관계형 데이터베이스보다 상대적으로 관련 정보에 쉽게 접근이 가능하다.
- 데이터 처리 절차를 '레거시 코딩'보단 개별 설정으로 가능 : 데이터 처리 절차를 프로그래밍 언어를 이용한 코딩으로 명시한다면, 향후 유지보수가 용이하지 않고 불필요한 종속성이 높아지는 문제가 있지만 Logstash를 포함하는 ELK Stack 구성 시 유연성 확보가 가능하다.
- 사전에 준비된 시각화 도구와 부가기능 : 데이터를 시각화하여 보여주기 위한 사용자 인터페이스를 내보낼 프로그램을 따로 작성하지 않아도, 이미 사전에 준비된 시각화 도구를 가진 Kibana가 마우스 몇번 조작하면 거진 다 알아서 해준다. 그 외 데이터베이스 관리자를 위한 부가기능이 포함되어 있다.
- 실시간 데이터 처리 : 메시지 큐(Message Queue, MQ)와 결합하면 강력한 실시간 (Realtime) 데이터 수집 및 처리 시스템이 된다.
단점
- 초기 데이터 구성 및 이관 문제
- 커널 변수의 불필요한 사용
- 시간대 (Timezone) 처리
나무위키 참조 : namu.wiki/w/ELK?from=ELK%28%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%29
ELK Stack 환경구축
✔ OS 지원 매트릭스 : www.elastic.co/support/matrix
✔ 사이트 참조 : lindarex.github.io/elastic-stack/ubuntu-elastic-stack-installation/
- Java 설치
- Elastic Search 설치
- Logstash 설치
- Kibana 설치
Localhost에서 3개의 서비스를 구성한다면, 별도 설정할 필요없이 서로 바인딩이 된다.
Elastic Search VS Relational Database (RDB, 관계형 데이터베이스)
RDB에서는 Document ( Row를 뜻한다. ) 중심이라면 Elastic Search에서는 텍스트 중심이다.
만약 텍스트 A를 찾는다고 한다면, RDB에서는 Document 하나하나 확인하면서 A가 있는지 찾지만, Elastic Search에서는 검색하는 순간 데이터를 찾을 수 있다. ( 시간복잡도 O(1) )
검색 속도면에서는 엘라스틱 서치가 빠르지만, 다른 테이블과 조합할 수 없고 ( 가능은 하지만, 두 번 질의를 해야하는 문제가 발생한다고 한다. ), 데이터 트랜잭션을 지원하지 않는 단점이 있다. 하지만 관계형 데이터베이스에서는 테이블 조합과 트랜잭션을 지원한다는 장점이 있다.
Elastic Search API 예제
인덱스 생성
curl -XPUT http://localhost:9200/classes?pretty
매핑 생성
curl -H 'Content-Type:application/json' -XPOST 'http://localhost:9200/classes/class/_mapping?include_type_name=true&pretty' -d @classes-mapping.json
데이터 생성
curl -H 'Content-Type:application/json' -XPOST http://localhost:9200/_bulk?pretty --data-binary @classes.json
인덱스 확인 and 매핑 확인
curl -XGET localhost:9200/classes/?pretty
데이터 조회
curl -XGET localhost:9200/classes/class/1?pretty
데이터 검색
curl -XGET 'localhost:9200/classes/class/_search?q=major:"music"&pretty'
데이터 수정 (1)
curl -H 'Content-Type:application/json' -XPOST http://localhost:9200/classes/class/1/ -d '{"title" : "Algorithm","professor" : "John"}'
데이터 수정 (2)
curl -H 'Content-Type:application/json' -XPUT http://localhost:9200/classes/class/1/ -d '{"title" : "ELK Stack","professor" : "Sejin"}'
인덱스 삭제
curl -XDELETE http://localhost:9200/classes
참조
- -H 'Content-Type:application/json' : ElasticSearch 6 버전 이후부터는 head 값까지 상세히 적어줘야한다고함
- string은 mapping type에서 사용할 수 없다. 버전 5.0부터 text와 keyword로 분리되었다.
- mapping.json POST할 때, include_type_name=true 옵션 추가 필요
Elastic Stack 실습
✔ 페이스북 주식 데이터 분석하기
1. 주식 데이터 (.csv) 다운로드 받기
2. Logstash 환경 설정 파일 생성 ( logstash-stock.conf )
input {
file {
path => "/home/sejin/Documents/FB.csv"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
csv {
separator => ","
columns => ["Date","Open","High","Low","Close","Adj Close","Volume"]
}
mutate {convert => ["Open", "float"]}
mutate {convert => ["High", "float"]}
mutate {convert => ["Low", "float"]}
mutate {convert => ["Close", "float"]}
}
output {
elasticsearch {
hosts => "localhost"
index => "stock"
}
stdout {}
}
3. Logstash 서비스를 통해 Elastic Search로 데이터 전달
/usr/share/logstash/bin/logstash -f /home/sejin/Documents/logstash-stock.conf
4. Kibana를 통한 로그 분석
참조 사이트
무료 강의 참조
매핑 타입 text, keyword 참조
esbook.kimjmin.net/07-settings-and-mappings/7.2-mappings/7.2.1
개념 참조