ElasticSearch : 할당되지 않은 샤드, 수정 방법?


165

노드가 4 개인 ES 클러스터가 있습니다.

number_of_replicas: 1
search01 - master: false, data: false
search02 - master: true, data: true
search03 - master: false, data: true
search04 - master: false, data: true

search03을 다시 시작해야했고 다시 돌아 왔을 때 클러스터에 아무런 문제가 없었지만 할당되지 않은 샤드 7 개를 남겨 두었습니다.

{
  "cluster_name" : "tweedle",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 4,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 15,
  "active_shards" : 23,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 7
}

이제 클러스터가 노란색 상태입니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

  • 샤드를 삭제 (취소) 하시겠습니까?
  • 샤드를 다른 노드로 이동 하시겠습니까?
  • 샤드를 노드에 할당 하시겠습니까?
  • 'number_of_replicas'를 2로 업데이트 하시겠습니까?
  • 완전히 다른 것?

흥미롭게도, 새로운 인덱스가 추가되었을 때, 그 노드는 그 노드에서 작업을 시작했고 클러스터의 나머지 부분과 잘 어울 렸습니다.

질문에 따르십시오. 처음에 이런 일이 발생하도록 잘못하고 있습니까? 노드가 다시 시작될 때 이런 식으로 동작하는 클러스터에 대해서는 확신이 없습니다.

참고 : 어떤 이유로 단일 노드 클러스터를 실행중인 경우 다음을 수행하면됩니다.

curl -XPUT 'localhost:9200/_settings' -d '
{
    "index" : {
        "number_of_replicas" : 0
    }
}'

답변:


117

기본적으로 Elasticsearch는 샤드를 노드에 동적으로 다시 할당합니다. 그러나 샤드 할당을 비활성화 한 경우 ( 롤링 재시작 을 수행 한 다시 활성화하지 않은 경우) 샤드 할당을 다시 활성화 할 수 있습니다.

# v0.90.x and earlier
curl -XPUT 'localhost:9200/_settings' -d '{
    "index.routing.allocation.disable_allocation": false
}'

# v1.0+
curl -XPUT 'localhost:9200/_cluster/settings' -d '{
    "transient" : {
        "cluster.routing.allocation.enable" : "all"
    }
}'

그러면 Elasticsearch는 샤드를 정상적으로 재 할당합니다. 이 모금 고려 느릴 수 있습니다 indices.recovery.max_bytes_per_seccluster.routing.allocation.node_concurrent_recoveries 그것을 속도.

여전히 문제가 발생하면 다른 문제가있을 수 있으므로 Elasticsearch 로그에서 오류를 찾으십시오. 당신이 볼 경우 EsRejectedExecutionException스레드 풀은 너무 작은 수 있습니다 .

마지막으로 reroute API를 사용하여 샤드를 노드에 명시 적으로 재 할당 할 수 있습니다 .

# Suppose shard 4 of index "my-index" is unassigned, so you want to
# assign it to node search03:
curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
    "commands": [{
        "allocate": {
            "index": "my-index",
            "shard": 4,
            "node": "search03",
            "allow_primary": 1
        }
    }]
}'

3
내가 해냈을 때 : { "error" : "ElasticsearchIllegalArgumentException[[allocate] failed to find [logstash-2015.01.05][1] on the list of unassigned shards]", "status" : 400 } 샤드가 ES-Head에서 할당되지 않은 것 중 하나임을 알 수 있지만
wjimenez5271

부수적으로, 다른 샤드가 할당되지 않은 것으로 표시된 작업을 수행 한 후 나머지 샤드는 자체적으로 수정되었습니다.
wjimenez5271

이것은 훌륭한 조언입니다.
Yehosef

1
릴리스 5.0 이후로 "allocate"명령 은 더 많은 옵션을 제공하도록 변경되었습니다. 위의 예는 이제 "allow_primary"매개 변수를 생략하고 "allocate_empty_primary"입니다.
jmb

