[Elasticsearch] 기본개념 이해하기

2019. 8. 16. 13:20Elasticsearch

개요

엘라스틱서치 데이터 간략 소개

엘라스틱서치는 검색 엔진인 아파치 루씬 (Apache Lucene)으로 구현한 RESTful API 기반의 검색 엔진입니다.

엘라스틱서치 아키텍쳐는 클러스터 기반으로 구성되어 있는데요,

클러스터를 디자인할 때 알아야 할 두 개의 기본적인 특징이 있습니다.

1. 수평 확장

클러스터를 사실상 무한으로 확장할 수 있습니다.

2. 인덱스 샤딩

엘라스틱서치는 인덱스를 조각내서 "샤드 (shard)"라는 조각난 데이터로 만듭니다.

때문에 나누어진 데이터를 편하게 각 호스트에 분리해서 보관할 수 있습니다.

조금 더 자세한 엘라스틱서치 데이터와 클러스터 구조는 아래 섹션에서 다루도록 하겠습니다.

RDBMS와 용어 비교

RDBMS

Elasticsearch

schema

mapping

database

index

table

type

row

document

column

field


엘라스틱서치 데이터 구조

엘라스틱서치 데이터 다이어그램

엘라스틱서치는 위와 같이 데이터 (document)를 엘라스틱 인덱스로 만든 뒤, 샤드로 분리하여 보관하고 있습니다.

샤드는 논리적/물리적으로 분할된 인덱스인데, 각각의 엘라스틱서치 샤드는 루씬 인덱스이기도 합니다.

루씬은 새로운 데이터 (document)를 엘라스틱서치 인덱스에 저장할 때 "세그먼트 (segment)"를 생성하는데요,

루씬의 인덱스 조각인 이 세그먼트를 조합해 저장한 데이터의 검색을 할 수 있습니다.

색인 (indexing) 처리량이 매우 중요할 때는 세그먼트를 더 생성하기도 합니다.

루씬은 순차적으로 세그먼트를 검색하므로 세그먼트 수가 많아지면 검색속도도 따라서 느려지게 됩니다.

엘라스틱서치 데이터 설명

데이터

설명

index

데이터를 저장 및 색인 (indexing)하는 곳으로, 관계형 DB의 데이터베이스 개념과 유사합니다.

실제로는 각 샤드를 가리키고 있는 논리적인 네임스페이스입니다.

shard

샤드는 엘라스틱서치에서 사용하는 검색 엔진인 루씬의 인스턴스입니다.

인덱스를 한 개의 샤드로 구성할 수도 있지만, 인덱스 사이즈가 증가할 경우 여러개의 물리서버에 나누어 보관하기 위해 보통은 여러개의 샤드로 구성합니다.

segment

각 샤드는 다수의 세그먼트를 가지고 있습니다.

샤드에서 검색 시, 먼저 각 세그먼트를 검색하여 결과를 조합한 최종 결과를 해당 샤드의 결과로 리턴하게 됩니다.

엘라스틱서치에 데이터 (document)를 저장하면, 엘라스틱서치는 이것을 메모리에 모아두고 새로운 세그먼트를 디스크에 기록하여 검색을 리프레시합니다.

이로 인해 새로운 검색 가능한 세그먼트가 만들어지게 됩니다. (이를 "searchable" segment라고 합니다)

그러나 세그먼트가 fsync되지 않았으므로 여전히 데이터 손실의 위험이 남아있습니다.

그래서 엘라스틱서치는 세그먼트를 fsync하는 "flush"를 주기적으로 진행하고, 불필요한 트랜젝션 로그를 비웁니다. (이를 "commited" segment라고 합니다)

refresh(), flush(), commit()

 

세그먼트는 불변입니다. 데이터 (document)가 업데이트되면 실제로는 그저 삭제되었다고 마크하고 새로운 데이터 (document)를 가리킬 뿐입니다.

이러한 오래된 삭제된 데이터를 지우는 것이 바로 "merge process"입니다.


엘라스틱서치 클러스터 구조

엘라스틱서치 클러스터 다이어그램

이름

개수

Elasticsearch Instance

3

Index

1

Shard

4

Replica

2

위 다이어그램은 3개의 엘라스틱서치 인스턴스 환경에서, 4개의 샤드를 2개의 복제본으로 구성했을 때의 구조입니다.

엘라스틱서치는 클러스터 구조로 구성되어 있으며 샤드와 복제본의 수를 설정해두면 스스로 각 노드에 샤드를 분배하여 장애발생 시 데이터 손실을 최소화합니다.

프라이머리 샤드가 손실되었을 경우에는 레플리카를 프라이머리로 승격시켜 데이터 손실을 방지합니다.


References

1. Nuxeo, Search and Lucene, Oh My! (https://www.elastic.co/blog/nuxeo-search-and-lucene-oh-my)

2. Understanding Segments in Elasticsearch (https://stackoverflow.com/questions/15426441/understanding-segments-in-elasticsearch)

3. Indices Segments (https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-segments.html)

4. Get Started with Amazon Elasticsearch Service: How Many Shards Do I Need? (https://aws.amazon.com/ko/blogs/database/get-started-with-amazon-elasticsearch-service-how-many-shards-do-i-need/)

5. Designing the Perfect Elasticsearch Cluster: the (almost) Definitive Guide (https://thoughts.t37.net/designing-the-perfect-elasticsearch-cluster-the-almost-definitive-guide-e614eabc1a87)

[출처] 엘라스틱서치 (Elasticsearch) 기본개념 이해하기|작성자 debugrammer

 

debugrammer : 네이버 블로그

기타가 펜더면 뭐하나요? 손꾸락이 펜더여야지...

blog.naver.com