1. Overview#
이번 시리즈에서는 Elastic Stack
라고 불리는 로그 및 데이터 분석도구에 대한 내용을 다루려고 합니다.
데이터를 저장하고 분석하는 역할을하는 Elasticsearch
부터, 로그를 수집하고 전송하는 기능의 Logstash
, 데이터 시각화 및 분석기능의 Kibana
, 데이터 수집기능의 Beats
까지 폭넓고 깊게 다룰것입니다.
먼저 튜토리얼로 넘어가기전에 Elastic stack
이란 무엇인지, 어떤 역할을 하는지 짚고 넘어가도록 하겠습니다.
2. Elastic Stack#
세상에는 여러종류의 Data가 있습니다.
예를 들어 어떤 마트의 고객정보들을 기록한 데이터를 생각해봅시다. 이러한 데이터들은 정보자체가 정형화되어 있습니다. 이름, 나이, 전화번호, 주소 등 각 마트에서 원하는 정보를 틀로 만들어 새로운 정보들을 틀안에 잘 끼워넣을 수 있게할 수 있습니다.
다른 예로, IT 인프라에서 발생하는 모든 상황의 데이터인 Log 데이터는 발생하는 모든 행위와 그 이벤트 정보를 전부 담고있기 때문에 해당 인프라를 개발한 개발자에 따라 형식이 전부 다릅니다. 즉 Log데이터는 정형화되어있지 않습니다.
때문에 기존의 관계형 DataBase로는 비정형 데이터를 분석하기가 굉장히 까다롭습니다.
TIP. Log Data의 분석이 중요한 이유#
대표적인 비정형 데이터인 Log데이터는 인프라를 사용하며 발생하는 모든 정보를 담고있습니다. 사용자의 사용패턴을 파악해서 더 나은 서비스를 제공하기 위해, 에러의 원인을 분석하기 위해, 또는 자원의 사용량을 체크하고 모니터링 하기 위해 등등 다양한 요구사항을 해결하기 위해 Log데이터의 분석은 필수적입니다.
분석 어떻게?#
일반적으로 데이터 분석은 데이터 소스 수집, 저장, 처리, 분석, 표현의 프로세스를 거칩니다.
Elastic Stack
은 다음 사진과 같이 데이터 분석에 대한 모든 프로세스를 제공합니다. 또한 구축이 굉장히 쉽고 강력하며 무료이기 때문에 잠재적 가치가 매우 큽니다. 최근에는 Elastic Stack에 X-Pack
이라는 머신 러닝 기법을 적용한 플러그인을 제공해 분석의 퀄리티를 더욱 올리고 있습니다.
Elastic Stack은 무엇?#
Elastic Stack은 어떤 하나의 통합된 솔루션이 아니라 4개의 product로 구성되어 있습니다.
기존에는 ElasticSearch
+ Logstash
+ Kibana
를 서로 묶어서 ELK라는 서비스명으로 제공하였으나, 5.0.0버전부터 Beats
가 추가되어 Elastic Stack이라는 이름으로 변경되게 되었습니다.
참고링크
3. ElasticSearch#
Apache Lucene 기반의 Java 오픈소스 분산 검색 엔진입니다.
- Full Text 검색 가능
- RESTful
- 대량의 데이터를 거의 실시간(NRT, Near Real Time)으로 저장, 검색 및 분석가능
You Know, for Search.
관계형 DB와의 비교#
데이터를 저장하고 검색하는 기능이다보니 기존의 관계형 DB와 비교하면 용어들을 좀 더 쉽게 이해할 수 있습니다.
Relational Database | ElasticSearch |
---|---|
Database | Index |
Row | Document |
Column | Field |
Index | Analyze |
Primary Key | _id |
Schema | Mapping |
Physical Partition | Shard |
Logical Partition | Route |
Relational | Parent/Child, Nested |
SQL | Query DSL |
그럼 각각의 용어들을 더 살펴보도록 하겠습니다.
용어#
아래의 사진은 이해를 돕기위한 ElasticSearch의 전체적인 아키텍처입니다.
공식문서 : Basic Concept
Near Realtime (NRT)#
ElasticSearch는 NRT 플랫폼입니다. 문서를 indexing할때부터 검색이 가능해질때까지 약간의 지연시간(일반적으로 1초)이 있다는 것을 의미합니다.
Cluster#
ElasticSearch에서 가장 큰 개념이며 모든 노드(서버)의 모음입니다. 기본적으로 고유한 이름으로 식별됩니다.
Node#
cluster의 indexing및 검색기능에 참여하는 단일 서버입니다. cluster와 마찬가지로 Node가 생성될때 임의로 할당되는 고유 id로 식별됩니다. 기본값인 id를 사용하지 않을 경우 원하는 이름으로 정의할 수 있습니다.
Document#
indexing할 수 있는 데이터의 기본 단위입니다. JSON으로 표현되어 있으며, index내에서 원하는 만큼의 Document를 저장할 수 있습니다.
Type#
다른 타입의 document를 하나의 index에 저장할 수 있게 index를 구분할 때 사용되는 유형입니다.
하지만 ElasticSearch 6.0.0부터 사라지는 항목입니다.
다음 링크를 참조해 주세요. –> Removal of mapping types
Index#
Document들의 집합입니다. index는 이름으로 식별되며 indexing
, search
, update
, delete
작업을 수행할때 사용됩니다.
단일 cluster에서 원하는 만큼의 인덱스를 정의할 수 있습니다.
Shards#
Index는 대량의 데이터를 저장할 수 있습니다. 하지만 이러한 대량의 데이터를 검색해야된다거나 HW제한을 초과하는 용량을 담아야 한다면 단일노드에서 작업하는 것은 별로 좋지 않을 수 있습니다.
이러한 문제를 해결하기 위해 Index를 여러 조각으로 분할하여 저장할 수 있습니다. 분할된 조각을 Shard
라고 하며 기본적으로는 1개의 Shard
가 존재합니다.
검색 성능 향상을 위해 cluster의 Shard
개수를 조정하는 튜닝을 하기도 합니다.
Replicas#
노드나 shard
를 손실했을 경우 데이터의 고가용성을 제공합니다. 때문에 shard
와 replica
는 동일한 노드에 할당되지 않습니다.
또한 검색할때 모든 replica
에서도 병렬으로 실행할 수 있으므로, 처리량을 높일 수 있습니다.
index를 정의할 때, shard
와 replica
의 수를 정의할 수 있습니다. 그리고 index를 생성하고 난 후에도 언제든지 동적으로 replica
의 수를 변경할 수 있습니다. 하지만 shard
의 수를 동적으로 변경하는 것은 약간 어렵습니다.
4. Logstash#
다양한 플러그인을 이용해 데이터 집계 및 보관, 서버 데이터 처리, 파이프라인으로 데이터를 받아 필터를 통해 변환 후, 저장소에 전송하는 역할을 맡고있습니다.
용어#
Input#
Logstash
파이프 라인에 데이터를 가져오는 부분입니다. Beats
, file
, syslog
등 다양한 입력을 지원하기 때문에 시스템상에 다양한 형태로 보관된 데이터들을 쉽게 가져올 수 있습니다.
input plugin 정보 : link
filter#
Logstash
파이프라인 중 중간 처리 장치입니다.
데이터가 이동하는 과정에서 구문분석과 변환을 할 수 있습니다.
filter plugin 정보 : link
output#
Logstash
파이프라인의 최종 단계입니다. 데이터를 저장소에 전송하는 역할을 맡고있습니다.ElasticSearch
말고도 여러 저장소를 지원하고 있기 때문에 폭넓은 사용을 가능하게 합니다.
output plugin 정보 : link
codec#
입력 또는 출력의 일부로 작동할 수 있는 스트림 필터입니다. 자주 사용하는 codec에는 json, msgpack, plain이 있습니다.
예) json : JSON형식의 데이터를 인코딩하거나 디코딩합니다.
특징#
확장성#
Logstash
에는 플러그인으로 확장 가능한 프레임워크가 200개 이상이 있습니다.
다양한 입력과 필터, 출력을 자유롭게 조절할 수 있습니다.
안정성&보안성#
Logstash
노드가 다운되어도, Logstash
는 Persistent Queue를 사용하여 현재 처리되고 있는 이벤트에 대해 최소 1회 전송을 보장합니다.
성공적으로 처리되지 않은 이벤트는 검증 및 재전송을 위해 Dead Letter Queue로 분류할 수 있습니다.
추가로, Beats
로 데이터를 수집하는 경우 데이터 암호화가 가능하며, ElasticSearch
보안 클러스터와 완전히 통합될 수 있습니다.
모니터링#
다양한 목적으로 활용되는 Logstash의 파이프라인은 잘 정리해두지 않으면 금세 복잡해져서 쉽게 파악하기가 어려울 수 있습니다.
Kibana와 결합하면 실행중인 Logstash노드를 손쉽게 파악할 수 있습니다.