Błąd Elasticsearch: wyjątek_klastra_bloku [FORBIDDEN / 12 / indeks tylko do odczytu / zezwalaj na usuwanie (api)], przekroczono znak wodny dysku etapu powodzi

107

Podczas próby wysyłania dokumentów do Elasticsearch w normalny sposób otrzymuję ten błąd:

cluster_block_exception [FORBIDDEN/12/index read-only / allow delete (api)];

Widzę również ten komunikat w dziennikach Elasticsearch:

flood stage disk watermark [95%] exceeded ... all indices on this node will marked read-only
Sean Hammond
źródło
Właśnie napotkałem ten problem, zadając to pytanie. ES omawia powiedzenie uwalnianie pamięci
Abhijith S

Odpowiedzi:

216

Dzieje się tak, gdy Elasticsearch uważa, że ​​na dysku jest mało miejsca, więc przechodzi w tryb tylko do odczytu.

Domyślnie decyzja Elasticsearch opiera się na odsetku wolnego miejsca na dysku, więc na dużych dyskach może się to zdarzyć, nawet jeśli masz wiele gigabajtów wolnego miejsca.

Znak wodny etapu zalewania wynosi domyślnie 95%, więc na dysku 1 TB potrzebujesz co najmniej 50 GB wolnego miejsca lub Elasticsearch przełączy się w tryb tylko do odczytu.

Dokumenty dotyczące znaku wodnego etapu zalewania można znaleźć pod adresem https://www.elastic.co/guide/en/elasticsearch/reference/6.2/disk-allocator.html .

Właściwe rozwiązanie zależy od kontekstu - na przykład środowisko produkcyjne czy programistyczne.

Rozwiązanie 1: zwolnij miejsce na dysku

Zwolnienie wystarczającej ilości miejsca na dysku, aby więcej niż 5% dysku było wolne, rozwiąże ten problem. Elasticsearch nie wyjdzie automatycznie z trybu tylko do odczytu, gdy wystarczająca ilość dysku będzie wolna, musisz zrobić coś takiego, aby odblokować indeksy:

$ curl -XPUT -H "Content-Type: application/json" https://[YOUR_ELASTICSEARCH_ENDPOINT]:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

Rozwiązanie 2: Zmień ustawienie znaku wodnego etapu zalewania

Zmień "cluster.routing.allocation.disk.watermark.flood_stage"ustawienie na coś innego. Może być ustawiony na niższy procent lub wartość bezwzględną. Oto przykład, jak zmienić ustawienie z poziomu dokumentów :

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "100gb",
    "cluster.routing.allocation.disk.watermark.high": "50gb",
    "cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
    "cluster.info.update.interval": "1m"
  }
}

Ponownie, po wykonaniu tej czynności, będziesz musiał użyć powyższego polecenia curl, aby odblokować indeksy, ale potem nie powinny one ponownie przechodzić w tryb tylko do odczytu.

Sean Hammond
źródło
8
Cześć. Ale pojawia się ten błąd, nawet jeśli w moim systemie jest wystarczająco dużo wolnego miejsca. Czy istnieją inne powody, dla których można zgłosić ten problem?
Sankalpa Timilsina
Mam ten sam problem, mimo że mam 82,43% wolnego miejsca. Naprawiam to poleceniem curl, ale po kilku dniach mam to samo.
manu
@SankalpaTimilsina, czy dostałeś odpowiedź, mam ten sam problem.
Malik Faiq
54

Domyślnie zainstalowany Elasticsearch przechodzi w tryb tylko do odczytu, gdy masz mniej niż 5% wolnego miejsca na dysku. Jeśli widzisz błędy podobne do tego:

Elasticsearch :: Transport :: Transport :: Errors :: Forbidden: [403] {"error": {"root_cause": [{"type": "cluster_block_exception", "powód": "zablokowany przez: [FORBIDDEN / 12 / indeks tylko do odczytu / zezwalaj na usuwanie (api)]; "}]," typ ":" wyjątek_klastra_bloku "," przyczyna ":" blokowany przez: [ZAKAZANY / 12 / indeks tylko do odczytu / zezwalaj na usuwanie (api)]; " }, „stan”: 403}

Lub w /usr/local/var/log/elasticsearch.log możesz zobaczyć logi podobne do:

znak wodny dysku w fazie zalewowej [95%] przekroczony na [nCxquc7PTxKvs6hLkfonvg] [nCxquc7] [/ usr / local / var / lib / flexiblesearch / nodes / 0] wolny: 15,3 gb [4,1%], wszystkie indeksy na tym węźle zostaną oznaczone jako przeczytane -tylko

Następnie możesz to naprawić, uruchamiając następujące polecenia:

curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_cluster/settings -d '{ "transient": { "cluster.routing.allocation.disk.threshold_enabled": false } }'
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
Payam Khaninejad
źródło
23
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

Z

https://techoverflow.net/2019/04/17/how-to-fix-elasticsearch-forbidden-12-index-read-only-allow-delete-api/

zaibatsu
źródło
Dostaję {"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [null] and no indices exist"z twojego polecenia jakiś pomysł?
Cyril Duchon-Doris
1
Dzięki! Na moim dysku kończyło się miejsce. Nawet po tym, jak zwolniłem trochę miejsca, problem nadal istniał. To polecenie rozwiązało mój problem!
Fred,
To jest poprawne rozwiązanie dla nowoczesnych wersji Elasticsearch. Jednak to nie zadziałało _all. Musiałem ręcznie zastosować to do każdego indeksu.
rubik
@rubik czy możesz wspomnieć, w jaki sposób „stosujesz go do każdego indeksu ręcznie”? Jestem nowy na Elasticsearch i mam ten sam problem, w którym _all nie działa.
ROM
@rom Sure. Po prostu zastąp _allnazwą indeksu i powtórz żądanie dla każdego indeksu.
rubik