Erreur Elasticsearch: cluster_block_exception [FORBIDDEN / 12 / index lecture seule / autoriser la suppression (api)], filigrane du disque de la phase d'inondation dépassé

107

Lorsque j'essaye de publier des documents sur Elasticsearch comme d'habitude, j'obtiens cette erreur:

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

Je vois également ce message sur les journaux Elasticsearch:

flood stage disk watermark [95%] exceeded ... all indices on this node will marked read-only
Sean Hammond
la source
Je viens de rencontrer ce problème lorsque vous posez cette question. ES discutent de la libération de la mémoire
Abhijith S

Réponses:

215

Cela se produit lorsque Elasticsearch pense que l'espace disque est insuffisant et qu'il se met donc en mode lecture seule.

Par défaut, la décision d'Elasticsearch est basée sur le pourcentage d'espace disque disponible, donc sur les gros disques, cela peut se produire même si vous disposez de plusieurs gigaoctets d'espace libre.

Le filigrane de la phase d'inondation est de 95% par défaut, donc sur un lecteur de 1 To, vous avez besoin d'au moins 50 Go d'espace libre ou Elasticsearch se mettra en mode lecture seule.

Pour obtenir des documents sur le filigrane de la phase d'inondation, consultez https://www.elastic.co/guide/en/elasticsearch/reference/6.2/disk-allocator.html .

La bonne solution dépend du contexte - par exemple un environnement de production ou un environnement de développement.

Solution 1: libérer de l'espace disque

Libérer suffisamment d'espace disque pour que plus de 5% du disque soit libre résoudra ce problème. Elasticsearch ne sortira pas automatiquement du mode lecture seule une fois que suffisamment de disque sera libre, vous devrez faire quelque chose comme ceci pour déverrouiller les index:

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

Solution 2: modifier le paramètre de filigrane de la phase d'inondation

Changez le "cluster.routing.allocation.disk.watermark.flood_stage"paramètre pour autre chose. Il peut être défini sur un pourcentage inférieur ou sur une valeur absolue. Voici un exemple de modification du paramètre à partir de la documentation :

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"
  }
}

Encore une fois, après avoir fait cela, vous devrez utiliser la commande curl ci-dessus pour déverrouiller les index, mais après cela, ils ne devraient pas revenir en mode lecture seule.

Sean Hammond
la source
8
Salut. Mais j'obtiens cette erreur, même s'il y a suffisamment d'espace libre dans mon système. Y a-t-il d'autres raisons qui pourraient signaler ce problème?
Sankalpa Timilsina
J'ai le même problème, même si j'ai 82,43% de disque disponible. Je le corrige avec la commande curl mais après quelques jours, j'obtiens la même chose.
manu
@SankalpaTimilsina avez-vous obtenu la réponse, je suis confronté au même problème.
Malik Faiq le
54

Par défaut, Elasticsearch installé passe en mode lecture seule lorsque vous disposez de moins de 5% d'espace disque libre. Si vous voyez des erreurs similaires à ceci:

Elasticsearch :: Transport :: Transport :: Errors :: Forbidden: [403] {"error": {"root_cause": [{"type": "cluster_block_exception", "reason": "bloqué par: [FORBIDDEN / 12 / index lecture seule / autoriser la suppression (api)]; "}]," type ":" cluster_block_exception "," reason ":" bloqué par: [FORBIDDEN / 12 / index lecture seule / autoriser la suppression (api)]; " }, "état": 403}

Ou dans /usr/local/var/log/elasticsearch.log, vous pouvez voir des journaux similaires à:

Filigrane de disque de la phase d'inondation [95%] dépassé sur [nCxquc7PTxKvs6hLkfonvg] [nCxquc7] [/ usr / local / var / lib / elasticsearch / nodes / 0] libre: 15,3 Go [4,1%], tous les index de ce nœud seront marqués comme lus -seulement

Ensuite, vous pouvez le réparer en exécutant les commandes suivantes:

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
la source
23
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

DE

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

zaibatsu
la source
Je reçois un {"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [null] and no indices exist"avec votre commande, une idée?
Cyril Duchon-Doris le
1
Merci! Mon disque manquait d'espace. Même après avoir libéré de l'espace, le problème persistait. Cette commande a résolu mon problème!
Fred
C'est la bonne solution pour les versions modernes d'Elasticsearch. Cependant, cela n'a pas fonctionné avec _all. J'ai dû l'appliquer manuellement à chaque index.
rubik
@rubik pouvez-vous s'il vous plaît mentionner comment vous "l'appliquez manuellement à chaque index"? Je suis nouveau sur Elasticsearch et je suis confronté au même problème où _all ne fonctionne pas.
rom
@rom Sure. Remplacez simplement _allpar le nom de l'index et répétez la demande pour chaque index.
rubik le