Elasticsearch(Opensearch) - Index와 Shard

brillog·2023년 8월 14일
2

AWS

목록 보기
10/10

Elasticsearch docs를 통해 Elasticesearch(Opensearch)의 핵심 개념인 IndexShard에 대해 살펴보고 Index 당 적절한 Shard 수 설정에 대해 알아보겠습니다.

Index

Elasticsearch/Opensearch에서는 단일 데이터 단위를 도큐먼트(document)라고 하며 이 도큐먼트를 모아놓은 집합을 인덱스(Index)라고 합니다. (인덱스라는 단어가 여러 뜻으로 사용되기 때문에 데이터 저장 단위인 인덱스는 인디시즈(indices)라고 표현하기도 합니다.)

Shard

새로운 클러스터가 생성되었다면, 노드에는 아직 어떠한 index도 존재하지 않는 상태이며, 새로운 index를 생성할 때 인덱스를 몇 개의 shard로 나누어 저장할 것인지를 정의할 수 있습니다.

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

ES Shard

Primary Shard와 Replica

처음 생성된 샤드가 프라이머리 샤드(Primary Shard), 복제본이 리플리카(Replica)입니다.

ES Example 1

클러스터가 4대의 노드로 구성되어 있는 상황에서 인덱스의 샤드 수가 5일 경우, 모든 인덱스가 각각 5개의 primary shard와 1개의 replica(5개의 replica shard)를 갖게 되며 결론적으로 총 10개(5개+5개)의 샤드가 전체 노드 4대에 골고루 분배되어 저장되게 됩니다.

primary shard와 replica는 동일한 데이터를 담고 있으며 반드시 서로 다른 노드에 저장됩니다.

Elasticsearch의 default Shard 수

index를 생성할 때 별도의 설정을 하지 않으면 7.0 버전부터는 디폴트로 1개의 샤드로 인덱스가 구성되며, 6.x 이하 버전에서는 5개로 구성됩니다.
노드가 1개만 있는 경우, primary shard만 존재하고 replica는 생성되지 않습니다.
Elasticsearch는 아무리 작은 클러스터라도 데이터 가용성과 무결성을 위해 최소 3개의 노드로 구성할 것을 권장하고 있습니다.

Opensearch의 default Shard 수

각 index는 5개의 primary shard하나의 replica (= 총 10개의 샤드)로 구성됩니다.

Node 장애 발생 시

ES Example 2

만약 위 그림에서 Node-3 노드가 시스템 다운이나 네트워크 단절 등으로 사용이 불가능해지면 클러스터는 Node-3에 있던 0번과 4번 샤드를 유실하게 됩니다. 하지만 위에서 말했듯 primary shard와 replica는 반드시 서로 다른 노드에 저장되므로 아직 다른 노드들에 0번, 4번 샤드가 남아있으므로 여전히 전체 데이터는 유실없이 사용이 가능합니다.

ES Example 3

클러스터는 먼저 유실된 노드가 복구되기를 기다립니다. 하지만 타임아웃이 지나 더 유실된 노드가 복구되지 않는다고 판단되면 Elasticsearch는 복제본이 사라져 1개만 남은 0번, 4번 샤드들의 복제를 시작합니다. 처음에 4개였던 노드가 3개로 줄어도 복제가 끝나면 0~4번까지의 primary shard, replica가 각각 5개씩 총 10개의 데이터로 유지됩니다.

replica가 아닌 primary shard가 유실된 경우에는 새로 primary shard가 생성되는 것이 아니라, 남아있던 복제본이 먼저 primary shard로 승격되고 다른 노드에 새로 replica를 생성합니다.

Shard 설정

Primary Shard 설정

이미 생성된 index의 primary shard 개수는 변경이 불가능합니다. (변경을 원할 경우, 리인덱싱 필요)
따라서 최초로 index가 생성되기 전에 primary shard 수를 신중히 결정해야 하며 primary shard 하나 당 약 30~50GB의 크기가 유지되도록 shard 수를 조정하는 것이 좋습니다.

Primary Shard 수 조정을 위한 Template 설정

PUT _index_template/TEMPLATE_NAME
{
  "index_patterns": ["INDEX_NAME*"],
  "template": {
    "settings": {
  	  "index.number_of_shards": 3
       }
  }
}
  • TEMPLATE_NAME: Template 명
  • INDEX_NAME: Index 명
  • index.number_of_shards: Primary Shard 수 지정

Replica 설정

cf. 이미 생성된 index에 대한 primary shard 수는 변경이 불가능하지만 replica 수는 변경이 가능합니다.

만약 replica = 0 이라면 Zone 장애 발생 시 DR이 불가능합니다. 따라서 AZ Failure 시 장애 예방을 위해서는 replica를 생성해야 합니다. 또한 Elasticsearch를 검색 용도로 사용할 경우, replica를 생성하는 것이 퍼포먼스에 도움이 될 수 있습니다.

반면 replica를 생성한다는 것이 primary shard와 동일한 복제본을 한 번 더 저장한다는 것이므로 결국 스토리지를 차지하기 때문에 비용을 고려해야 합니다.

Replica 수 설정

PUT INDEX_NAME/_settings
{
  “number_of_replicas”: 1
}

웹 콘솔 설정

참고로 웹 콘솔 상에서 신규 생성될 index의 primary/replica 수의 변경을 위해 Template을 활용할 수도 있습니다.

Index Management > Templates 에서 'Create template'으로 primary/replica shard 수 지정을 위한 템플릿을 생성하겠습니다.

Opensearch_Template

shard 수 지정을 위한 인덱스 패턴을 Index patterns에 지정한 뒤, 하단의 Index settings에서 'Number of primary shards'와 'Number of replicas'를 설정하면 지정된 Index pattern과 일치하는 인덱스가 신규로 생성될 때, 템플릿에 설정해 둔 shard 수로 지정된 상태로 인덱스가 생성되게 됩니다.

Opensearch_Template_IndexSetting


Reference

개인적으로 공부하며 작성한 글로, 내용에 오류가 있을 수 있습니다.

profile
클라우드 엔지니어 ♡

0개의 댓글