ES 스테핑 레코드의 할당되지 않은 조각을 복구할 수 없습니다.

문제 배경

노드 변경

총 6개의 노드를 실행하는 3대의 시스템이 있는 온라인 ES 클러스터가 있습니다. 몇 달 동안 온라인으로 실행되었으며 아무런 문제가 없었습니다. 불행하게도 바로 어제 클러스터에서 노드 3의 디스크에 오류가 발생하여 시스템이 직접 마비되었습니다. 처음에는 다들 큰 문제가 아니라고 생각했는데 ES는 재해복구 기능이 없나요?? 새로운 노드로 바꾸면 자동으로 샤드를 할당할 수 있습니다.

할당되지 않은

완전한 확신을 가지고 새 노드로 변경한 후 클러스터 상태는 항상 빨간색이었고 180개 이상의 할당되지 않은 샤드가 있음을 발견했습니다.

curl -XGET http://localhost:9200/_cluster/health

{
    "cluster_name": "escluster",
    "status": "red",
    "timed_out": false,
    "number_of_nodes": 6,
    "number_of_data_nodes": 6,
    "active_primary_shards": 498,
    "active_shards": 767,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 185,
    "delayed_unassigned_shards": 0,
    "number_of_pending_tasks": 0,
    "number_of_in_flight_fetch": 0,
    "task_max_waiting_in_queue_millis": 0,
    "active_shards_percent_as_number": 80.5672268907563
}
curl -XGET http://localhost:9200/_cat/shards | grep UNASSIGNED

이미지-20220727145303496

문제 해결

샤드 복구 동시성 ❌

할당되지 않은 샤드가 나타나므로 일부 조각이 조각화되지 않았음을 의미합니다. 초기에는 클러스터에 합류하는 새로운 노드가 되어야 한다고 당연하게 여겼고 아직 조각화가 복원되지 않았습니다. 샤드 할당 속도를 높이기 위해 동시 샤드 복구 수를 늘렸습니다.

curl -XPUT http://localhost:9200/_cluster/settings -H 'Content-Type: application/json' -d'
{
    "persistent": {
        "cluster.routing.allocation.node_concurrent_recoveries": 10 
    }
}
'

하지만 소용없었고, 한참을 기다려도 여전히 변화가 없었다.

할당 설명

그런 다음 명령을 사용하여 allocation explain조각의 할당 상태를 봅니다.

curl -XGET http://localhost:9200/_cluster/allocation/explain?pretty

이미지-20220727150428645

unassigned_info를 통해 볼 수 있습니다 NODE_LEFT. 이는 노드가 사라 졌음을 의미합니다. last_allocation_status가 더 명확하게 말했습니다. no_valid_shard_copy, 유효한 샤드 복사본이 없습니다. cannot allocate because a previous copy of the primary shard existed but can no longer be found on the nodes in the clusterallocate_explanation은 또한 클러스터 노드에서 사용 가능한 복사본을 찾을 수 없다는 효과에 대해 다음과 같이 말했습니다 .

우리도 매우 혼란스럽습니다.ES 재난 복구를 위해 ES 인덱스는 기본적으로 1개의 사본을 가지고 있습니다.ES 샤딩 전략에 따라 사본 샤드가 메인 샤드와 동일한 시스템에 배포되지 않습니다.어제, 그것은 하나의 노드가 손실되더라도 기본 할당 및 복제 조각이 손실되지 않아야 합니다. 혹시... 이 인덱스의 사본이 없는 것일까요? ? ?

한 번 해보자는 마음으로 누락된 인덱스 중 하나의 정보를 확인했습니다.

curl -XGET http://localhost:9200/XXX-2022.03.15/_settings
{
    "XXX-2022.03.15": {
        "settings": {
            "index": {
                "routing": {
                    "allocation": {
                        "require": {
                            "box_type": "hot"
                        }
                    }
                },
                "number_of_shards": "1",
                "provided_name": "XXX-2022.03.15",
                "creation_date": "1647273614797",
                "number_of_replicas": "0",
                "uuid": "Dy7G3ZaESYqLB_aFk8M3Cg",
                "version": {
                    "created": "7080099"
                }
            }
        }
    }
}

확인을 안하면 몰라요 확인해보니 의외네요 이 인덱스에 샤드가 1개인데 복사본이 없네요... 제 복사본은 어디있나요? ? ? 기계 디스크가 상대적으로 작기 때문에 저장 공간을 절약하기 위해 개발은 색인을 작성할 때 사본을 남기지 않습니다! ! !

좋은 사람, 나는 직접 좋은 사람입니다. 우리는 여전히 ES 재해 복구에 의존합니다. 이것은 망치 재해입니다. 사건이 해결되고 문제가 발견되었지만 데이터도 검색되지 않았습니다.

해결책

데이터를 검색할 수 없지만 클러스터가 항상 빨간색일 수는 없으며 처리해야 할 할당되지 않은 샤드가 여전히 180개 이상 있습니다.

경로 변경❌

인터넷에서 관련 솔루션을 검색하여 경로를 재구성하면 문제를 해결할 수 있음을 알게되었습니다.

curl -H 'Content-Type: application/json' \
    -XPOST http://localhost:9200/_cluster/reroute?pretty -d '{
    "commands" : [ {
        "allocate_stale_primary" :
            {
              "index" : "XXX", 
              "shard" : 0,
              "node" : "target-data-node-id",
              "accept_data_loss" : true
            }
        }
    ]
}'

그러나 데이터 노드가 손실되었기 때문에 다음과 같은 오류가 발생합니다.

이미지-20220727153403732

이것이 의미하는 바는 손실된 노드가 클러스터에 다시 합류하지 않으면 데이터가 사라진다는 것입니다.

allocate_empty_primary

데이터는 복구할 수 없으므로 샤드만 지울 수 있습니다.

curl -H 'Content-Type: application/json' \
    -XPOST http://localhost:9200/_cluster/reroute?pretty -d '{
    "commands" : [ {
        "allocate_empty_primary" :
            {
              "index" : "XXX", 
              "shard" : 0,
              "node" : "target-data-node-id",
              "accept_data_loss" : true
            }
        }
    ]
}'

인덱스 삭제

그보다 더 철저한 해결방법도 있는데 망가진 인덱스는 다 지우고 끝내는거고 어차피 데이터는 없어졌는데 데이터 없는 인덱스랑 젓갈이랑 뭐가 다른거지? 눈에 띄지 않고 눈에 띄지 않습니다.

참조

Supongo que te gusta

Origin blog.csdn.net/qq_32907195/article/details/132272370
Recomendado
Clasificación