성능 테스트 과정에서 특정 데이터 노드에 샤드가 집중된 것을 발견했습니다.
엘라스틱서치에서는 아래 상황에서 샤드의 배치를 결정하게 됩니다.
- 클러스터에 인덱스를 추가하는 경우
- Node failure - 클러스터에서 노드가 drop된 경우 해당 노드에 존재하던 샤드들을 재배치
- 클러스터 크기 조정 - 클러스터에 새로운 노드가 추가되거나 제거되는 경우
- 노드의 디스크 사용량이 전체의 90% 이상을 도달하는 경우
- 샤드를 수동으로 라우팅하는 경우
- 라우팅 관련 설정 업데이트
ShardsAllo cator는 샤드 배치를 담당하는 ElasticSearch 인터페이스입니다.
해당 인터페이스의 구현체 BalancedShardsAllocator의 allocate를 보면 1. allocate unassigned shards, 2. move shards, and 3. rebalance shards 라는 세 가지의 작업을 진행합니다.
1. allocate unassigned shards
- 인덱스가 생성될 때마다 샤드는 Primary, Replica 모두 UNASSIGNED 상태(아무 노드에 할당되지 않은 상태)가 된다.
- 노드가 클러스터를 떠나면 해당 노드의 샤드는 유실된다. → 만약 프라이머리 샤드가 유실되었다면 레플리카가 프라이머리로 승격되고 레플리카 샤드가 UNASSIGNED 상태가 된다.
- 해당 메서드에서는 모든UNASSIGNED 상태의 샤드들을 순회하면서, 샤드 할당에 적합한 후보 노드들을 찾은 후 최소 가중치를 갖는 노드에 해당 샤드의 상태를 INITIALIZING(샤드 초기화) 로 바꿔서 할당한다.
2. move shards
- 먼저, 클러스터의 샤드들이 현재 노드에 남아있을 수 있는지 확인한다. ( AllocationDecider 구현체들 - ShardsLimitAllocationDecider : 노드당 샤드 수 제한을 위반하지 않는지, DiskThresholdDecider: 노드에 충분한 Disk 공간이 있는지 확인 등 )
- 그렇지 않은 경우 최소 가중치를 가진 노드에 샤드를 할당한다. → 샤드 재배치가 트리거된다. (기존 노드에서 해당 샤드를 지우고, target node에 해당 샤드를 추가한다.)
- 해당 과정은 STARTED 상태인 샤드에만 적용되고 다른 상태인 경우에는 건너뛴다.
3. rebalance shards
- 리소스 한계에 다다르면 Elasticsearch는 자동으로 샤드를 재배치한다.
- 노드 간에 가중치를 비교해서 reblance를 할지 결정해서 진행한다.
가중치 함수(BalancedShardsAllocator.WeightFunction.weight)
샤드 밸런싱 설정값
- cluster.routing.allocation.balance.shard
- 각 노드에 할당된 총 샤드 수에 대한 가중치. 기본값은 0.45f. 이 값을 높이면 클러스터의 모든 노드들에 샤드 수를 동일하게 만드는 경향이 높아진다.
- cluster.routing.allocation.balance.index
- 각 노드에 할당된 인덱스당 샤드 수에 대한 가중치. 기본값은 0.55f. 이 값을 높이면 클러스터의 모든 노드들에서 각 인덱스의 샤드 수를 동일하게 만드는 경향이 높아진다.
결론
- 노드간의 샤드를 균등하게 분배하고 싶다면 실험 & 경험적으로 가중치 설정값을 변경하면서 찾아가야 하는 것으로 보이지만, 문제되는 상황이 아니라면 이미 적절한 기준으로 리밸런싱하고 있기 때문에 기본값으로 사용해도 괜찮을 것 같다.
- 디스크 사용량을 잘 확인해야겠다.
References
https://aws.amazon.com/ko/blogs/opensource/open-distro-elasticsearch-shard-allocation
https://github.com/elastic/elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-cluster.html#shards-rebalancing-heuristics
'Storage' 카테고리의 다른 글
[Elasticsearch] Near real-time search, Refresh (0) | 2024.02.15 |
---|---|
[Elasticsearch] No master is elected (0) | 2024.02.14 |
[MySQL] 인덱스 정리 (0) | 2022.09.26 |