4
-H 'Content-Type: application/json'오류가 발생하면 추가해야합니다Content-Type header [application/x-www-form-urlencoded] is not supported
luckydonald

56

좋아, 나는 ES 지원의 도움으로 이것을 해결했다. 모든 노드 (또는 문제의 원인으로 생각되는 노드)에서 API에 다음 명령을 실행하십시오.

curl -XPUT 'localhost:9200/<index>/_settings' \
    -d '{"index.routing.allocation.disable_allocation": false}'

<index>범인으로 생각되는 지수는 어디에 있습니까 ? 모르는 경우 모든 노드에서 실행하십시오.

curl -XPUT 'localhost:9200/_settings' \
    -d '{"index.routing.allocation.disable_allocation": false}'

또한이 줄을 yaml 구성에 추가 한 후 서버 / 서비스를 다시 시작할 때 문제가 없었습니다. 샤드가 즉시 다시 할당되었습니다.

FWIW, 자주 묻는 질문에 대답하려면 컴퓨터에 RAM이 60G 미만인 경우를 제외하고 MAX_HEAP_SIZE를 30G로 설정하십시오.이 경우 사용 가능한 메모리의 절반으로 설정하십시오.

참고 문헌


2
버전 1.1.1에서이 문제를 해결하려면 cluster.routing.allocation.enable = none을 사용해야합니까?
user3175226

1
할당 비활성화는 더 이상 11 월 20 일 현재 더 이상 문서화되어 있지 않습니다.

3
라우팅 할당은 클러스터 전체 설정이므로 명령을 보낼 노드는 중요하지 않습니다.
Wilfred Hughes

es yml 파일에 둘 다 추가했습니다. index.routing.allocation.disable_allocation : false cluster.routing.allocation.enable: none그러나 여전히 할당되지 않은 샤드가 표시됩니다. 이유는 무엇입니까?
bagui

1
버전 6.8에서는 다음과 같은 오류가 발생합니다.{ "type": "illegal_argument_exception", "reason": "unknown setting [index.routing.allocation.disable_allocation] please check that any required plugins are installed, or check the breaking changes documentation for removed settings" } ],
Janac Meena

39

이 작은 bash 스크립트는 강제로 재 할당을 수행하므로 데이터가 손실 될 수 있습니다.

NODE="YOUR NODE NAME"
IFS=$'\n'
for line in $(curl -s 'localhost:9200/_cat/shards' | fgrep UNASSIGNED); do
  INDEX=$(echo $line | (awk '{print $1}'))
  SHARD=$(echo $line | (awk '{print $2}'))

  curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
     "commands": [
        {
            "allocate": {
                "index": "'$INDEX'",
                "shard": '$SHARD',
                "node": "'$NODE'",
                "allow_primary": true
          }
        }
    ]
  }'
done

매력처럼 일했다. 감사!
Paulo Pires

이 오류가 발생했습니다 : < "error": "JsonParseException [예기치 않은 문자 r ( ','(코드 44)) : 유효한 값 (숫자, 문자열, 배열, 객체, 'true', 'false'또는 'null') \ n에서 [출처 : [B @ 3b1fadfb; 줄 : 6, 열 : 27]] ","status ": 500} <br> 수정하려면 어떻게해야합니까
biolinh

정말 감사합니다! 귀중한 시간을 절약했습니다 !!
Sathish

스크립트에서 오류가 발생합니다.{"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}{"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}
Janac Meena

17

나를 위해 일한 유일한 것은 number_of_replicas를 변경하는 것입니다 (복제본이 2 개 있었으므로 1로 변경 한 다음 다시 2로 변경했습니다).

먼저:

PUT /myindex/_settings
{
    "index" : {
        "number_of_replicas" : 1
     }
}

그때:

PUT /myindex/_settings
{
    "index" : {
        "number_of_replicas" : 2
     }
}

(나는 이미이 질문에 그것을 놀라게 했다 )


