ElasticSearch: Nieprzypisane odłamki, jak naprawić?

Mam klaster ES z 4 węzłami:

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

Musiałem ponownie uruchomić search03, a kiedy wrócił, dołączył do klastra bez problemu, ale zostawił 7 nieprzypisanych odłamków leżących wokół.

{
  "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
}
Teraz moja Gromada jest w stanie żółtym. Jaki jest najlepszy sposób rozwiązania tego problemu?
  • usunąć (anulować) odłamki?
  • przenieść odłamki do innego węzła?
  • przypisać odłamki do węzła?
  • Update 'number_of_replicas' to 2?
  • coś zupełnie inaczej?

Co ciekawe, kiedy dodano nowy indeks, ten węzeł zaczął nad nim pracować i grał ładnie z resztą klastra, po prostu zostawił nieprzypisane odłamki leżące wokół.

Kontynuuj pytanie: czy robię coś złego, aby to się stało w pierwszej kolejności? Nie mam wiele zaufania do klastra, który zachowuje się w ten sposób, gdy węzeł jest restartowany.

Uwaga: jeśli z jakiegoś powodu używasz pojedynczego klastra węzłów, możesz wystarczy wykonać następujące czynności:

curl -XPUT 'localhost:9200/_settings' -d '
{
    "index" : {
        "number_of_replicas" : 0
    }
}'
Author: Spanky, 2013-11-14

19 answers

Domyślnie Elasticsearch ponownie przydziela odłamki do węzłów dynamicznie. Jeśli jednak wyłączyłeś przydzielanie shard (być może wykonałeś (aś) rolling restart i zapomniałeś go ponownie włączyć), możesz ponownie włączyć przydzielanie shard.

# 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 ponownie przypisze odłamki jak zwykle. Może to być powolne, rozważ podnoszenie indices.recovery.max_bytes_per_sec i cluster.routing.allocation.node_concurrent_recoveries, aby przyspieszyć.

Jeśli nadal widzisz problemy, prawdopodobnie coś innego jest nie tak, więc zajrzyj do dzienników Elasticsearch pod kątem błędów. Jeśli Zobacz EsRejectedExecutionException twoje pule wątków mogą być zbyt małe .

Wreszcie, możesz jawnie przypisać odłamek do węzła za pomocą 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
        }
    }]
}'
 99
Author: Wilfred Hughes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-06 12:00:51

OK, rozwiązałem to z pomocą wsparcia ES. Wydaje następujące polecenie do API na wszystkich węzłach (lub węzłach, które uważasz za przyczynę problemu):

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

Gdzie <index> jest indeksem, który uważasz za winowajcę. Jeśli nie masz pojęcia, po prostu uruchom to na wszystkich węzłach:

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

Dodałem również tę linię do mojego YML config i od tego czasu wszelkie restarty serwera / usługi były bezproblemowe. Odłamki zostały natychmiast przydzielone.

FWIW, aby odpowiedzieć często szukane pytanie, Ustaw MAX_HEAP_SIZE na 30G, chyba że Twój komputer ma mniej niż 60G pamięci RAM, w którym to przypadku ustaw ją na połowę dostępnej pamięci.

 46
Author: Spanky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-03 18:57:36

Ten mały skrypt Basha brutalnie zmieni przypisanie, możesz stracić dane.

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
 36
Author: W. Andrew Loe III,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-04 22:24:04

Jedyne co mi się udało to zmiana number_of_replicas(miałem 2 repliki, więc zmieniłem na 1, a potem z powrotem na 2).

Pierwszy:

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

Wtedy:

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

(już w to pytanie )

 11
Author: Edi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:24

Elasticsearch automatycznie przydziela odłamki, jeśli poniższa konfiguracja jest ustawiona na all. Tę konfigurację można ustawić również za pomocą rest api Gromada./ align = "left" / przydział.enable: all

Jeśli nawet po zastosowaniu poniższej konfiguracji es Nie przypisze odłamków automatycznie, musisz wymusić przypisanie odłamków samodzielnie. ES oficjalny link do tego

