Elastic Search

[Elasticsearch] Components 정리

꾸준함. 2022. 10. 12. 14:22

개요

Elasticsearch의 주요 구성 요소들인 Cluster, Node, Index, Shard, 그리고 Document에 대해서 간단하게 정리해보겠습니다.

Term > Field > Document > Shard > Index > Node > Cluster 순으로 상위 개념이라고 보시면 됩니다.

 

주의: 현재 시점 Elasticsearch 최신 버전은 8.4이며 현업에서 대부분 7.X 이상 버전이 쓰이고 있습니다. 참고한 공식 한글 문서는 5.4 버전이며 이후 버전에 대해서는 갱신이 되지 않은 상태입니다. 7.X 버전부터 기본 샤드 개수와 같이 변경된 내용이 있으므로 확인이 필요합니다.

 

1. Cluster

클러스터는 하나 이상의 노드(서버)가 모인 것이며, 이를 통해 전체 데이터를 저장하고 모든 노드를 포괄하는 통합 색인화 및 검색 기능을 제공합니다.

클러스터는 고유한 이름으로 식별되므로 cluster.name 설정이 중요한데, default 이름은 "elasticsearch"입니다.

cluster.name이 중요한 이유는 어떤 노드가 어느 클러스터에 포함되기 위해서는 설정된 이름에 의해 클러스터의 구성원이 되도록 설정되기 때문입니다.

클러스터는 하나 이상의 노드로 구성해야 하며 단 하나의 노드로 구성해도 무방합니다.

또한, 각자 고유한 클러스터 이름을 가진 독립적인 클러스터를 여러 개 둘 수도 있습니다.

마지막으로 클러스터 구성 시 node 역할에 따른 구성이 필수이며 split brain에 대한 오류를 예방하기 위해 master node에 대한 quorum 구성을 필수적으로 진행해야 합니다.

 

주의

동일한 클러스터 이름을 서로 다른 환경에서 재사용할 경우 노드가 잘못된 클러스터에 포함될 위험이 있습니다.

예를 들어 개발, 스테이징, 프로덕션 클러스터를 모두 'logging'이라는 이름으로 구성하지 말고 'logging-dev', 'logging-stage', `logging-prod`라는 이름을 사용할 수 있습니다.

 

1.1 추가 설명

 

마스터 노드 선출 과정 (quorum 기반 의사 결정)

https://m1zz.github.io/temp/master-election/

 

마스터노드 선출 프로세스

쿼럼 기반 의사 결정Quorum-based decision making

m1zz.github.io

 

split brain

https://esbook.kimjmin.net/03-cluster/3.3-master-and-data-nodes

 

3.3 마스터 노드와 데이터 노드 - Master & Data Nodes - Elastic 가이드북

위의 경우 데이터는 노드 node-4, node-5의 데이터만 사용이 가능하고 node-6은 네트워크가 복구될 때 까지 동작하지 않고 노드가 분리되기 이전 상태 그대로 유지됩니다. 이렇게 하면 나중에 클러스

esbook.kimjmin.net

 

2. Node

노드는 클러스터에 포함된 단일 서버로서 데이터를 저장하고 클러스터의 색인화(Indexing) 및 검색 기능에 참여하며 노드들의 모음이 클러스터입니다.

또한, 노드는 Elasticsearch 인스턴스가 시작될 때마다 실행됩니다.

노드는 클러스터처럼 이름(node.name)으로 식별되는데, 기본 이름은 시작 시 노드에 지정되는 임의 UUID(Universally Unique IDentifier)이며 별도 지정도 가능합니다.

노드명 설정이 중요한 이유는 네트워크의 어떤 서버가 Elasticsearch 클러스터의 어떤 노드에 해당하는지 식별해야하기 때문입니다.

노드는 클러스터명을 통해 어떤 클러스터의 일부로 구성될 수 있으며 기본적으로 각 노드는 `elasticsearch`라는 이름의 클러스터에 포함되도록 설정됩니다.

즉, 네트워크에서 다수의 노드를 시작할 경우 (각각을 검색할 수 있다고 가정하면) 이 노드가 모두 자동으로 `elasticsearch`라는 단일 클러스터를 형성하고 이 클러스터의 일부가 됩니다.

앞서 말했다시피 클러스터는 한 개 이상의 노드로 구성되며 단일 노드로 구성할 경우 단일노드 클러스터라고 칭합니다.