9

아래 구성이 모두로 설정되어 있으면 Elasticsearch에서 자동으로 샤드를 할당합니다. 이 구성은 cluster.routing.allocation.enable 및 rest api를 사용하여 설정할 수 있습니다 .

아래 구성을 적용한 후에도 es가 샤드를 자동으로 할당하지 못하면 샤드를 직접 할당해야합니다. 이에 대한 ES 공식 링크

클러스터에서 할당되지 않은 모든 샤드를 강제로 할당하는 스크립트를 작성했습니다.

아래 배열에는 할당되지 않은 샤드의 균형을 유지하려는 노드 목록이 포함되어 있습니다.

#!/bin/bash
array=( node1 node2 node3 )
node_counter=0
length=${#array[@]}
IFS=$'\n'
for line in $(curl -s 'http://127.0.0.1:9200/_cat/shards'|  fgrep UNASSIGNED); do
    INDEX=$(echo $line | (awk '{print $1}'))
    SHARD=$(echo $line | (awk '{print $2}'))
    NODE=${array[$node_counter]}
    echo $NODE
    curl -XPOST 'http://127.0.0.1:9200/_cluster/reroute' -d '{
        "commands": [
        {
            "allocate": {
                "index": "'$INDEX'",
                "shard": '$SHARD',
                "node": "'$NODE'",
                "allow_primary": true
            }
        }
        ]
    }'
    node_counter=$(((node_counter)%length +1))
done

이 스크립트는 작동하지 않습니다. 즉, 실행 한 후에도 여전히 할당되지 않은 샤드가있었습니다.
크리스 F

@ChrisF line1에서 : node1, node2, node3을 실제 노드 이름으로 바꿔야합니다. curl localhost : 9200 / _cat / nodes를 사용하여 얻을 수 있습니다.
sidi

6

나는 오늘 같은 샤드 할당 문제를 고수했다. W. Andrew Loe III 가 그의 대답에서 제안한 스크립트는 저에게 효과적이지 않으므로 조금 수정하여 마침내 작동했습니다.

#!/usr/bin/env bash

# The script performs force relocation of all unassigned shards, 
# of all indices to a specified node (NODE variable)

ES_HOST="<elasticsearch host>"
NODE="<node name>"

curl ${ES_HOST}:9200/_cat/shards > shards
grep "UNASSIGNED" shards > unassigned_shards

while read LINE; do
  IFS=" " read -r -a ARRAY <<< "$LINE"
  INDEX=${ARRAY[0]}
  SHARD=${ARRAY[1]}

  echo "Relocating:"
  echo "Index: ${INDEX}"
  echo "Shard: ${SHARD}"
  echo "To node: ${NODE}"

  curl -s -XPOST "${ES_HOST}:9200/_cluster/reroute" -d "{
    \"commands\": [
       {
         \"allocate\": {
           \"index\": \"${INDEX}\",
           \"shard\": ${SHARD},
           \"node\": \"${NODE}\",
           \"allow_primary\": true
         }
       }
     ]
  }"; echo
  echo "------------------------------"
done <unassigned_shards

rm shards
rm unassigned_shards

exit 0

이제 저는 Bash 전문가가 아니지만 스크립트가 실제로 제 경우에 효과적이었습니다. "ES_HOST"및 "NODE"변수에 적절한 값을 지정해야합니다.


불행히도 ES5x는 호환성을 상실했습니다
Fawix

2
ES5x와 일에 위의 스크립트의 순서를 교체 allocateallocate_empty_primary와 교체 \"allow_primary\": true\"accept_data_loss\": true
Fawix

{"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}Fawix의 제안을 적용한 후에도 받기
Janac Meena

6

필자의 경우 하드 디스크 공간 상한에 도달했습니다.

이 기사를보십시오 : https://www.elastic.co/guide/en/elasticsearch/reference/current/disk-allocator.html

기본적으로, 나는 달렸다.

PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "90%",
    "cluster.routing.allocation.disk.watermark.high": "95%",
    "cluster.info.update.interval": "1m"
  }
}

