Elasticsearch 샤드 할당 문제: 원인 및 해결 방법
할당 설명, 디스크 확인, 노드 필터 및 안전한 복구 단계를 통해 Elasticsearch 샤드 할당 문제를 진단합니다.
Elasticsearch 샤드 할당 문제: 원인 및 해결 방법
Elasticsearch 샤드 할당 문제는 일반적으로 노란색 또는 빨간색 클러스터 상태로 나타납니다. 노란색은 기본 샤드가 할당되었지만 하나 이상의 복제본이 할당되지 않았음을 의미합니다. 빨간색은 하나 이상의 기본 샤드가 할당되지 않았음을 의미하며, 복구할 때까지 일부 데이터를 사용할 수 없을 수 있습니다.
이 가이드에서는 할당 차단 요소를 찾고, 할당 설명 API 출력을 읽고, 가장 위험이 적은 해결 방법을 선택하는 방법을 보여줍니다. 목표는 데이터 손실을 악화시키지 않으면서 할당을 복원하는 것입니다.
샤드 상태 및 클러스터 상태 이해
샤드는 Elasticsearch가 데이터 노드에 배치하는 단위입니다. 여러 상태로 존재할 수 있습니다.
- STARTED: 샤드가 활성 상태이며 요청을 처리 중입니다.
- RELOCATING: 샤드가 한 노드에서 다른 노드로 이동 중입니다.
- INITIALIZING: 샤드가 생성되거나 복구 중입니다.
- UNASSIGNED: 샤드가 클러스터 메타데이터에 존재하지만 노드에 할당되지 않았습니다.
클러스터 상태는 이러한 샤드 상태를 따릅니다.
- Green: 모든 기본 및 복제본 샤드가 할당되었습니다.
- Yellow: 모든 기본 샤드가 할당되었지만 하나 이상의 복제본이 할당되지 않았습니다.
- Red: 하나 이상의 기본 샤드가 할당되지 않았습니다. 검색이 영향을 받는 인덱스에 대해 부분적인 결과를 반환하거나 실패할 수 있으며, 해당 인덱스에 대한 쓰기가 실패할 수 있습니다.
샤드 할당 실패의 일반적인 원인
Elasticsearch는 샤드를 배치하기 전에 할당 결정자를 사용합니다. 단일 NO 결정으로 샤드가 할당되지 않은 상태로 유지될 수 있습니다.
디스크 워터마크
디스크 압력은 가장 일반적인 원인 중 하나입니다. Elasticsearch는 디스크 워터마크를 사용하여 노드가 가득 차는 것을 방지합니다. 노드가 낮은 또는 높은 워터마크를 초과하면 할당 결정이 더 제한적이 됩니다. 플러드 스테이지 워터마크에서 Elasticsearch는 노드가 디스크 부족으로부터 보호하기 위해 영향을 받는 인덱스에 읽기 전용 블록을 추가할 수 있습니다.
| 설정 | 일반 기본값 | 효과 |
|---|---|---|
cluster.routing.allocation.disk.watermark.low |
85% | 이 임계값을 초과하는 노드에 추가 샤드 할당을 방지합니다. |
cluster.routing.allocation.disk.watermark.high |
90% | 샤드를 다른 곳으로 이동시키고 노드에 샤드 배치를 방지합니다. |
cluster.routing.allocation.disk.watermark.flood_stage |
95% | 영향을 받는 인덱스에 대한 쓰기를 차단할 수 있습니다. |
변경하기 전에 클러스터의 실제 설정을 확인하십시오.
GET /_cluster/settings?include_defaults=true&filter_path=**.disk.watermark*
그런 다음 노드 디스크 사용량을 확인하십시오.
GET /_cat/allocation?v&h=node,disk.used_percent,disk.avail,disk.total,shards
공간을 확보하고, 디스크를 추가하고, 데이터 노드를 추가하고, 오래된 인덱스를 삭제하거나 복제본 압력을 줄이십시오. 플러드 스테이지 블록이 설정된 경우 디스크 압력이 해결된 후에만 제거하십시오.
PUT /my_index/_settings
{
"index.blocks.read_only_allow_delete": null
}
노드 역할 및 할당 필터
인덱스 샤드는 데이터 역할이 있고 할당 필터와 일치하는 노드에만 할당됩니다. 핫/웜 계층, 랙, 영역 또는 스토리지 유형에 노드 속성을 사용하는 경우 오타로 인해 샤드가 고립될 수 있습니다.
예를 들어, index.routing.allocation.require.box_type: high_io가 있는 인덱스는 node.attr.box_type: high_io로 구성된 노드에만 할당됩니다.
인덱스 필터 및 노드 속성을 확인하십시오.
GET /my_index/_settings?filter_path=*.settings.index.routing.allocation
GET /_cat/nodeattrs?v
GET /_cat/nodes?v&h=name,roles,disk.used_percent
인덱스 설정을 수정하거나 적격한 데이터 노드를 추가하십시오. 다중 영역 클러스터에서 할당 인식 기능을 함부로 제거하지 마십시오. 동일한 장애 도메인에 샤드의 모든 복사본이 배치될 수 있습니다.
누락된 기본 샤드
기본 샤드가 할당되지 않은 경우 활성 기본 샤드를 보유한 노드가 사라졌거나, 인덱스가 방금 복원되었거나, 할당 규칙이 모든 적격 노드를 차단하고 있을 수 있습니다. 할당 설명 API가 Elasticsearch가 샤드를 할당할 수 없는 이유를 알려줄 때까지 데이터가 손실되었다고 가정하지 마십시오.
일반적인 시나리오는 다음과 같습니다.
- 유일한 양호한 기본 복사본을 보유한 노드가 충돌했습니다.
- 할당 필터가 기본 샤드를 호스팅할 수 있는 모든 데이터 노드를 제외합니다.
- 스냅샷 복원 또는 인덱스 생성이 적격 노드를 기다리고 있습니다.
- 오래된 샤드 복사본이 존재하지만 Elasticsearch는 명시적인 데이터 손실 수락 없이 이를 승격하지 않습니다.
먼저 누락된 노드를 복구하거나, 스냅샷을 복원하거나, 할당 차단 요소를 수정하십시오. 강제 기본 할당은 어떤 복사본이 오래되었는지 이해하거나 해당 샤드에 대한 데이터 손실을 수락한 경우에만 사용하십시오.
샤드 제한
노드당 샤드 제한도 할당을 차단할 수 있습니다. 일반적인 설정으로는 index.routing.allocation.total_shards_per_node 및 cluster.routing.allocation.total_shards_per_node가 있습니다.
해당 제한을 확인하십시오.
GET /_cluster/settings?include_defaults=true&filter_path=**.total_shards_per_node
GET /my_index/_settings?filter_path=*.settings.index.routing.allocation.total_shards_per_node
노드를 추가하고, 복제본 수를 줄이고, 작은 인덱스를 통합하거나, 관련 제한을 신중하게 높이십시오. 노드당 너무 많은 샤드는 힙 압력을 증가시키고 클러스터 상태 작업을 느리게 할 수 있습니다.
할당 설명 API로 진단
할당 설명 API는 "이 샤드가 할당되지 않는 이유는 무엇입니까?"에 답하는 가장 좋은 도구입니다.
GET /_cluster/allocation/explain?pretty
{
"index": "my_data",
"shard": 0,
"primary": true
}
Elasticsearch가 현재 할당되지 않은 샤드 하나를 선택하도록 하려면 본문 없이 API를 호출하십시오.
GET /_cluster/allocation/explain?pretty
먼저 다음 필드를 읽으십시오.
can_allocate: 상위 수준 답변입니다.allocate_explanation: 일반 영어 요약입니다.node_allocation_decisions: 노드별 결정입니다.deciders:NO또는THROTTLE을 반환한 정확한 규칙입니다.
NO 결정은 차단 요소입니다. THROTTLE 결정은 일반적으로 Elasticsearch가 샤드를 할당할 수 있지만 동시 복구 작업을 제한하고 있음을 의미합니다.
안전한 문제 해결 순서
광범위하게 시작한 다음 좁혀 나가십시오.
1. 클러스터 상태 및 할당되지 않은 샤드 확인
GET /_cluster/health?pretty
GET /_cat/shards?v&h=index,shard,prirep,state,unassigned.reason,node
unassigned.reason을 확인하십시오. NODE_LEFT, INDEX_CREATED, CLUSTER_RECOVERED 또는 ALLOCATION_FAILED와 같은 값은 다음에 어디를 봐야 하는지 알려줍니다.
2. 디스크 및 노드 적격성 확인
GET /_cat/allocation?v&h=node,disk.used_percent,disk.avail,disk.total
GET /_cat/nodes?v&h=name,roles,heap.percent,ram.percent,cpu,disk.used_percent
노드가 높은 워터마크에 가까우면 할당 설정을 변경하기 전에 디스크 압력을 해결하십시오.
3. 할당 설명 실행
영향을 받는 인덱스, 샤드 번호 및 기본/복제본 플래그를 사용하십시오. 출력은 할당을 차단하는 설정, 노드 조건 또는 결정자의 이름을 지정해야 합니다.
4. 원인을 알기 전까지 위험한 재라우팅 피하기
수동 재라우팅 명령은 특정 복구 사례를 위한 것입니다. 디스크 압력, 잘못된 필터 또는 너무 많은 복제본에 대한 일반적인 해결 방법이 아닙니다.
오래된 기본 복사본이 유일한 실용적인 복구 경로인 경우 명령은 다음과 같습니다.
POST /_cluster/reroute
{
"commands": [
{
"allocate_stale_primary": {
"index": "index_name",
"shard": 0,
"node": "node_name_with_stale_copy",
"accept_data_loss": true
}
}
]
}
accept_data_loss: true는 이유가 있어 필요합니다. 스냅샷을 확인하고, 누락된 노드를 복구하고, 오래된 복사본을 보유한 노드를 확인한 후에만 사용하십시오.
5. 노란색 상태 별도 처리
복제본만 할당되지 않은 경우 클러스터는 여전히 기본 데이터를 제공할 수 있습니다. 먼저 기본 리소스 제약 조건을 해결하십시오. 데이터 노드를 추가하거나, 디스크를 정리하거나, 할당 필터를 수정하면 일반적으로 Elasticsearch가 복제본을 자동으로 할당할 수 있습니다.
복제본 없이 임시로 실행해야 하는 경우 영향을 받는 인덱스의 복제본 수를 줄이십시오.
PUT /my_index/_settings
{
"index.number_of_replicas": 0
}
이렇게 하면 Elasticsearch가 해당 인덱스에 대한 복제본 복사본을 더 이상 예상하지 않기 때문에 상태가 녹색으로 바뀔 수 있습니다. 또한 가용성을 감소시키므로 용량을 추가하거나 할당을 수정한 후 복제본을 원하는 값으로 다시 설정하십시오.
할당 문제 방지
- 노드가 높은 디스크 워터마크를 초과하기 전에 경고합니다.
- 복제본 수 및 할당 인식 규칙에 맞게 충분한 데이터 노드를 사용할 수 있도록 유지합니다.
- 힙, 데이터 볼륨 및 복구 목표에 맞는 샤드 수를 사용합니다.
- 새 인덱스가 잘못된 복제본 수 또는 할당 필터를 상속하지 않도록 인덱스 템플릿을 검토합니다.
- 장애 발생 전에 노드 교체 및 스냅샷 복원 단계를 테스트합니다.
결론
가장 안전한 경로는 간단합니다. 할당되지 않은 샤드를 식별하고, 할당 설명을 실행하고, NO라고 말하는 결정자를 수정하고, 데이터 손실 트레이드오프를 수락하지 않는 한 강제 할당을 피하십시오.