인덱스와 샤드 (Index & Shards)

1. 인덱스(Index)란?

  • Elasticsearch에서 데이터 저장 단위로, 여러 개의 문서(Document)를 포함.
  • 관계형 데이터베이스(RDBMS)의 테이블(Table) 개념과 유사.
  • 인덱스는 기본적으로 샤드(Shard)라는 단위로 분할되어 저장됨.

2. 샤드(Shard)란?

  • 인덱스의 데이터를 저장하는 기본 단위.
  • Elasticsearch는 대량의 데이터를 효과적으로 저장하고 검색하기 위해 샤드를 여러 개로 나누어 분산 저장함.
  • 샤드는 **프라이머리 샤드(Primary Shard)와 복제본(Replica Shard)**으로 구분됨.

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

샤드 유형 설명

프라이머리 샤드 (Primary Shard) 데이터가 처음 저장되는 기본 샤드.
복제본 샤드 (Replica Shard) 프라이머리 샤드의 복제본으로, 장애 발생 시 데이터 손실 방지.

샤드 개수 설정

  • Elasticsearch 7.0 이상에서는 기본적으로 프라이머리 샤드 1개, 복제본 1개로 설정됨.
  • Elasticsearch 6.x 이하에서는 기본적으로 프라이머리 샤드 5개로 설정됨.

샤드와 노드 분산 구조

샤드는 클러스터 내 여러 개의 노드(Node)에 분산 저장됩니다.

샤드 분배 예시

  • 5개의 프라이머리 샤드(Primary Shards)
  • 각각 1개의 복제본(Replica Shards)
  • 총 10개의 샤드(Primary + Replica)
  • 4개의 노드에 분산 저장됨

노드(Node) 저장된 샤드

Node-1 프라이머리 샤드 #1, 복제본 #3
Node-2 프라이머리 샤드 #2, 복제본 #4
Node-3 프라이머리 샤드 #3, 복제본 #5
Node-4 프라이머리 샤드 #4, 복제본 #1

샤드와 복제본은 반드시 서로 다른 노드에 저장됨 (데이터 손실 방지).


노드 장애 발생 시 샤드 복구

노드(Node) 유실 시 복제본 자동 복구

  • 예를 들어, Node-3이 장애로 다운되면 프라이머리 샤드 #3, 복제본 #5가 손실됨.
  • Elasticsearch는 남아 있는 복제본 중 하나를 프라이머리 샤드로 승격(Promotion)하고, 새로운 복제본을 생성하여 데이터 일관성을 유지함.

상태 설명

Node 장애 발생 Node-3이 사라지면서 0번, 4번 샤드 유실
복제본 승격 Node-1 또는 Node-2의 0번, 4번 복제본이 프라이머리 샤드로 승격
새로운 복제본 생성 남은 노드에서 새로운 복제본 샤드 자동 생성

Elasticsearch는 클러스터 장애 발생 시 자동으로 데이터를 복구하여 가용성을 유지.


샤드 개수 설정 방법

(1) 인덱스 생성 시 샤드 개수 지정

프라이머리 샤드 수는 인덱스를 처음 생성할 때만 설정 가능하며, 생성 후 변경할 수 없습니다.
복제본 샤드는 나중에 변경할 수 있습니다.

curl -XPUT "http://localhost:9200/books" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  }
}'
  • 프라이머리 샤드 5개, 복제본 1개 설정총 10개의 샤드 생성 (5 Primary + 5 Replica).

(2) 복제본(Replica) 개수 변경

복제본 개수는 동적으로 변경할 수 있습니다.

curl -XPUT "http://localhost:9200/books/_settings" -H 'Content-Type: application/json' -d'
{
  "number_of_replicas": 0
}'
  • 복제본 개수를 0으로 설정하여 샤드 수를 줄임.

샤드 개수 설정 시 고려할 요소

(1) 프라이머리 샤드 개수

  • 너무 적게 설정하면: 검색 속도가 느려질 수 있음.
  • 너무 많게 설정하면: 관리 오버헤드 증가 및 성능 저하 가능.
  • 일반적으로 샤드 하나의 크기는 10~50GB로 유지하는 것이 성능적으로 유리.

(2) 복제본 개수

  • 복제본 개수를 늘리면 검색 성능 향상 및 장애 복구 가능.
  • 하지만 쓰기 성능은 감소(데이터를 여러 번 복제해야 하므로).

샤드 관련 주요 API 정리

API 설명

GET /_cat/shards?v 클러스터 내 모든 샤드 정보 조회
GET /_cat/indices?v 클러스터 내 모든 인덱스 조회
PUT /{index}/_settings 기존 인덱스의 복제본 개수 변경
DELETE /{index} 인덱스 삭제

샤드 개수 설정의 장단점

항목 장점 단점

프라이머리 샤드 많음 병렬 검색 속도 증가 노드 리소스 사용 증가
프라이머리 샤드 적음 인덱스 관리가 쉬움 검색 성능 저하 가능
복제본 많음 검색 성능 향상, 장애 복구 가능 저장 공간 및 리소스 증가
복제본 적음 저장 공간 절약 장애 발생 시 데이터 손실 위험

결론

  • Elasticsearch는 데이터를 저장할 때 샤드(Shard)라는 단위로 분산 저장함.
  • 샤드는 **프라이머리 샤드(Primary Shard)와 복제본 샤드(Replica Shard)**로 구성됨.
  • 복제본 샤드는 노드 장애 시 자동 복구를 수행하여 데이터 무결성을 유지.
  • 프라이머리 샤드는 생성 후 변경할 수 없으므로 처음 설정할 때 신중해야 함.
  • 복제본 샤드는 검색 성능과 장애 복구를 위해 중요한 요소이며, 운영 중에도 변경 가능.

 

+ Recent posts