따라서 <90 % 하드 디스크 공간이 사용 된 경우 할당하고> 95 % 하드 디스크 공간이 사용되는 경우 샤드를 클러스터의 다른 시스템으로 이동합니다. 1 분마다 확인합니다.


4

어쩌면 누군가에게 도움이 될 수 있지만 같은 문제가 있었고 로그가 너무 커져서 저장 공간이 부족했기 때문입니다.

그것이 누군가를 돕기를 바랍니다! :)


4

필자의 경우 새 인덱스 를 만들면 기본 number_of_replicas 가 1로 설정됩니다. 클러스터의 노드 수는 하나뿐이므로 복제본을 만들 추가 노드가 없으므로 상태가 노란색으로 바뀌 었습니다. 설정으로 색인을 만들 때 속성을 사용 number_of_replicas 를 0으로 설정하면 정상적으로 작동합니다. 도움이 되었기를 바랍니다.

PUT /customer
{
    "settings": {
        "number_of_replicas": 0
    }
}

3

나는 같은 문제가 있었지만 근본 원인은 버전 번호 (두 노드에서 1.4.2 (문제가 있음)와 두 노드에서 1.4.4 (ok))의 차이였습니다. 첫 번째 및 두 번째 응답 ( "index.routing.allocation.disable_allocation"을 false로 설정하고 "cluster.routing.allocation.enable"을 "all"로 설정)이 작동하지 않았습니다.

그러나 @Wilfred Hughes의 답변 (과도를 사용하여 "cluster.routing.allocation.enable"을 "all"로 설정)은 다음과 같은 오류가 발생했습니다.

[NO (대상 노드 버전 [1.4.2]이 소스 노드 버전 [1.4.4]보다 오래되었습니다)]

이전 노드를 1.4.4로 업데이트 한 후이 노드는 다른 정상 노드와 다시 시작되었습니다.


3

나는이 문제를 겪고 있었고 쉽게 해결할 수있는 방법을 찾았습니다.

  • 할당되지 않은 샤드의 인덱스 가져 오기

    $ curl -XGET http://172.16.4.140:9200/_cat/shards
    
  • 큐레이터 도구를 설치하고이를 사용하여 색인 삭제

    $ curator --host 172.16.4.140 delete indices --older-than 1 \
           --timestring '%Y.%m.%d' --time-unit days --prefix logstash
    

    참고 : 제 경우에는 지수는 2016-04-21 일의 로그입니다.

  • 그런 다음 샤드를 다시 확인하면 할당되지 않은 모든 샤드가 사라집니다!

1
@sim, 내 답변을 편집 해 주셔서 감사합니다. 나는 편집에 매우 가난하고 그것에 더 많은 관심을 기울일 것입니다.
user3391471

나를 위해, 그것은 :curator_cli --host 127.0.0.1 delete_indices --filter_list '[{"filtertype":"pattern","kind":"prefix","value":"logstash-"}]'
가우

2

나는 또한이 상황을 충족시키고 마침내 고쳤다.

먼저 내 상황을 설명하겠습니다. ElasticSearch 클러스터에 두 개의 노드가 있는데 서로 찾을 수 있지만 "number_of_replicas": 2 , "number_of_shards": 5 설정으로 인덱스를 만들면 ES가 노란색 신호를 표시하고 unassigned_shards는 5입니다.

number_of_replicas 의 값을 1로 설정 하면 모든 것이 정상 이기 때문에 문제가 발생 합니다.


4
복제본 수는 항상 보유한 노드 수의 N-1이어야합니다. 따라서 2 개의 노드가있는 시나리오에서 노드 중 1 개에는 기본 샤드가 포함되고 다른 노드에는 복제본이 있으므로 복제본 수는 1로 설정해야합니다. N = 2, N-1 = 1
slm

1

