[elasticsearch] elasticsearch의 기본 개념(특징, 구조)

HI·2022년 5월 13일
0

1. Elasticsearch의 개념


Elasticseasrch란 아파치 루씬(Lucene)기반의 오픈소스 실시간 분산 검색 엔진으로 JSON 기반의 비정형 데이터 분산 검색 및 분석을 지원한다. 서버를 추가해 노드를 계속해서 늘릴 수 있다는 장점이 있다. 실시간 검색, 분산 및 병렬처리, 그리고 멀티테넌시 기능을 제공하고 다양한 기능을 플러그인 형태로 구현하여 적용할 수 있다는 것이 가장 큰 특징이다.

1.1 특징


1) 분산/확장성/병렬처리

Elasticsearch 구성 시 보통 3개 이상의 노드로 클러스터를 구성한다.
이는 데이터가 샤드(shard)로 저장되어 replica(복사본)을 만들어서 노드 하나가 떨어져서 2노드는 정상적으로 작동할 수 있게 하기 때문이다. 이런 데이터의 안정성을 보장할 수 있다. 또한 데이터의 분산과 병렬처리가 되므로 실시간 검색 및 분석이 가능하고, 노드를 수평적으로 늘릴 수 있게 설계되어, 많은 용량이 필요한 경우 노드를 클러스터에 추가 가능하다.

2) 고가용성

Elasticseasrch는 동작중에 죽은 노드를 감지하고 삭제하며 사용자의 데이터를 아전하고 접근 가능하도록 유지하기 때문에, 동작중에 일부 노드에 문제가 생기더라도 문제 없이 서비스를 제공한다.

3) 멀티 테넌시

클러스터는 여러개의 인덱스들을 저장하고 관리하며, 하나의 쿼리나 그룹 쿼리로 여러 인덱스의 데이터를 검색할 수 있다.

4) 문서중심 & 스키마 미존재

복잡한 현실 세계의 요소들을 구조화된 JSON 문서 형식으로 저장한다.
모든 필드는 기본적으로 인덱싱되며, 모든 인덱스들은 단일 쿼리로 빠르게 검색 및 활용가능하다.
또한 NoSQL나 RDBMS와 같은 스키마 개념이 없으며, 사용자의 데이터가 어떻게 인덱싱 될 것인지를 사용자가 커스터마이징 할 수 있다.

5) 플러그인 형태로 구현

검색엔진을 직접 수행하지 않고, 필요한 기능에 대한 플러그인을 적용하여 기능을 확장할 수 있다. 예를 들면 외부에서 제공하는 형태소 분석기나 REST API를 구현하여 적용할 수 있다.


2. Elasticsearch 구조

2.1 논리적 구조

1) 도큐먼트(Document)

Elasticsearch 데이터 최소 단위. JSON 오브젝트 하나. 하나의 Document는 다양한 필드로 구성되어 있으며, 이 필드에는 데이터 필드에 해당하는 데이터 타입이 들어감.
중첩구조를 지원하기 때문에 Document 내부에 Document가 들어가는 것도 가능함.

2) 필드(Field)

필드(Field)는 Document에 들어가는 데이터 타입으로 RDBMS의 열과 비슷하다. Elasticsearch에서는 하나의 필드가 여러개의 데이터 타입을 가질 수 있다.

3)매핑(Mapping)

매핑(Mapping)은 필드와 필드의 속성을 정의하고 색인 방법을 정의한다. 매핑 정보에 여러가지 데이터 타입 지정이 가능하지만 필드명 자체는 중복이 불가능하다.

4) 인덱스(Index)

Elasticsearch를 클러스터로 구성했을 때 Index는 여러 노드에 분산 저장/관리가 된다.

2.2 물리적 구조


1)노드

노드는 Elasticsearch 클러스터에 포함된 단일 서버로 데이터를 저장하고 클럿터으 ㅣ색인화 및 검색 기능에 참여한다. 노드는 클러스터처럼 이름으로 식별되며, 원한다면 특정 노드 이름으로 정의할 수 있으며 관리의 목적에 맞게 정의한다.

2) 샤드(Shard)

인덱스(index)의 내부에는 색인된 데이터들이 존재하는데 이 데이터들은 하나로 뭉쳐서 존재하지 않고 물리적 공간에 여러개의 부분들로 나뉘어서 존재한다. 이러한 부분들을 샤드(Shard)라고 한다.

3) 세그먼트(Segment)

세그먼트(Segment)란 Elasticsearch에서 문서의 빠른 검색을 위해 설계된 자료구조이다. 각 샤드는 다수의 세그먼트로 구성되어 있다.
엘라스틱서치에서 데이터(Document)를 저장하면, Elasticsearch에서는 이것을 메모리에 모아두고 새로운 세그먼트를 디스크에 기록하여 검색을 리프레쉬(refresh)한다. 이로 인해 새로운 검색 가능한 세그먼트가 만들어지게 된다.
샤드에서 검색 시, 먼저 각 세그먼트를 검색하여 결과를 조합한 후 최종 결과를 해당 샤드의 결과로 리턴하게 된다.
세그먼트는 불변의 성질을 가지고 있기 때문에 데이터가 업데이트되면 실제로는 삭제되었다고 마크만 하고 새로운 데이터를 가르킨다. 그리고 삭제되었다고 마크된 데이터는 디스크에 남아있다가 백그라운드에서 주기적으로 또는 특정 임계치를 넘기면 더 이상 필요없어진 데이터들을 정리하고 새로운 세그먼트로 병합한 후 세그먼트를 삭제하며 이때 비로소 디스크에서 완전히 삭제되는데 이를 세그먼트 병합(Segment Merge)라고 한다.
세그먼트 병합 시에는 새로운 세그먼트를 만들 공간이 있어야 하기 때문에 디스크가 꽉 찬 상태에서는 수행할 수 없으며, 세그먼트 병합은 시스템 자원을 많이 쓰는 부담스러운 작업이므로 시스템 자원이 여유로울 때 시스템에 영향을 주지 않는 선에서 진행된다.

[참고]
https://twofootdog.tistory.com/53
https://www.elastic.co/guide/kr/elasticsearch/reference/current/gs-basic-concepts.html

profile
hi

0개의 댓글