Napisałem skrypt, aby wymusić przypisanie wszystkich nieprzypisanych odłamków w całym klastrze.

Poniżej tablica zawiera listę węzłów, wśród których chcesz zrównoważyć nieprzypisane odłamki

#!/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
 9
Author: Nischal Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-14 11:40:07

Utknąłem dzisiaj z tym samym problemem przydziału odłamków. Scenariusz, który W. Andrew Loe III zaproponował w swojej odpowiedzi nie działa dla mnie, więc zmodyfikowałem go trochę i w końcu zadziałał:

#!/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
Nie jestem jakimś Guru Basha, ale scenariusz naprawdę zadziałał w mojej sprawie. Zauważ, że musisz określić odpowiednie wartości dla zmiennych" ES_HOST "i" NODE".
 6
Author: Splanger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:19

W moim przypadku osiągnięto górną granicę miejsca na dysku twardym.

Spójrz na ten artykuł: https://www.elastic.co/guide/en/elasticsearch/reference/current/disk-allocator.html

W zasadzie biegłem:

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

, aby przydzielić 95% używanego miejsca na dysku twardym; i sprawdza co 1 minutę.

 5
Author: manyways,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-15 18:24:29

Może komuś to pomaga, ale ja miałem ten sam problem i był on spowodowany brakiem miejsca na dysku spowodowanym zbyt dużym logiem.

Mam nadzieję, że komuś pomoże! :)

 4
Author: Juanjo Lainez Reche,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-09 10:23:22

Miałem ten sam problem, ale główną przyczyną była różnica w numerach wersji (1.4.2 na dwóch węzłach (z problemami) i 1.4.4 na dwóch węzłach (ok)). Pierwsza i druga odpowiedź (ustawienie " index./ align = "left" / przydział.disable_allocation "to false and setting" cluster./ align = "left" / przydział.enable" to "all") nie działa.

Jednak odpowiedź przez @ Wilfred Hughes (ustawienie " cluster./ align = "left" / przydział.enable " to " all " using transient) dał mi błąd z następującą instrukcją:

[NO (wersja węzła docelowego [1.4.2] jest starsza niż wersja węzła źródłowego [1.4.4])]

Po aktualizacji starych węzłów do 1.4.4 węzły te zaczęły resnc z innymi dobrymi węzłami.

 3
Author: Jörg Rech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-09 20:16:20

Ja też miałem ten problem i znalazłem łatwy sposób na jego rozwiązanie.

  • Get the index of unassigned shards

    $ curl -XGET http://172.16.4.140:9200/_cat/shards
    
  • Zainstaluj narzędzia kuratora i użyj ich do usunięcia indeksu

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

    Uwaga: w moim przypadku indeks jest logstash dnia 2016-04-21

  • potem sprawdź ponownie odłamki, wszystkie nieprzypisane odłamki znikną!
 3
Author: user3391471,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 13:19:32

W moim przypadku, kiedy tworzę nowy indeks wtedy domyślna number_of_replicas jest ustawiona jako 1. A liczba węzłów w moim klastrze była tylko jedna, więc nie było dodatkowego węzła do tworzenia repliki, więc zdrowie zmieniało się na żółte. Więc kiedy stworzyłem Indeks z ustawienia właściwość i ustaw number_of_replicas jako 0. Potem działało dobrze. Mam nadzieję, że to pomoże.

PUT /customer
{
    "settings": {
        "number_of_replicas": 0
    }
}
 2
Author: Apoorv Nag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 15:00:32

Również spotykam się z tą sytuacją i w końcu ją naprawiam.

Najpierw opiszę moją sytuację. Mam dwa węzły w klastrze ElasticSearch, mogą się znaleźć, ale kiedy utworzyłem Indeks z ustawieniami "number_of_replicas" : 2, "number_of_shards": 5, ES pokazuje Żółty sygnał, a unassigned_shards to 5.

Problem występuje ponieważ wartość number_of_replicas, kiedy ustawiam jej wartość z 1, wszystko w porządku.

 2
Author: Armstrongya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 15:04:41

