개발자로서 살아남기/ELK Stack 적용하기

ElasticSearch 클러스터 노드 용량 불균형 문제 해결

코드 살인마 2025. 5. 23. 11:43
728x90

개요

실무에서 온프레미스로 ElasticSearch Cluster를 운영하고 있는데, 총 8개의 데이터 노드 중 특정 노드에만 디스크 사용량이 집중되는 현상이 발생하였다.

 

운영 중인 ElasticSearch 클러스터는 공식 가이드에 따라 샤드 1개당 30~50GB로 설정하였으며, 인덱스마다 2~3개의 샤드를 사용 중이다.

 

현재 문제는 각 인덱스마다 2~3개의 샤드와 레플리카가 설정되어 있으므로, 총 4~6개의 샤드가 서로 다른 노드에 분산되어 저장된다. 그러나 여러 인덱스의 샤드 할당이 특정 노드에서 겹칠 경우, 해당 노드에 데이터가 집중되는 현상이 발생할 수 있다.

 

결국, 이러한 불균형을 방지하기 위해 클러스터 차원에서 샤드가 어느 노드에 할당될지 결정하는 설정이 필요하며, ElasticSearch는 이를 위해 디스크 기반 샤드 할당(Disk-based Shard Allocation) 기능을 제공하고 있다.

 

디스크 기반 샤드 할당

디스크 기반 샤드 할당 기능은 low 워터마크high 워터마크라는 두 가지 임계값을 기준으로 동작한다. 이를 통해 각 노드가 과도한 디스크 사용 없이도 균형을 유지하도록 샤드의 이동과 추가 할당을 관리할 수 있다.

  • 노드가 high 워터마크를 초과하면, 일부 샤드를 다른 노드로 자동 이동시켜 디스크 사용량을 일시적으로 낮춘다.
  • 노드가 low 워터마크를 초과하면, 추가 샤드의 할당을 제한하여 high 워터마크에 도달하지 않도록 사전에 예방한다.

샤드 이동 과정에서 간헐적으로 OOM(Out Of Memory)이 발생하여 ElasticSearch가 종료되는 경우가 있는데, 이는 high 워터마크를 초과하여 샤드를 이동시키는 과정에서 발생하는 것으로, 가능한 high 워터마크를 자주 초과하지 않도록 관리해야 한다.

 

또한 클러스터 내 모든 노드가 low 워터마크를 초과하게 되면, 새로운 샤드가 할당되지 않기 때문에 사전에 각 노드의 디스크 여유 공간을 충분히 확보하는 것이 중요하다.

 

결과적으로 디스크 기반 샤드 할당 설정을 통해 각 노드의 디스크 용량을 어느 정도 균등하게 유지할 수 있다

Elastic 공식 문서에 따르면 클러스터 내 노드들이 사용하는 디스크 공간이 서로 크게 차이 나는 경우는 정상적일 수 있다. 이는 노드에 저장된 샤드의 수, 샤드가 속한 인덱스의 특성, 각 샤드의 디스크 크기 및 CPU 사용량 등 다양한 요인이 복합적으로 작용하기 때문이다.

 

디스크 기반 샤드 할당 설정 변경

cluster.routing.allocation.disk.threshold_enabled on/off 설정이고, 디폴트는 on 이다.

 

Low 워터마크

cluster.routing.allocation.disk.watermark.low 디폴트 값은 85%

디스크 사용량이 85% 초과하는 노드에 샤드를 할당하지 않는다.

 

High 워터마크

cluster.routing.allocation.disk.watermark.high 디폴트 값은 90%

디스크 사용량이 90%가 초과하는 노드에서 샤드를 다른 노드로 이동시킨다.

여기서 의문은 low 워터마크 설정으로 인해, high 워터마크 설정인 90%를 넘을 상황이 발생하는가? 이다.
실제로 일시적 초과로 인해 90%을 넘길 수 있으며, 아래와 같은 상황에 발생한다.
샤드 강제 재할당, 세그먼트 머지, 스냅샷 생성, Bulk 색인 후 트랜잭션 로그, 리사이징·리인덱스 등

읽기 전용 노드 설정

cluster.routing.allocation.disk.watermark.flood_stage 디폴트 값은 95%

 

노드의 디스크 공간 부족을 방지하기 위한 최후의 수단


95% 도달하게 되면 해당 노드는 읽기 전용으로 바뀐다.

 

디폴트 값 설정

PUT _cluster/settings
{
  "transient": {

    "cluster.routing.allocation.disk.watermark.low": "85%",
    "cluster.routing.allocation.disk.watermark.high": "90%",
    "cluster.routing.allocation.disk.watermark.flood_stage": "95%",
    "cluster.info.update.interval": "1m" // 클러스터 내 각 노드의 디스크 사용량을 확인하는 빈도 여기서는 1분에 한번씩 확인한다.
  }
}

실제 설정

기존에 노드 디스크 용량의 불균형이 심했기 때문에, 이를 균등하게 맞추고자 low, high 워터마크 값의 임계값을 10% 낮췄다.

 

cluster.routing.allocation.disk.watermark.low는 75%


cluster.routing.allocation.disk.watermark.high는 80%

 

Before

데이터 사용량 범위가 25% ~ 86% 까지 불균형이 심하다.

After

데이터 사용량 범위가 33% ~ 77% 까지 조금 나아졌다.

 

REFERENCE

https://www.elastic.co/docs/reference/elasticsearch/configuration-reference/cluster-level-shard-allocation-routing-settings

 

Cluster-level shard allocation and routing settings | Elastic Documentation

Shard allocation is the process of assigning shard copies to nodes. This can happen during initial recovery, replica allocation, rebalancing, when nodes...

www.elastic.co