필자의 경우 이전 공유가있는 이전 노드가 클러스터에 가입하고 있었으므로 이전 노드를 종료하고 할당되지 않은 샤드가있는 인덱스를 삭제해야했습니다.


1

위의 제안 중 몇 가지를 시도했지만 불행히도 그중 아무것도 작동하지 않았습니다. 우리는 앱이 오류를 쓰는 낮은 환경에 "로그"인덱스를 가지고 있습니다. 단일 노드 클러스터입니다. 나를 위해 해결 한 것은 노드의 YML 구성 파일을 확인하고 여전히 기본 설정 "gateway.expected_nodes : 2"가 있는지 확인하는 것입니다. 이것은 우리가 가진 다른 설정보다 우선합니다. 이 노드에서 인덱스를 만들 때마다 5 개의 샤드 중 3 개를 팬텀 2 번째 노드로 분산하려고 시도합니다. 따라서 이들은 할당되지 않은 것으로 보이며 절대 첫 번째 노드로 이동할 수 없습니다.

솔루션은 구성을 편집하고 "gateway.expected_nodes"설정을 1로 변경하여 클러스터에서 결코 찾을 수없는 형제를 찾고 종료하고 Elastic 서비스 인스턴스를 다시 시작했습니다. 또한 인덱스를 삭제하고 새 인덱스를 만들어야했습니다. 인덱스를 생성 한 후 샤드는 모두 첫 번째 및 유일한 노드에 나타 났으며 할당되지 않은 것은 없었습니다.

# Set how many nodes are expected in this cluster. Once these N nodes
# are up (and recover_after_nodes is met), begin recovery process immediately
# (without waiting for recover_after_time to expire):
#
# gateway.expected_nodes: 2
gateway.expected_nodes: 1

1

나를 위해, 이것은 dev 콘솔에서 "POST / _cluster / reroute? retry_failed"를 실행하여 해결되었습니다.

.....

인덱스 목록을 살펴보고 어떤 인덱스가 빨간색인지 확인한 다음 실행했습니다.

"/_cat/shards?h=[INDEXNAME],shard,prirep,state,unassigned.reason 받기"

그리고 샤드가 ALLOCATION_FAILED 상태로 멈춰있는 것을 보았으므로 위의 재 시도를 실행하면 할당을 재 시도했습니다.


버전 5.6.3부터 comand는 /_cat/shards/[INDEXNAME]?h=,shard,prirep,state,unassigned.reason을 가져와야합니다.
fasantos

0

도움이 될 수 있지만 내장 모드에서 ES를 실행하려고 할 때이 문제가 발생했습니다. 노드에 local (true)이 설정되어 있는지 확인했습니다.


0

할당되지 않은 샤드의 또 다른 이유는 클러스터에서 Elasticsearch 이진 버전을 두 개 이상 실행하고 있기 때문입니다.

최신 버전에서 이전 버전으로의 샤드 복제가 작동하지 않습니다

이는 할당되지 않은 샤드의 근본 원인 일 수 있습니다.

탄력적 문서-롤링 업그레이드 프로세스


0

나는 정확히 같은 문제에 부딪쳤다. Elasticsearch를 다시 시작하기 전에 샤드 할당을 일시적으로 false로 설정하면이를 방지 할 수 있지만 할당되지 않은 샤드가 이미 있으면 수정되지 않습니다.

필자의 경우 데이터 노드의 디스크 여유 공간 부족으로 인해 발생했습니다. 할당되지 않은 샤드는 다시 시작한 후에도 데이터 노드에 있지만 마스터가 인식하지 않는 샤드입니다.

디스크에서 노드 중 하나를 정리하면 복제 프로세스가 시작됩니다. 모든 데이터를 한 데이터 노드에서 다른 데이터 노드로 복사해야하기 때문에 다소 느린 프로세스입니다.


0

