본문 바로가기
Database

Elasticsearch 디스크 워터마크 이슈

by kmkhm 2025. 4. 30.

Elasticsearch를 설치하고 데이터를 저장하는 과정에서, 아래와 같은 예외가 발생했습니다.

java.net.SocketTimeoutException: 5,000 milliseconds timeout on connection http-outgoing-0 [ACTIVE]

요청은 보냈지만, Elasticsearch가 응답하지 않아 Spring Boot에서 타임아웃이 발생한 상황입니다.

 

로그를 확인해보니 다음과 같은 경고 메시지가 반복적으로 출력됐습니다.

"high disk watermark [90%] exceeded on [/usr/share/elasticsearch/data] free: 3.6gb[6.1%]..."

이는 Elasticsearch가 사용하는 데이터 디렉토리의 디스크 사용량이 기준치를 초과했음을 나타냅니다. Elasticsearch는 디스크 사용량이 다음 기준을 초과하면 쓰기 작업을 제한합니다.

수위 기본 기준치 동작
low 85% shard 신규 할당 금지
high 90% shard 재배치 시작, 쓰기 일부 제한
flood_stage 95% 인덱스를 read-only로 전환

 

디스크 워터마크(Disk WaterMark)

디스크 사용률 기반으로 Elasticsearch가 쓰기를 제한하거나 shard를 재배치하는 정책

 

위의 상황처럼 Elasticsearch는 내부적으로 디스크 공간 부족 시, 데이터 손실을 방지하기 위해 워터마크라는 정책이 존재합니다.

즉, Elasticsearch는 주기적으로 노드의 디스크 사용량을 확인하고, 디스크 사용량이 특정 수치를 넘을 경우 샤드 이동, 쓰기 차단 등의 조치를 취합니다.

 

저의 경우에는 Elasticsearch를 Docker를 활용해 실행중이었습니다.

Elasticsearch는 /usr/share/elasticsearch/data 경로를 데이터 저장소로 사용합니다.

Docker로 실행할 경우, 해당 경로가 Docker 컨테이너의 내부 파일 시스템에 위치하게 되며, 이 경우 실제 호스트의 디스크 용량과 무관하게 Docker 내부 디스크 한도에 의해 사용량이 높게 인식될 수 있습니다.

 

즉, 호스트에는 280GB의 여유 공간이 있었지만, Docker 내부에서는 90%를 초과했다고 판단되어 쓰기 작업이 차단된 것입니다.

 

해결방법

1. Docker Volume 설정

Docker로 Elasticsearch를 실행할 때, Docker Volume을 사용하여 Elasticsearch의 데이터 디렉토리를 실제 디스크와 안정적으로 연결할 수 있습니다.

docker run -d --name elasticsearch \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms2g -Xmx2g" \
  -e "xpack.security.enabled=false" \
  -p 9200:9200 \
  -v esdata:/usr/share/elasticsearch/data \
  docker.elastic.co/elasticsearch/elasticsearch:8.13.0

-v esdata:/usr/share/elasticsearch/data 옵션을 통해 Elasticsearch의 데이터 저장 경로를 Docker Volume에 연결하고,

컨테이너를 재시작하거나 삭제해도 데이터는 안전하게 유지됩니다.

 

2. 워터마크 완화

아래와 같이 워터마크 수치를 완화할 수 있습니다.

-e "cluster.routing.allocation.disk.watermark.low=95%" \
-e "cluster.routing.allocation.disk.watermark.high=98%" \
-e "cluster.routing.allocation.disk.watermark.flood_stage=99%"

 

두 가지 방법 중, 워터마크 완화의 경우에는 운영환경에서는 권장되는 방법은 아닙니다.

 

결론적으로, 운영 환경에서는 다음과 같은 방식으로 Elasticsearch의 데이터 디스크를 안정적으로 관리하는 것이 중요합니다.

 

  • Docker 환경이라면 Docker Volume을 사용하여 데이터 영속성을 보장하고 디스크 워터마크 이슈를 방지합니다.
  • Kubernetes 환경이라면 Persistent Volume Claim(PVC)을 통해 안정적인 저장소를 연결합니다.
  • 클라우드 환경에서는 Elastic Cloud나 AWS/GCP의 블록 스토리지(EBS, Persistent Disk)를 활용하여 자동 백업과 확장성까지 고려합니다.

댓글