현재 네트워크 상에서 실행되고 있는 Elasticsearch 노드가 없는 상태에서 단일 노드를 시작하면 기본적으로 `elasticsearch`라는 이름의 새로운 단일 노드 클러스터가 생깁니다.

노드의 역할을 정의해서 용도와 목적에 맞게 운영하는 것이 중요한데 13 가지 역할 중 대표적인 역할인 Master, Data 그리고 Coordination 노드에 대해 아래에 간략하게 설명하겠습니다.

 

2.1 Master 노드

  • 개별 노드와 인덱스에 대한 상태 관리 및 메타 정보 관리하는 노드
  • 특성에 맞게 CPU, 메모리에 대한 시스템 자원이 충분하게 지원되어야 함

 

2.2 Data 노드

  • 색인한 문서의 Shard가 저장되어 있는 노드
  • 문서에 대한 CRUD, 검색, 그리고 집계와 같은 데이터 작업 처리 담당
  • Disk I/O, CPU, 메모리 등에 대한 자원이 충분히 지원되어야 함

 

2.3 Coordinating 노드

  • 검색 요청이나 대량 색인 요청에 대한 라우팅 역할
    • 불필요한 요청을 Master나 Data노드에서 처리할 경우 부하가 발생하기 때문에 라우팅 필요
  • Master 노드와 유사하게 CPU, 메모리에 대한 자원이 충분하면 좋음

 

* 노드의 역할 13가지: master, data, data_content, data_hot, data_warm, data_cold, data_frozen, ingest, ml, remote_cluster_client, transform, voting_only, coordinating

* node.roles를 별도 설정하지 않을 경우 default로 master, data, ingest, transform, remote_cluster_client가 true (ml과 voting_only는 false)

* 모든 노드들은 coordinating 노드 역할을 수행함

 

3. Index

색인(index)은 분산된 Shard에 저장된 문서들(document)의 논리적 집합이며 Lucene 기준의 index를 Elasticsearch에서는 Shard라고 합니다.

물리적으로는 Shard 하나가 하나의 독립된 Index로 동작하며, Lucene에서 IndexWriter가 Shard 당 하나씩 생성합니다.

인덱스는 Primary Shard와 Replica Shard로 구성되며 data 노드에만 위치합니다.

데이터 유형에 따라 hot, warm, cold, frozen과 같이 분리한 뒤 ILM(Information Lifecycle Management)을 이용해서 용량에 따른 rolling도 가능합니다.

 

3.1 인덱싱 예시

이를테면 고객 데이터에 대한 색인, 제품 카탈로그에 대한 색인, 주문 데이터에 대한 색인을 각각 둘 수 있습니다.

색인은 모두 소문자로 구성된 이름으로 식별되며, 이 이름은 색인에 포함된 문서에 대한 색인화, 검색, 업데이트, 삭제 작업에서 해당 색인을 가리키는 데 쓰입니다.

 

3.2 ILM이란?

https://www.samsungsds.com/kr/insights/1232563_4627.html

 

ILM이란 무엇인가?

ILM이란 무엇인가?

www.samsungsds.com

 

4. Shard

색인(Index)은 방대한 양의 데이터를 저장할 수 있는데, 해당 데이터가 단일 노드 내 하드웨어 한도를 초과할 수도 있습니다.

예를 들어, 10억 개의 문서로 구성된 하나의 색인에 1TB의 디스크 공간이 필요할 경우, 단일 노드의 디스크에서 수용하지 못하거나 단일 노드에서 검색 요청 처리 시 속도가 너무 느려질 수 있습니다.

Elasticsearch는 이러한 문제를 해결하고자 색인을 이른바 샤드(shard)라는 조각으로 분할하는 기능을 제공합니다.

색인을 생성할 때 원하는 샤드 수를 간단히 지정할 수 있으며 각 샤드는 그 자체가 온전한 기능을 가진 독립적인 index이며, 클러스터의 어떤 노드에서도 호스팅 할 수 있습니다.

 

샤딩은 무엇보다도 아래와 같이 2가지 이유로 중요합니다.

  • 콘텐츠 볼륨의 수평 분할/확장이 가능
  • 작업을 여러 샤드에 분산 배치하고 병렬화함으로써 성능/처리량을 늘림

샤드가 분산 배치되는 방식과 문서가 다시 검색 요청으로 집계되는 방식의 메커니즘은 모두 Elasticsearch에서 관리하며 사용자에게는 투명하게 이루어집니다.

