Elasticsearch
Apache Lucene 기반의 Java 오픈소스 분산형 Restful 검색 및 분석 엔진입니다.
방대한 양의 데이터에 대해 실시간으로 저장과 검색 및 분석 등의 작업을 수행할 수 있습니다.
Elasticsearch는 정형 데이터, 비정형 데이터, 지리 데이터 등 모든 타입의 데이터를 처리할 수 있는데,
이를 JSON문서로 데이터를 저장할 수 있습니다.
Elasticsearch와 RDB 비교
Relational Database | ElasticSearch |
Database | Index |
Table | Type |
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는 데이터를 행렬 데이터로 저장하는 것이 아니라, JSON 문서로 직렬화된 복잡한 자료 구조를 저장하는 방식을 채택하고 있습니다. 따라서 기존 RDB에서 사용하던 용어를 그대로 사용하지 않습니다. 위에 표에 정리하였습니다.
Elasticsearch는 특정 문장을 입력받으면, 파싱을 통해 문장을 단어 단위로 분리하여 저장합니다. 또한 대분자를 소문자로 치환하거나 유사어 체크 등의 추가 작업을 통해 텍스트를 저장합니다.
Elasticsearch는 '역 색인'이라고 하는 자료 구조를 사용하는데, 이는 전문 검색에 있어서 빠른 성능을 보장합니다. 책의 전반부에 위치한 일반적인 목차가 Index라면, 책 후반부에 키워드마다 내용을 찾아볼 수 있도록 돕는 목차가 Reverted Index입니다.
역 색인은 Document에 등장하는 모든 고유한 단어들을 리스트업하고, 해당 단어들이 등장하는 Document들을 식별합니다. 색인은 최적화된 Document컬렉션이며, 각 Document는 데이터를 포함하고 있는 Key-Value 쌍으로 이루어진 Field의 컬렉션입니다.
Elasticsearch는 모든 Field의 데이터를 인덱싱하는데, 인덱싱된 Field는 각각의 최적화된 자료구조를 사용합니다. 텍스트 형식의 Field는 Inverted Index에 저장되며, 숫자 혹은 지리 관련 Field는 BKD 트리에 저장됩니다.
역인덱스 데이터 저장 구조와 검색
RDB는 특정 단어 검색 할때 Row 개수 만큼 확인을 해야하지만, 단어 기반으로 데이터를 저장하는 Elasticsearch는 특정 단어가 어디에 저장되어 있는지 이미 알고 있어 모든 Document를 검색할 필요가 없습니다.
하지만 수정과 삭제 할 때는 내부적으로 많은 리소스가 소요되어, RDBMS가 더 좋습니다.
Elasticsearch 구조
- Cluster
- 하나 이상의 노드로 이루어진 노드들의 집합
- 클러스터는 각각 독립적인 시스템을 유지 (다른 클러스터의 데이터 접근 교환 불가)
- 여러 대의 서버가 하나의 클러스터를 구성하거나, 하나의 서버에 여러 개의 클러스터가 존재 가능
- Node
- ElasticSearch를 구성하는 하나의 단위 프로세스
- Shard
- 데이터를 분산해서 저장하는 방법
- Sacle-Out을 위해 RDB의 Database에 해당하는 Index를 여러 Sahrd로 나눔
- 기본적으로 1개가 존재하고, 검색 성능 향상을 위해 클러스터의 Shard 개수를 조정
- Replica
- 다른 형태의 Shard로 노드를 손실 했을 경우, 데이터 신뢰성을 위해 Shard 복제
- 서로 다른 노드에 위치시킬 것을 권장ㄱ
노드 종류
- 대규모 클러스터에서 로드 밸런싱 역할
- 데이터 변환 등 사전 처리 파이프라인 역할
- 색인된 데이터 CRUD 역할
- 메타 데이터 등 전체 클러스터를 제어하는 역할
Elasticsearch 특징
- Scale out - Shard를 통해 규모가 수평적으로 늘어날 수 있습니다.
- 고가용성 - Replica를 통해 데이터의 안정성을 보장하고, 단일 장애점을 극복합니다.
- Schema Free - Json 문서를 통해 데이터를 검색하므로, 스키마의 개념이 없습니다.
- RESTful - CRUD 작업은 RESTful API를 통해 수행되며, 각각이 HTTP의 PUT/GET/POST/DELETE 메서드에 대응됩니다.
마무리
이번 시간에는 Elasitcsearch에 대해서 알아보겠습니다.
언젠가는 대규모 처리를 할 수 있는 날을 대비해 공부를 하였습니다.
다음시간에는 Spring Data Elasticsearch를 구현해보겠습니다.
감사합니다.
[참고]
1. Spring Data Elasticsearch 설정 및 검색 기능 구현