[DataBase] Elasticsearch 란?
공식 문서를 보며 정리해 보았습니다
https://www.elastic.co/guide/en/elasticsearch/reference/current/elasticsearch-intro.html
What is Elasticsearch? | Elasticsearch Guide [8.8] | Elastic
What is Elasticsearch?edit You know, for search (and analysis) Elasticsearch is the distributed search and analytics engine at the heart of the Elastic Stack. Logstash and Beats facilitate collecting, aggregating, and enriching your data and storing it in
www.elastic.co
1. Elasticsearch 란?
Elasticsearch는 Apache Lucene(아파치 루씬) 기반의 Java 오픈소스 분산 검색 엔진이다
Elasticsearch를 통해 루씬 라이브러리 (Java에서 개발한 정보 검색용 라이브러리)를
단독으로 사용할 수 있으며 방대한 양의 데이터를 신속하게 (거의 실시간)
저장, 검색, 분석을 수행할 수 있다
Elasticsearch는 검색을 위해 단독으로 사용되기도 하며
ELK(Elasticsearch / Logstash / Kibana) 스택으로 사용되기도 한다
- Elasticsearch
Logstash로 부터 받은 데이터를 검색 및 집계하여 필요한 정보를 획득 한다
- Logstash
다양한 소스(DB, csv 파일 등)의 로그 또는 트랜잭션 데이터를 수집, 집계, 파싱하여
Elasticsearch로 전달하는 역할을 한다
- Kibana
Elasticsearch의 빠른 검색을 통해 데이터를 시각화 및 모니터링 한다
2. Elasticsearch와 관계형 DB (RDBMS) 차이
Elasticsearch는 JSON 문서를 통해 검색을 수행해 스키마가 없다
RDBMS는 엄격한 스키마가 존재한다
Elasticsearch는 역색인 자료 구조로 검색을 수행한다
RDBMS는 인덱스 자료 구조로 검색을 수행한다
NoSQL은 없다
Elasticsearch는 실시간 처리가 불가능 하다
NoSQL은 실시간 처리가 가능하다
Elasticsearch는 저장소보다는 검색 엔진에 가깝다
3. Elasticsearch 의 구조
- Cluster (클러스터)
클러스터란 Elasticsearch에서 가장 큰 시스템 단위를 의미한다
최초 하나 이상의 노드로 이루어진 노드의 집합이라고 볼 수 있다
서로 다른 클러스터는 데이터 접근, 교환을 할 수 없는 독립적인 시스템이다
여러 대의 서버가 하나의 클러스터를 구성할 수 있고
한 서버에 여러 개의 클러스터가 존재할 수 있다
클러스터는 고유한 이름으로 식별 되는데, 기본 이름은 "Elasticsearch" 이다
- Node (노드)
노드는 클러스터에 포함된 단일 서버이다
데이터를 저장하고 클러스터의 색인화 및 검색 기능에 참여한다
노드는 역할에 따라 Master-eligible, Data, Ingest, Tribe 노드로 구분할 수 있다
1) Master-eligible
클러스터를 제어하는 마스터로 선택할 수 있는 노드이다
아래는 마스터 노드가 하는 역할이다
- 인덱스 생성, 삭제
- 클러스터 노드의 추적, 관리
- 데이터 입력 시 할당할 샤드 선택
2) Data Node
데이터가 저장되는 노드이다
데이터가 분산 저장되는 물리적 공간인 샤드가 배치되는 노드이다
CRUD, 색인, 검색, 통계 등의 데이터 작업을 수행하므로
많은 리소스(CPU, 메모리)를 필요로 한다
따라서 모니터링 작업을 해야하고 마스터 노드와는 분리해야 한다
3) Ingest Node
데이터를 변환하는 등 사전 처리 파이프라인을 실행하는 역할을 한다
4) Coordination Only Node
사용자의 요청을 받고 라운드 로빈 방식으로 분산을 하는 노드이다
클러스터에 관련된 것은 마스터 노드로 넘기고
데이터와 관련된 것은 데이터 노드로 넘긴다
로드밸런싱 역할을 하는 노드라고 보면 된다
4. Elasticsearch 의 기본 개념
- Document
Elasticsearch에서 데이터의 최소 단위이다
RDBMS에서의 Row (행) 와 비슷하다
Document는 JSON 객체이다
다양한 필드를 포함한다
Document 안에 Document 필드로 존재할 수 있다
- Field
Document안에 들어가는 데이터이다
RDBMS에서 Column (열) 과 비슷하다
- Type
여러 Document가 모여서 하나의 Type을 이룬다
RDBMS에서의 Table과 비슷하다
Elasticsearch 6.1 부터는 하나의 Index (여러 Type이 모인) 에
하나의 Type 만을 가질수 있게 되었고
7.0 부터는 Type이 사라지고 고정자 _doc 으로 접근해야 한다
- Index
데이터가 검색될 수 있는 구조로 변경하기 위해
원본 문서를 검색어 토글들로 변환하여 저장한 것 이다
여러 Type이 모여 한 개의 Index를 이룬다
RDBMS에서 Database의 역할을 한다
RDBMS에서는 여러 Database의 데이터를 한번에 조회 못하지만
Elasticsearch에서는 가능하다
Index는 Shard 라는 단위로 분산되어 저장된다
update 시에는 내부적으로 Document를 삭제 후 다시 insert 한다
그래서 수정이 잦은 문서는 Elasticsearch에 저장하는것은 비효율적이다
- Shard
Index가 분산되어 처리되는 단위를 뜻한다
각 Shard는 물리적 노드들에 나뉘어서 저장된다
Shard는 아래와 같이 두 종류로 나뉜다
- Primary Shard : 모든 Document들은 하나의 Primary Shard에 저장된다
Primary Shard의 기본 개수는 5개이다 (6.x 버전)
Primary Shard의 기본 개수는 1개이다 (7.x 버전) - Replica Shard : Primary Shard의 복제본이다
원본 데이터에 fault 발생 시 복구하기 위해 사용된다
Replica Shard의 기본 개수는 1개이다
노드가 1개이면 0개이다
- Segment
Segment는 Shard가 물리적으로 나뉘어서 저장되는 단위이다
Document가 처음부터 Segment에 저장되는 것은 아니다
Indexing된 Document는 먼저 시스템의 메모리 버퍼에 저장된다
이때 Document가 검색되지 않는다
Elasticsearch의 Refresh 과정을 거쳐야
Segment 단위로 Physically 저장되고 검색이 된다
Segment는 Immutable 하며 Document가 update 되면
새로운 Segment가 생성된다
Segment가 많아질수록 Search 할때 성능이 낮아질 수 있다
그래서 Elasticsearch 내부에서 background로
Segment Merging을 진행한다
- Mapping
Elasticsearch의 Index에 들어가는 데이터의 Type을 정의하는 것이다
RDBMS에서의 Schema와 유사하다
Elasticsearch 는 선 Indexin 후 Mapping을 지원한다
새로운 필드가 추가되면 동적으로 해당 필드 Indexing 후 Mapping 까지 해준다
5. Elasticsearch 의 장단점
장점
- Scale Out
샤드를 통해 규모가 수평적으로 늘어날 수 있다
- 고가용성
Replica를 통해 데이터의 안정성을 보장한다
- Schema free
JSON 문서를 통해 데이터 검색을 수행하므로 스키마 개념이 없다
- Restful
데이터 CRUD 작업은 HTTP Restful API를 통해 수행한다
단점
- 실시간 처리 불가
Elasticsearch는 인메모리 버퍼를 사용하므로 쓰기와 읽기 작업을 할때
세그먼트가 생성되기 전까지는 해당 데이터를 검색할 수 없다
- 트랜잭션 미지원
분산 시스템 구성의 특징 때문에 시스템적으로
비용 소모가 큰 트랜잭션 및 롤백을 지원하지 않는다
- 진정한 의미의 업데이트 미지원
세그먼트에서 데이터 삭제 시 soft-delete 한다 (삭제 flag = true)
세그먼트에서 데이터 수정 시 soft-delete 하고
수정된 데이터를 새로운 세그먼트로 생성한다
RDBMS의 Index와 유사한 동작
6. Elasticsearch 사용 이유
- 빠르다
Elasticsearch는 Lucene을 기반으로 구축되기 때문에, 풀텍스트 검색에 뛰어나다
Elasticsearch는 또한 거의 실시간 검색 플랫폼이다
문서가 색인될 때부터 검색 가능해질 때까지의 대기 시간이 아주 짧다는 뜻이다
대기 시간은 보통 1초이다
결과적으로, Elasticsearch는 보안 분석, 인프라 모니터링 같은 시간이 이상적이다
- 본질상 분산적이다
Elasticsearch에 저장된 문서는 샤드라고 하는 여러 다른 컨테이너에 걸쳐 분산된다
이 샤드는 복제되어 하드웨어 장애 시에 중복되는 데이터 사본을 제공한다
Elasticsearch의 분산적인 특징은 수백 개(심지어 수천 개)의 서버까지 확장하고
페타바이트의 데이터를 처리할 수 있게 해준다
- 광범위한 기능 세트와 함께 제공된다
속도, 확장성, 복원력뿐 아니라, Elasticsearch에는 데이터 롤업, 인덱스 수명 주기 관리 등
데이터를 훨씬 더 효율적으로 저장하고 검색할 수 있게 해주는
강력한 기본 기능이 다수 탑재되어 있다
- 데이터 수집, 시각화, 보고를 간소화 한다
Beats와 Logstash의 통합은 Elasticsearch로 색인하기 전에
데이터를 훨씬 더 쉽게 처리할 수 있게 한다
Kibana는 Elasticsearch 데이터의 실시간 시각화를 제공한다
UI를 통해 애플리케이션 성능 모니터링(APM), 로그, 인프라 메트릭 데이터에
신속하게 접근할 수 있다