W moim przypadku Stary węzeł ze starymi udziałami dołączał do klastra, więc musieliśmy zamknąć Stary węzeł i usunąć indeksy z nieprzypisanymi odłamkami.

 1
Author: alwe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-24 13:17:36

Dla mnie to zostało rozwiązane poprzez uruchomienie tego z konsoli dev: "POST/_cluster / reroute?retry_failed "

.....

Zacząłem od spojrzenia na listę indeksów, aby zobaczyć, które indeksy były czerwone, a następnie uruchomił

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

I zobaczyłem, że odłamki utknęły w stanie ALLOCATION_FAILED, więc uruchomienie powyższej ponownej próby spowodowało, że ponownie spróbowali alokacji.

 1
Author: ScottFoster1000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-14 00:54:34

Może pomóc, ale miałem ten problem podczas próby uruchomienia ES w trybie embedded. Poprawka polegała na upewnieniu się, że węzeł ma ustawiony lokalny(true).

 0
Author: JamesC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-02 22:29:35

Innym możliwym powodem nieprzypisanych odłamków jest to, że Twój klaster działa więcej niż jedna Wersja pliku binarnego Elasticsearch.

Replikacja Shard z nowszej wersji do poprzedniej wersje nie będą działać

To może być główna przyczyna dla nieprzypisanych odłamków.

Elastic Documentation-Rolling Upgrade Process

 0
Author: Marc Tamsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-13 21:56:20

Natknąłem się na dokładnie ten sam problem. Można temu zapobiec, tymczasowo ustawiając przydział odłamków na false przed ponownym uruchomieniem elasticsearch, ale to nie naprawia nieprzypisanych odłamków, jeśli już tam są.

W moim przypadku było to spowodowane brakiem wolnego miejsca na dysku w węźle danych. Nieprzypisane odłamki, gdzie nadal na węźle danych po ponownym uruchomieniu, ale gdzie nie są rozpoznawane przez mistrza.

Po prostu czyszczenie 1 z węzłów z dysku uzyskało proces replikacji zaczęło się dla mnie. Jest to dość powolny proces, ponieważ wszystkie dane muszą być kopiowane z jednego węzła danych do drugiego.

 0
Author: Brian van Rooijen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-28 15:31:00

Wypróbowałem kilka z powyższych sugestii i niestety żadna z nich nie zadziałała. W naszym dolnym środowisku mamy indeks "Log", w którym aplikacje zapisują swoje błędy. Jest to klaster pojedynczego węzła. To, co mnie rozwiązało, to sprawdzenie pliku konfiguracyjnego YML dla węzła i zobaczenie, że nadal ma domyślne ustawienie " gateway.expected_nodes: 2". To było nadpisanie wszystkich innych ustawień, które mieliśmy. Ilekroć tworzymy indeks na tym węźle, próbowalibyśmy rozłożyć 3 z 5 odłamków na widmo Drugi węzeł. W związku z tym będą one wyglądały jako nieprzypisane i nigdy nie będą mogły zostać przeniesione do pierwszego i jedynego węzła.

Rozwiązaniem była edycja config, zmiana ustawienia " gateway.expected_nodes " do 1, więc przestanie szukać swojego nigdy nie znalezionego brata w klastrze i ponownie uruchomi Elastic service instance. Musiałem również usunąć indeks i utworzyć nowy. Po utworzeniu indeksu wszystkie odłamki pojawiły się na pierwszym i jedynym węźle, a żaden nie był bez przydziału.

# 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
 0
Author: Daniel Knowlton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-28 19:02:57

Próbowałem usunąć nieprzypisane odłamki lub ręcznie przypisać je do konkretnego węzła danych. Nie udało się, ponieważ nieprzypisane odłamki ciągle pojawiały się, a stan zdrowia był" czerwony " w kółko. Potem zauważyłem, że jeden z węzłów danych utknął w stanie "restart". Zmniejszyłem liczbę węzłów danych, zabiłem je. Problem nie jest już powtarzalny.

 0
Author: thepolina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-25 00:51:20