Elasticsearch 구조

dhjung 기술 블로그·2021년 3월 31일
0

Elasticsearch

목록 보기
2/5

1. Elasticsearch 구조

Elasticsearch Architecture/용어에 대한 정리입니다.

1) 클러스터(Cluster)

클러스터란 Elasticsearch에서 가장 큰 단위라고 생각하면 됩니다. 하나 이상의 노드로 이루어진 노드들의 집합입니다.
클러스터는 독립적이므로 서로 다른 클러스터에 접근을 할 수 없는 구조입니다.
여러 대의 서버가 하나의 클러스터를 구성할 수 있고, 한 서버에 여러개의 클러스터가 존재할 수 있어 사용자가 환경에 맞게 설정할 수 있습니다.

2) 노드(Node)

Elasticsearch를 구성하는 하나의 인스턴스를 의미합니다.
노드는 그 역할에 따라 크게 Master, Data, Ingest, Coordinating Node로 나누어집니다.

다음은 각 노드들에 대한 설명입니다.

Master Node

클러스터를 제어, 관리하는 노드입니다.
마스터 노드는 인덱스 생성, 삭제, 데이터를 어떤 샤드에 할당할지에 결정하는 역할을 수행합니다.

Data Node

실질적인 데이터를 저장하는 노드입니다. 데이터가 실제로 분산 저장되는 물리공간인 샤드가 배치되어 있습니다.

Elasticsearch 버전이 업그레이드 되면서 Data Node에도 좀 더 다양화가 되었습니다.
현재 Data Node는 Content Data, Hot Data, Warm Data, Cold Data, Frozen Data로 세분화 되었습니다.

  • Content Data

    Content Data 노드는 유저가 만든 콘텐츠를 수용하는 노드입니다. CRUD, 검색 및 집계와 같은 작업을 가능하게 합니다.

  • Hot Data

    Hot Data 노드는 시계열 데이터를 저장합니다. 해당 노드는 read/write가 빠르며 더 많은 하드웨어 리소스(SSD)가 필요하기 때문에 고사양의 서버에 적합합니다.

  • Warm Data

    Warm Data 노드는 더 이상 업데이트가 되지 않지만 쿼리를 실행하는 인덱스를 저장합니다. 즉 오래된 데이터이지만 활용하고 있는 데이터를 보관합니다. 일반적으로 이 노드는 성능이 낮은 하드웨어를 사용할 수 있습니다.

  • Cold Data

    Cold Data 노드는 읽기 전용 인덱스를 저장합니다.(자주 사용하지 않는 인덱스)
    읽기 전용 데이터의 경우 클러스터 저장공간을 최대 50% 절약 가능합니다.
    레플리카를 스냅샷으로 저장하고 스냅샷 저장소에 오프로드 합니다.
    검색 가능 스냅샷을 이용해서 데이터 복원성을 강화하였습니다.

  • Frozen Data

    Frozen Data 노드는 shared_cache 옵션으로만 마운트 된 검색 가능한 스냅샷을 저장합니다.
    즉 스냅샷 데이터를 해당 노드에 저장하고 데이터를 검색 가능하도록 하는 노드입니다.

Ingest Node

데이터를 변환하는 등 사전 처리 파이프라인을 실행하는 역할을 하는 노드입니다.

Coordination Node

사용자의 요청을 받아서 클러스터 관련 요청은 마스터 노드에 전달하고, 데이터 관련 요청은 데이터 노드에 전달하는 역할을 담당합니다.
별도로 지정하지 않았다면 모든 노드가 코디네이션 노드 역할을 수행하게 됩니다.
대량의 노드로 구성된 클러스터라면 코디네이션 노드를 지정하여 역할을 분리하는 것이 더 안정적입니다.

3) 샤드(Shard)

인덱스 내부에는 색인된 데이터들이 존재하는데 이 데이터들은 물리적 공간에 여러 개로 나뉘어서 존재합니다. 이러한 부분을 샤드(shard)라고 합니다. 샤드는 루씬의 단일 검색 인스턴스입니다.

인덱스를 생성할 때 별도의 설정을 하지 않으면 7.x 버전부터는 1개의 샤드로 인덱스가 구성되며 그 이하 버전에서는 5개로 구성됩니다.

처음 생성된 샤드를 Primary Shard(프라이머리 샤드), 복제본을 Replica(레플리카)라고 지칭합니다.

레플리카는 원본 shard가 장애가 발생하더라도 복제본 shard를 통해 데이터를 제공할 수 있어 장애 대응에 효과적입니다.

예를 들어 한 인덱스가 5개의 샤드로 구성되어 있고, 클러스터가 2개의 노드로 구성된다면 위 그림처럼 레플리카가 분배됩니다.

4) 세그먼트(Segment)

세그먼트(segment)란 엘라스틱서치에서 문서의 빠른 검색을 위해 설계된 자료구조입니다. 하나의 샤드는 다수의 세그먼트로 구성되어 있습니다.
엘라스틱서치에 데이터를 색인하면 엘라스틱서치는 이것을 메모리에 모아두고 새로운 세그먼트를 디스크에 기록하여 검색을 리프레쉬하여 새로운 검색 가능한 세그먼트가 만들어집니다.

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

세그먼트는 불변의 성질을 가지고 있기 때문에 데이터가 업데이트되면 실제로는 삭제되었다고 마크만 하고 새로운 데이터를 가르키게 됩니다. 그리고 삭제되었다고 마크된 데이터는 디스크에 남아있다가 백그라운드에서 주기적으로 또는 특정 임계치를 넘기면 더이상 필요없어진 데이터들을 정리하고 새로운 세그먼트로 병합한 후 세그먼트를 디스크에서 완전히 삭제되는데 이를 세그먼트 병합이라고 합니다.

세그먼트 병합 시에는 새로운 세그먼트를 만들 공간이 있어야 하기 때문에 디스크가 꽉 찬 상태에서는 수행할 수 없으며 세그먼트 병합은 시스템 자원을 많이 쓰는 부담스러운 작업이므로 시스템 자원이 여유로울 때 진행합니다.

참고
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html#master-node
https://victorydntmd.tistory.com/308
https://twofootdog.tistory.com/53

profile
빅데이터, 데이터 엔지니어

0개의 댓글