할당되지 않은 샤드를 삭제하거나 특정 데이터 노드에 수동으로 할당하려고했습니다. 할당되지 않은 샤드가 계속 나타나고 상태가 계속 "빨간색"이므로 작동하지 않았습니다. 그런 다음 데이터 노드 중 하나가 "다시 시작"상태로 멈췄습니다. 나는 데이터 노드의 수를 줄이고 그것을 죽였다. 더 이상 문제를 재현 할 수 없습니다.


0

나는 스스로 치유되지 않는 것처럼 보이는 할당되지 않은 샤드가있는 두 개의 인덱스를 가졌습니다. 나는 결국 여분의 data-node 를 일시적으로 추가함으로써 이것을 해결했다 [1] . 지수가 건강 해지고 모든 것이 녹색으로 안정화 된 후 여분의 노드를 제거했습니다. 하고 시스템은 다시 균형을 잡고 건강한 상태를 유지할 수있었습니다.

한 번에 여러 데이터 노드를 강제 종료하지 않는 것이 좋습니다 (이 상태로 전환하는 방법). 아마도 적어도 하나의 샤드에 대한 사본 / 복제본을 보존하지 못했습니다. 운 좋게도 Kubernetes는 디스크 스토리지를 유지하고 데이터 노드를 다시 시작할 때 재사용했습니다.


... 몇시가 지났다 ...

글쎄, 이번에는 노드를 추가하는 것이 효과가없는 것처럼 보였으므로 (몇 분 동안 기다린 후에) REST API를 둘러보기 시작했습니다.

GET /_cluster/allocation/explain

이것은와 함께 새로운 노드를 보여주었습니다 "decision": "YES".

그건 그렇고, 모든 기존 노드는 "decision": "NO"로 인해 발생했습니다 "the node is above the low watermark cluster setting". 따라서 이것은 내가 이전에 언급했던 것과 다른 경우 일 것입니다.

그럼 다음 POST 간단한 제조 [2] 없음 본체와 , 기어로 물건을 걷어 ...

POST /_cluster/reroute

기타 참고 사항 :


[1] 충분한 헤드 룸이있는 경우 Kubernetes에서 수행하기가 매우 쉽습니다 . 대시 보드를 통해 상태 저장 세트를 확장하십시오.

[2] Kibana "Dev Tools"인터페이스를 사용하여 SSH / exec 쉘을 신경 쓸 필요가 없었습니다.


0

난 그냥 먼저 증가

"index.number_of_replicas"

1 씩 (노드가 동기화 될 때까지 기다린 후) 1 씩 줄임으로써 할당되지 않은 샤드를 효과적으로 제거하고 데이터 손실 위험없이 클러스터가 다시 녹색으로 다시 설정됩니다.

더 좋은 방법이 있다고 생각하지만 이것이 더 쉽습니다.

도움이 되었기를 바랍니다.


0

손상된 샤드를 처리 할 때 복제 팩터를 0으로 설정 한 다음 원래 값으로 다시 설정할 수 있습니다. 손상된 샤드가 아닌 경우 대부분 정리하고 클러스터에서 새 복제본을 재배치합니다.

복제 계수 0을 사용하도록 할당되지 않은 복제본으로 인덱스 설정 :

curl -XGET http://localhost:9200/_cat/shards |\
  grep UNASSIGNED | grep ' r ' |\
  awk '{print $1}' |\
  xargs -I {} curl -XPUT http://localhost:9200/{}/_settings -H "Content-Type: application/json" \
  -d '{ "index":{ "number_of_replicas": 0}}'

다시 1로 설정 :

curl -XGET http://localhost:9200/_cat/shards |\
  awk '{print $1}' |\
  xargs -I {} curl -XPUT http://localhost:9200/{}/_settings -H "Content-Type: application/json" \
  -d '{ "index":{ "number_of_replicas": 1}}'

참고 : 다른 인덱스에 대해 다른 복제 요소가있는 경우이를 실행하지 마십시오. 이것은 모든 인덱스의 복제 인자를 1로 하드 코딩합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.