본문 바로가기
ELK stack

[ELK] 12. elasticsearch 샤드

by 천뿌니 2022. 7. 4.
728x90

Elastisearch에서는 단일 데이터 단위를 도큐먼트라고 하며 이 도큐먼트를 모아놓은 집합을 인덱스라고 합니다.

인덱스는 RDB에서 테이블과 같은 개념이라고 보시면 됩니다. 

여기선 데이터를 Elasticsearch에 저장하는 행위는 색인, 그리고 도큐먼트의 집합 단위는 인덱스라고 하겠습니다.

 

인덱스는 기본적으로 샤드라는 단위로 분리되고 각 노드에 분산되어 저장됩니다. 샤드는 루씬 기반의 단일 검색 인스턴스입니다. 다음은 하나의 인덱스가 5개의 샤드로 저장되도록 설정한 예제입니다.

 

프라이머리 샤드(Primary Shard)와 복제본(Replica)

인덱스를 생성할 때 별도의 설정이 없다면 디폴트로 1개의 샤드로 인덱스가 구성됩니다. 그리고 클러스터에 노드를 추가하면 샤드들이 각 노드들로 분산되고 디폴트로 1개의 복제본을 생성합니다.

처음 생성된 샤드를 프라이머리 샤드(Primary Shard), 복제본은 리플리카(Replica)라고 부릅니다.

예를 들어, 한 인덱스가 5개의 샤드로 구성되어 있고, 클러스터가 4개의 노드로 구성되어 있다면 각각 5개의 샤드들이 전체 노드에 골고루 분배되어 저장됩니다.

 

주의!  노드가 1개만 있는 경우 프라이머리 샤드만 존재하고 복제본은 생성되지 않습니다. elasticsearch는 아무리 작은 클러스터라도 데이터 가용성과 무결성을 위해 최소 3개의 노드로 구성할 것을 권장하고 있습니다.

 

같은 샤드와 복제본은 동일한 데이터를 담고 있으며 반드시 서로 다른 노드에 저장됩니다. 

만약 위 그림에서 Node-3 노드가 사라지면 0, 4번 샤드가 유실하게 됩니다. 하지만 아직 다른 노드들에 0,4번 샤드가 남아있으므로 여전히 전체 데이터는 유실 없이 사용이 가능합니다.

처음에 클러스터는 먼저 유실된 노드가 복구되기를 기다립니다. 하지만 타임아웃이 지나 복구되지 않는다고 판단이 되면 Elasticsearch는 복제본이 사라져 1개만 남은 0, 4번 샤드들의 복제를 시작합니다.

복제가 끝나면 총 10개의 데이터로 유지가 됩니다.

이렇게 프라이머리 샤드와 리플리카를 통해 Elasticsearch는 운영 중에 노드가 유실되어도 데이터를 잃어버리지 않고 데이터의 가용성과 무결성을 보장합니다.

 

프라이머리 샤드가 유실된 경우 새로 프라이머리 샤드가 생성되는 것이 아니라, 남아있던 복제본이 프라이머리 샤드로 승격이 되고 다른 노드에 새로 복제본을 생성하게 됩니다.

 

 

샤드 개수 설정

샤드의 개수는 인덱스를 처음 생성할 때 지정할 수 있습니다. 프라이머리 샤드 수는 인덱스를 처음 생성할 때 지정하며, 인덱스를 재색인 하지 않는 이상 바꿀 수 없습니다. 복제본의 개수는 나중에 변경이 가능합니다.

아래는 curl 명령을 통해 REST API로 샤드가 5개, 복제본은 1개인 books라는 이름의 인덱스를 생성하는 예제입니다.

$ curl -XPUT "http://localhost:9200/books" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  }
}'

books 인덱스의 복제본 수를 0으로 변경하려면 아래 명령으로 업데이트가 가능합니다.

$ curl -XPUT "http://localhost:9200/books/_settings" -H 'Content-Type: application/json' -d'
{
  "number_of_replicas": 0
}'

만약에 4개의 노드를 가진 클러스터에 프라이머리 샤드 5개, 복제본 1개인 books 인덱스, 그리고 프라이머리 샤드 3개 복제본 0개인 magazines 인덱스가 있다고 하면 전체 샤드들은 아래와 같은 모양으로 배치될 수 있습니다.

 

 

마무리

이번 포스팅은 elasticsearch에서 중요한 개념인 샤드에 대해서 알아보았습니다. 또 다른 개념인 역 인덱스 개념은 아래 데이터 색인과 텍스트 분석에 포스팅했으므로 참고해주시면 감사하겠습니다.

2022.06.26 - [ELK stack] - [ELK] 4. elasticsearch 데이터 색인과 텍스트 분석

다음 포스팅은 ELK stack에서 시각화를 담당하고 있는 kibana에 대해 알아보고 실습까지 진행해보겠습니다. 감사합니다.

댓글