언제든 오류가 일어날 가능성이 있는 네트워크/클라우드 환경에서는 어떤 이유에서든 샤드/노드가 오프라인 상태가 되거나 사라지게 될 경우에 대비하여 페일오버 메커니즘을 마련하는 것이 바람직합니다.

이러한 취지에서 Elasticsearch에서는 Index의 Shard에 대해 하나 이상의 복사본을 생성할 수 있는데, 이를 레플리카 샤드(replica shard), 줄여서 레플리카라고 합니다.

 

레플리카 샤드는 아래와 같이 2가지 이유로 중요합니다.

  • 샤드/노드 오류가 발생하더라도 고가용성을 제공, 따라서 레플리카 샤드는 그 원본인 기본 샤드(Primary Shard)와 동일한 노드에 배정되지 않음
  • 모든 레플리카에서 병렬 방식으로 검색을 실행할 수 있으므로 검색 볼륨/처리량을 확장 가능

 

요약하자면 각 Index는 여러 개의 샤드로 분할할 수 있으며 하나의 인덱스는 복제하지 않거나(레플리카 없음) 1회 이상 복제할 수 있습니다.

복제되면 각 색인은 기본 샤드(복제 원본 샤드)와 레플리카 샤드(기본 샤드의 복사본)를 갖습니다.

샤드 및 레플리카의 수는 색인별로, 색인 생성 시점에 정의할 수 있습니다.

색인이 생성된 다음 언제라도 탄력적으로 레플리카의 수를 변경할 수 있으나, 샤드 수는 사후 변경이 불가합니다.

기본적으로 Elasticsearch의 각 색인은 기본 샤드 1개, 리플리카 1개를 갖습니다. (Elasticsearch 7.X 버전부터 기본 샤드 1개 그 이전 버전은 기본 샤드 5개)

 

마지막으로, health status 정의는 샤드의 상태를 가지고 정의하며 아래와 같이 크게 3가지 케이스가 존재합니다.

  • 모든 샤드가 정상적으로 할당 되었을 경우
  • Primary shard는 정상적으로 할당이 되었으나 replica shard 중 일부라도 할당이 되지 않았을 경우의 상태 (서비스는 정상적으로 동작)
  • Primary shard 중 하나 이상이 할당되지 않았을 경우의 상태 (서비스도 정상적으로 동작하지 않음)

 

4.1 Primary Shard와 Replica Shard 정리

 

Primary Shard

  • 색인 요청이 들어오면 가장 먼저 생성해서 문서를 저장하게 되는 샤드 (원본 데이터)
    • 이를 기반으로 데이터를 복제하여 활용
  • 색인 성능을 개선하기 위한 포인트로 활용
  • data 노드의 크기와 CPU 코어 크기를 고려해서 primary shard 크기를 설정

 

Replica Shard

  • primary shard를 기준으로 복제하는 샤드
  • 검색 성능을 개선하기 위한 용도로 활용

 

5. Document

Document는 색인화할 수 있는 기본 정보 단위입니다.

예를 들어 어떤 단일 고객, 단일 제품, 단일 주문에 대한 문서가 각각 존재할 수 있으며 이 문서는 JSON(JavaScript Object Notation) 형식입니다.

 

6.  Elasticsearch Components 시각화

 

https://www.quora.com/What-are-nodes-shards-and-clusters-in-elastic-search

 

7.  참고

https://www.elastic.co/guide/kr/elasticsearch/reference/current/gs-basic-concepts.html

 

기본 개념 | Elasticsearch 설명서 [5.4] | Elastic

각 Elasticsearch 샤드는 Lucene 색인입니다. 단일 Lucene 색인이 포함할 수 있는 문서 수의 최대 한도가 있습니다. LUCENE-5843에 따르면 2,147,483,519`개(= Integer.MAX_VALUE - 128)입니다. {ref}/cat-shards.html[`_cat/shards

www.elastic.co

https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html

 

Index modules | Elasticsearch Guide [8.4] | Elastic

Expert users only. This setting enables some very expensive processing at shard startup and is only ever useful while diagnosing a problem in your cluster. If you do use it, you should do so only temporarily and remove it once it is no longer needed. Elast

www.elastic.co

패스트캠퍼스 - The RED: 검색엔진 구축을 위한 Elasticsearch 마스터 클래스 by 정호욱

 

반응형