Elasticsearch

- Apache Lucene 기반의 Java 오픈 소스 분산 검색 엔진
- 방대한 양의 데이터를 신속하게 저장, 검색, 분석할 수 있다.
- 검색을 위해 단독으로 사용할 수 있으며 ELK 스택으로 사용되기도 한다,
- Elasticsearch : Logstash로부터 받은 데이터를 검색 및 집계하여 필요한 정보를 획득한다.
- Logstash : 다양한 소스 (DB, csv 파일 등) 의 로그 또는 트랜잭션 데이터를 수집, 집계, 파싱하여 Elasticsearch 전달
- kibana : Elasticsearch의 빠른 검색을 통해 데이터를 시각화 및 모니터링
Elasticsearch 의 구조

클러스터(Cluster)
- Elasticsearch 에서 가장 큰 시스템 단위, 최소 하나 이상의 노드로 이루어진 노드의 집합을 말한다.
- 서로 다른 클러스터는 데이터의 접근, 교환이 불가능한 독립적인 시스템으로 유지된다.
- 여러 대의 서버가 하나의 클러스터를 구성할 수 있고, 한 서버에 여러개의 클러스터가 존재할 수 있다.
노드(Node)
- 클러스터에 포함된 단일 서버로서 데이터를 저장하고 클러스터의 색인화 및 검색 기능에 참여한다. 노드는 역할에 따라 Master, Data, Ingest, Coordinating 노드로 구분할 수 있다.
- Master-eligible Node : 클러스터를 제어할 수 있는 마스터 노드이다.
- 인덱스 생성, 삭제
- 클러스터 노드의 추적, 관리
- 데이터 입력 시 할당할 사드 선택
- 클러스터 마다 하나의 마스터 노드 존재
- Data Node : 데이터가 저장되는 노드이며 데이터가 분산 저장되는 물리적 공간인 사드가 배치되는 노드이다.
- CRUD, 색인, 통계 등 데이터 작업 처리
- 모니터링 작업, 마스터 노드와 분리 필요
- Ingest Node : 데이터를 전처리, 포맷 변경을 위한 파이프라인을 실행하는 역할을 한다.
- Coordinating Node : 사용자의 요청을 받고 라운드 로빈 방식으로 “분산”하는 노드이다. 로드밸런싱 역할을 한다.
- 클러스터에 관한 것은 마스터 노드로 넘기고, 데이터와 관련된 것은 데이터 노드로 넘긴다.
- 라운드 로빈 방식 : 우선순위를 두지 않고 순서대로 시간 단위로 자원을 할당한다.
인덱스(Index)
- RDBMS 에서 데이터베이스와 대응되는 개념이다.
사드(Shard)
- 인덱스 내부에는 색인된 데이터가 존재한다.
- 스케일 아웃을 위해 하나의 인덱스를 여러 샤드로 쪼개서 구성되어 있다.
- 프라이머리 샤드(Primary Shard)
- 데이터의 원본, Elassticsearch에서 데이터 업데이트 요청을 날리면 반드시 프라이머리 샤드에 요청하게 되면서 레플리카 샤드에 복제된다.
- 레플리카 샤드(Replica Shard)
- 프라이머리 샤드의 복제본, 기존 원본 데이터가 무너졌을 때 그 대신 사용하면서 장애를 극복한다. 기본적으로 프라이어머리와 동일한 노드에 배정하지 않는다.
세그먼트(Segment)
- 문서의 빠른 검색을 위해 설계된 자료 구조이며 샤드의 데이터를 가지고 있는 물리적인 파일이다.
- 각 샤드는 다수의 세그먼트로 구성되어 있으므로 검색 요청을 분산처리하여 훨씬 효율적인 검색이 가능하다.
- 샤드에서 검색 시 각 세그먼트를 검색하여 결과를 조합한 후 해당 샤드의 결과로 반환한다. 세그먼트는 내부에 역색인 구조로 저장되어 있다.(키워드를 통해 문서를 찾아내는 방식)
- 매 요청마다 새로운 세그먼트를 만들면 엄청난 용량이 필요하게 될 것이다. 이 때문에 인메모리 버퍼를 사용한다.
- 인메모리 버퍼는 일정 시간이 지나거나 버퍼가 가득차면 flush를 취하고 flush 작업이 수행되면서 시스템 캐시에 세그먼트가 저장된다. 이 시점부터 검색이 가능하다.
- 이후에 일정 시간이 지나면 commit을 통해서 물리적인 디스크에 세그먼트를 저장해주고 저장된 세그먼트는 하나로 병합된다. 병합을 통해 세그먼트가 줄어들기 때문에 검색 성능은 향상된다.
Elasticsearch VS RDBMS

- 6.x 버전부터 ES의 인덱스에 하나당 하나의 타입을 가진다.
- RDBMS의 데이터베이스에 하나의 테이블만을 가진다고 생각하면 된다.
Elasticsearch 특징 정리
- 확장성 : 샤드를 이용한 수평적 규모 확장이 가능하다.
- 고가용성 : 레플리카 샤드(Replica Shard)를 통해 데이터의 안정성을 보장한다.
- Schema free : json 문서 구조로 된 데이터를 사용한다.
- RESTful : HTTP의 RESTful API를 통해 데이터 CRUD 작업
- RESTful API를 사용한다는 것은 다양한 플랫폼에서 응용이 가능해진다.
- Multi-tenancy : 서로 다른 인덱스에서 필드명이 같을 경우 한 번에 조회 가능
- 불변성
- 수정이 불가하며 Update 시 데이터를 삭제하고 다시 생성한다.
- 다중 스레드 환경에서 동시성 문제 회피(수정이 불가하므로 lock 필요없음)
- 높은 시스템 캐시 활용도(수정할 경우 시스템 캐시 삭제 및 재생성이 필요)
ElasticSearch 단점
- 실시간 처리가 불가능하다.
- ES는 인메모리 버퍼를 사용하므로 쓰기와 읽기를 동시에 작업할 경우 세그먼트가 생성되기 전까지 해당 데이터를 검색할 수 없다.
- 트랜잭션을 지원하지 않는다.
- 분산 시스템 구성의 특징 때문에 시스템 비용 소모가 큰 트랜잭션, 롤백을 지원하지 않는다.
- 진정한 의미의 업데이트를 지원하지 않는다.
- 세그먼트에서 데이터가 업데이트하면 soft-delete를 하고 수정된 데이터를 새로운 세그먼트로 생성한다.
Reference :