Overview

Elasticsearch는 현재는 세상에서 가장 인기가 있는 오픈소스 검색엔진으로 수많은 개인 개발자, 기업 그리고 공공기관들로부터 사랑을 받고 있습니다. 간단한 REST API, 분산형 특징, 속도, 확장성으로 유명한 Elasticsearch는 데이터 수집, 보강, 저장, 분석, 시각화를 위한 무료 개방형 도구 모음인 Elastic Stack의 핵심 구성 요소입니다. 보통 **ELK Stack(Elasticsearch, Logstash, Kibana)**이라고 하는 Elastic Stack에는 이제 데이터를 Elasticsearch로 전송하기 위한 경량의 다양한 데이터 수집 에이전트인 Beats가 포함되어 있습니다.

ELK Stack

Untitled

Elasticsearch는 Apache Lucene 기반의 Java 오픈소스 분산 검색 엔진입니다. Elasticsearch를 통해 Lucene 라이브러리를 단독으로 사용할 수 있게 되었으며, 방대한 양의 데이터를 신속하게, NRT(Near Real Time)으로 저장, 검색, 분석할 수 있습니다. 위에서 설명한 바와 같이 Elasticsearch는 검색을 위해 단독으로 사용되기도 하지만, ELK Stack으로 사용되기도 합니다.

단독 프로젝트인 Logstash와 Kibana와 함께 사용되며 ELK Stack으로 불려왔으나, 2013년 두 프로젝트를 정식으로 흡수하여 ELK Stack 대신 제품명을 Elastic Stack이라고 정식 명명하며 모니터링, 클라우드 서비스, 머신러닝 등의 기능을 계속해서 개발, 확장 해 나가고 있습니다.

Untitled

ElasticSearch

Elasticsearch는 실시간 분산 검색 및 분석 엔진으로, 매우 빠른 검색 기능을 제공합니다. JSON 기반의 문서를 사용하여 데이터를 저장하며, 복잡한 검색 쿼리를 빠르게 처리할 수 있습니다. 이는 또한 스케일 아웃이 용이하여, 데이터가 증가함에 따라 노드를 추가하여 성능과 용량을 확장할 수 있습니다.

기본적으로 모든 데이터를 색인(indexing)하여 저장하고 검색, 집계 등을 수행하며 결과를 클라이언트 또는 다른 프로그램으로 전달하여 동작하게 합니다. 뛰어난 검색 능력과 대규모 분산 시스템을 구축하는 다양한 기능을 제공합니다.

오픈소스

Elasticsearch Github을 통해 소스코드를 확인할 수 있고, 또한 기여도 가능합니다. Lucene이 Java로 만들어졌기에 ES도 마찬가지로 Java로 코딩 되어 있습니다. 따라서 반드시 Java를 설치해주어야 합니다만 7버전 이상부터는 패키지에 내장 되어 있어 설치 안하셔도 됩니다.

실시간 분석(NRT)

Elasticsearch의 가장 큰 특징 중 하나로,  Hadoop이라는 배치 기반 분산 시스템과 달리 ES 클러스터가 실행되고 있는 동안에는 계속해서 데이터가 입력 - 색인(indexing)되고, 동시에 실시간에 가까운 속도(Near Real-Time)로 색인된 데이터의 검색, 집계가 가능합니다.

전문 검색 엔진 (Full-text search engine)

Lucene은 기본적으로 역파일 색인(inverted file index)라는 구조로 데이터를 저장하고, Lucene을 사용하고 있는 Elasticsearch도 동일한 방식으로 저장하여 가공된 텍스트를 검색합니다. 이러한 특성을 Full-Text Search라고 하며, Elasticsearch의 검색이 빠른 이유가 바로 Inverted Index에 있습니다.

Index는 책에서 맨 앞에서 볼 수 있는 목차라고 할 수 있고, Inverted Index는 책 맨 뒤에서 키워드마다 찾아볼 수 있도록 도와주는 찾아보기 기능이라고 할 수 있습니다. Index를 사용한다면 앞에서부터 순차적으로 키워드를 찾아가겠지만, Inverted Index는 Text를 Parsing한 키워드에 대해 indexing하기 때문에 훨씬 빠른 성능을 가져옵니다.

Elasticsearch에서 Query나 반환되는 결과는 모두 JSON 형식으로 전달되기 때문에, 사전에 입력할 데이터를 JSON 형태로 가공하는 과정이 필요합니다. 물론 이 과정은 Logstash가 변환을 지원해 줍니다.

RESTFul API