Elasticsearch

Elasticsearch의 index, shard, replica

eden.do 2022. 8. 12. 17:29

개념 정리

1. Index

Index는 테이블로 생각하면 됩니다.
Elasticsearch(이하 ES)는 모든 데이터를 하나의 document에서 사용하는데 이 document를 모아놓은 집합이 index입니다.

2. Shard

shard는 index의 document를 분산 저장하는 저장소입니다.
설정한 shard 개수 만큼 index를 분산해서 저장. Document는 생성된 shard에 순차적으로 저장합니다.

노드 1개에 shard의 개수를 2로 설정하고 6개의 document를 저장하면 아래와 같습니다.

shard의 개수는 데이터의 크기가 작으면 default인 1개로 유지하고 크기가 크면 응답 속도에 부합하게 증가시키는 것이 좋습니다.
샤드의 개수는 인덱스를 생성할 때만 설정 가능하고 개수가 증가할수록 쿼리의 속도가 증가합니다. (분산해서 검색도 하기 때문)
샤드의 개수만큼 CPU의 스레드를 사용하여 샤드 개수가 많아질수록 비례하여 자원을 사용합니다.
특정 크기의 데이터의 샤드 개수를 적절히 설정하면 응답 속도가 빨라질 수 있기 때문에 적절히 선택하는 것이 중요합니다.

그렇다면 샤드의 적정 개수를 산정하는 방법은 무엇일까요?

 

고려해야할 요소 

  1. 클러스터가 저장해야 할 전체 데이터의 크기
    로그성 데이터들이 저장되는 클러스터들이라면 일 별 몇 GB의 로그가 저장되며 유지 기간은 어느 정도인지를 예측해야 합니다.
    데이터 검색을 위한 검색 엔진이면 초기 데이터의 크기가 어느 정도이고 주기적으로 어떤 형태의 데이터 갱신이 일어나는지 예측해야 합니다.
  2. 예상하는 최대 동시 인입 쿼리 수
    서비스에 노출되고 사용자에게 직접적으로 검색 결과를 돌려줘야 한다면 최대 몇 개의 쿼리가 동시에 인입되는지 중요합니다.
  3. 목표로 하는 검색 응답 시간
    최소한 몇 ms 안에 응답을 줘야하는지에 대한 목표를 설정해야 합니다.
  4. 서비스에 실제 사용할 수 있는 하드웨어의 스펙 결정

[참조] https://brunch.co.kr/@alden/39

 

총 데이터 크기가 100GB라면 약 검색 성능 100ms를 달성하기 위해 샤드의 크기가 20GB 정도가 되어야 하고 이 때 샤드의 개수는 100/20 = 5가 됩니다.

그렇다면 샤드를 몇 개의 노드에 배치하면 될까요?
초당 인입되는 쿼리 수를 통해서 계산하면 됩니다. 인덱스에 대한 샤드 개수가 5개이고 한 번에 처리되어야 하는 쿼리 수는 10개 이므로 검색 쓰레드의 전체 개수는 50개가 됩니다. 즉, 클러스터의 데이터 노드들의 검색 쓰레드의 합이 모두 50개가 된다면 10개의 쿼리를 동시에 처리할 수 있습니다. 데이터 노드 하나의 코어 수와 replica 수를 고려하여 아래와 같은 식을 도출할 수 있습니다.

인덱스를 생성할 때 shard의 개수를 지정하고 변경할 수 없지만, shard의 개수도 reindex를 통해서 변경이 가능합니다. 여기에서 reindex는 index를 다른 index로 복사하여 변경하는 작업이라고 생각하시면 됩니다.

3. Replica

replica는 primary shard를 복제하여 다른 Node에 저장하는 개념입니다. primary shard는 replica가 1 copy 상태일 때의 shard를 의미합니다.
primary shard의 복제본으로 primary shard의 개수만큼 생성되게 됩니다. replica도 shard처럼 index 생성시 개수를 설정할 수 있습니다.
예를 들어, node 3개, shard 3개, replica 2개가 있을 때 shard 개수가 3개이므로 3개 node에 분산 생성됩니다.
replica는 primary shard가 없는 node에 각각 1개씩 총 2개가 생성됩니다. shard와 replica가 분산되어 저장되면서 서비스가 중단되지 않도록 합니다. 즉, 같은 데이터를 가지는 replica와 primary shard는 같은 노드에 존재할 수 없습니다.

replica의 개수도 중요한데요. replica가 많아지면 I/O 자원이 많이 쓰이고 서버 속도가 느려질 수 있습니다. 그래서 데이터의 용도와 운영방식에 따라 replica 수를 설정해야 합니다. replica 수는 index 생성 이후로도 변경 가능합니다.

[출처]
https://firework-ham.tistory.com/7
http://guruble.com/elasticsearch-2-shard-replica/