Elasticsearch 샤드 할당 문제: 원인 및 해결 방법
Elasticsearch 클러스터는 노드 전반에 걸쳐 샤드의 적절한 분산 및 할당에 크게 의존하여 복원력과 고가용성을 위해 설계되었습니다. 샤드가 UNASSIGNED 또는 INACTIVE 상태에서 활성 기본 또는 복제본으로 이동하지 못하면 클러스터 상태 표시기가 종종 노란색 또는 빨간색으로 바뀝니다. 샤드가 할당되지 않는 이유를 이해하는 것은 건강하고 성능이 뛰어나며 사용 가능한 검색 엔진을 유지하는 데 중요합니다.
이 가이드에서는 클러스터 리소스 부족부터 잘못 구성된 설정까지 샤드 할당 실패의 일반적인 원인을 심층적으로 분석하고, 데이터가 올바르게 인덱싱되고 검색 가능한 상태를 보장하기 위한 실행 가능하고 실용적인 해결 방법을 제공합니다.
샤드 상태 및 할당 이해
문제를 해결하기 전에 Elasticsearch가 무엇을 하려고 하는지 아는 것이 중요합니다. 샤드는 Elasticsearch의 기본 분산 단위입니다. 여러 상태로 존재할 수 있습니다:
- STARTED: 샤드가 활성 상태이며 요청을 처리하고 있습니다 (기본 또는 복제본).
- RELOCATING: 샤드가 노드 간에 이동 중입니다 (재조정 또는 노드 추가/제거 중).
- INITIALIZING: 새 복제본 샤드가 기본에서 생성 중입니다.
- UNASSIGNED: 샤드가 클러스터 상태 메타데이터에 존재하지만 필요한 노드를 사용할 수 없거나 기준이 충족되지 않아 어떤 노드에도 할당되지 않았습니다.
클러스터 상태는 할당되지 않은 샤드의 존재에 의해 결정됩니다:
- 녹색: 모든 기본 및 복제본 샤드가 할당되었습니다.
- 노란색: 모든 기본 샤드는 할당되었지만 하나 이상의 복제본 샤드가 할당되지 않았습니다.
- 빨간색: 하나 이상의 기본 샤드가 할당되지 않았습니다 (기본 샤드를 호스팅하는 노드가 실패할 경우 데이터 손실 위험 표시).
샤드 할당 실패의 일반적인 원인
샤드 할당은 클러스터의 할당 결정자 로직에 의해 관리되며, 샤드를 배치하기 전에 수많은 요인을 확인합니다. 실패는 일반적으로 이러한 결정 지점 중 하나를 위반한 것에서 비롯됩니다.
1. 클러스터 리소스 부족
특히 동적 환경에서 할당이 지연되는 가장 빈번한 원인입니다.
디스크 공간 임계값
Elasticsearch는 디스크 사용량이 미리 정의된 임계값을 초과하면 노드에 새 샤드 (기본 및 복제본 모두) 할당을 자동으로 중지합니다. 기본적으로 85% 사용량에서 할당이 중지되고 90%에서는 할당이 완전히 방지됩니다.
기본 임계값 (elasticsearch.yml 또는 클러스터 설정 확인):
| 설정 | 기본값 | 설명 |
|---|---|---|
cluster.routing.allocation.disk.watermark.low |
85% | 노드가 상대적으로 꽉 찼다고 간주되는 임계값. |
cluster.routing.allocation.disk.watermark.high |
90% | 노드로의 할당이 차단되는 임계값. |
cluster.routing.allocation.disk.watermark.flood_stage |
95% | 할당이 완전히 중지되며 인덱싱/쓰기 작업이 실패할 수 있습니다. |
해결 방법: 모든 노드의 디스크 사용량을 확인하고 공간을 확보하거나 높은 워터마크를 초과하는 노드에 더 많은 디스크 공간을 추가합니다.
메모리 및 CPU 압박
디스크 문제보다 덜 일반적이지만, 노드에서 지속적으로 높은 메모리 사용량이나 높은 CPU 부하가 발생하면 할당 결정자가 충분한 운영 헤드룸이 있는 노드를 선호하므로 새 샤드가 할당되지 않을 수 있습니다.
2. 노드 역할 및 속성 불일치
최신 Elasticsearch 배포에서는 종종 전용 마스터, 수집 또는 조정 노드를 사용합니다. 샤드는 요구 사항을 충족하지 않는 노드에는 할당되지 않습니다.
할당 규칙 불일치
샤드를 특정 속성 (예: 빠른 SSD)으로 태그된 노드에 배치해야 하는 특정 인덱스 설정을 구성했지만 해당 태그와 일치하는 사용 가능한 노드가 없는 경우 샤드는 할당되지 않은 상태로 유지됩니다.
예시: index.routing.allocation.require.box_type: high_io로 생성된 인덱스는 해당 설정으로 명시적으로 구성된 노드에만 할당됩니다.
해결 방법: 영향을 받는 인덱스의 할당 규칙 (allocation.require, allocation.include, allocation.exclude)을 확인하고 노드가 올바른 node.attr 설정을 가지고 있는지 확인합니다.
3. 클러스터 상태 안정성 및 기본 할당 실패 (빨간색 상태)
기본 샤드가 할당되지 않은 경우 (클러스터가 빨간색) 마지막 기본 복사본을 보유한 노드가 실패했거나 클러스터를 떠났으며 사용 가능한 복제본 샤드가 기본으로 승격되지 못했음을 의미합니다.
일반적인 시나리오:
* 유일한 기본 복사본을 보유한 노드가 예기치 않게 충돌합니다.
* 복제본이 성공적으로 복사되기 전에 기본 샤드가 포함된 노드가 명시적으로 클러스터에서 제거됩니다.
해결 방법: 실패한 노드를 신속하게 복구할 수 없는 경우 기본 차단기를 재정의하여 할당을 수동으로 강제해야 할 수 있지만, 이 경우 특정 샤드에 대한 데이터 손실 위험이 높습니다.
4. 샤드 제한 및 할당량
Elasticsearch는 클러스터를 불안정하게 만들 수 있는 무분별한 샤드 생성을 방지하기 위해 제한을 적용합니다.
노드당 최대 샤드 수
노드가 구성된 최대 샤드 수 (cluster.routing.allocation.total_shards_per_node)에 도달하면 디스크 공간이 사용 가능하더라도 더 이상 샤드가 할당되지 않습니다.
해결 방법: total_shards_per_node 제한을 늘리거나 (노드당 샤드가 너무 많으면 성능이 저하될 수 있으므로 주의하십시오) 클러스터에 노드를 더 추가하여 부하를 분산합니다.
할당 실패 진단: 할당 설명 API
할당 설명 API는 특정 샤드가 할당되지 않는 이유를 진단하는 가장 강력한 단일 도구입니다. 할당 결정자의 의사 결정 프로세스를 시뮬레이션합니다.
사용하려면 인덱스 이름, 샤드 번호 및 샤드가 있어야 하는 노드 (알고 있는 경우 또는 모든 가능성을 확인하려면 노드 생략)가 필요합니다.
예시 사용법 (my_data 인덱스의 샤드 0 확인):
GET /_cluster/allocation/explain?pretty
{
"index": "my_data",
"shard": 0,
"primary": true
}
응답은 해당 샤드에 대해 내려진 모든 할당 결정을 상세하게 설명하며, 어떤 규칙이 위반되었는지 명시적으로 알려줍니다 (예: "[disk exceeding high watermark on node X]").
출력 읽기
explanation 필드와 deciders 섹션에 주의 깊게 주의를 기울이십시오. 결정자가 false를 반환하는 경우 해당 메시지는 위반되는 제약 조건을 설명합니다 (예: 디스크 사용량, 복제본 수 불일치 또는 노드 속성 제외).
문제 해결 단계 및 명령
UNASSIGNED 상태에 직면했을 때 다음 우선순위 문제 해결 순서를 따르십시오.
1단계: 클러스터 상태 및 할당되지 않은 샤드 확인
먼저 전체 그림을 확인하십시오.
GET /_cluster/health?pretty
GET /_cat/shards?h=index,shard,prirep,state,unassigned.reason,node
cat API 출력에서 unassigned.reason 열을 특별히 살펴보십시오. 이 열은 종종 즉각적인 단서 (예: CLUSTER_RECOVERED, NODE_LEFT, INDEX_CREATED)를 제공합니다.
2단계: 디스크 공간 조사
이유가 디스크 압박을 가리키면 모든 노드의 실제 사용량을 확인하십시오.
GET /_cat/allocation?v&h=node,disk.used_percent,disk.avail,disk.total
조치: 노드의 용량이 90%에 가까워지면 즉시 로그를 정리하고, 인덱스 보존 기간을 줄이거나 해당 노드에 디스크 용량을 추가하기 시작합니다.
3단계: 복잡한 경우를 위한 할당 설명 사용
원인이 명백한 리소스 압박이 아닌 경우, 위에 설명된 대로 할당 설명 API를 실행하여 구성 불일치를 정확히 찾아냅니다.
4단계: 할당 수동 강제 (주의해서 사용)
원본 노드가 영구적으로 사라져 기본 샤드가 UNASSIGNED (빨간색 상태)인 경우, 마지막 기본 샤드가 존재한 이후에 기록된 데이터 손실 위험을 수락하면 클러스터가 복제본을 승격하도록 강제할 수 있습니다 (있는 경우).
경고: 이 명령은 할당되지 않은 기본 샤드 기록을 영구적으로 삭제합니다. 기본 샤드를 호스팅하는 노드를 복구할 수 없는 경우에만 사용하십시오.
POST /_cluster/reroute
{
"commands": [
{
"allocate_stale_primary": {
"index": "index_name",
"shard": 0,
"node": "node_name_with_replica",
"accept_data_loss": true
}
}
]
}
5단계: 멈춘 복제본 해결 (노란색 상태)
노드 또는 디스크 공간 부족으로 인해 복제본만 할당되지 않은 경우 (노란색 상태), 근본적인 리소스 제약 조건을 해결하면 (노드를 추가하거나 디스크 공간을 확보하면) 결정자가 허용하면 복제본이 자동으로 할당됩니다.
리소스를 추가하지 않고 계속 진행해야 하는 경우, 인덱스에 대한 복제본 할당을 일시적으로 비활성화할 수 있습니다.
PUT /my_index/_settings
{
"index.blocks.write": true,
"index.number_of_replicas": 0
}
이 변경 후 클러스터 상태는 녹색으로 바뀌어야 합니다 (0개의 복제본이 성공적으로 할당되었으므로). 나중에 복제본을 다시 활성화하는 것을 잊지 마십시오 ("index.number_of_replicas": 1).
할당 문제 방지를 위한 모범 사례
- 디스크 워터마크 엄격 모니터링: 할당이 완전히 차단되기 전에 개입하기 위해
high워터마크 (90%)를 기반으로 경고를 설정합니다. - 노드 다양성 유지: 노드 하나가 실패하더라도 모든 기본 복사본과 필요한 복제본을 호스팅하기에 충분한 노드가 여전히 사용 가능한 상태를 유지하도록 충분한 물리적 또는 가상 노드를 확보합니다.
- 할당 인식 사용: 다중 영역 또는 다중 랙 배포의 경우, 샤드의 모든 복사본이 동일한 물리적 영역에 착륙하는 것을 방지하여 영역 전체의 장애를 완화하기 위해
cluster.routing.allocation.awareness.attributes를 구성합니다. - 현실적인 복제본 수 설정: 마이너 유지 관리 중에 할당되지 않은 복제본을 보장하는 물리적 노드 수보다 많은 복제본 수를 설정하는 것을 피하십시오.
리소스의 사전 관리 및 할당 설명 API 사용을 통해 관리자는 Elasticsearch 샤드가 최적의 할당을 달성하지 못하게 하는 요인을 신속하게 진단하고 해결할 수 있습니다.