Error de Elasticsearch: cluster_block_exception [FORBIDDEN / 12 / index read-only / allow delete (api)], se superó la marca de agua del disco de la etapa de inundación

107

Cuando intento publicar documentos en Elasticsearch de forma normal, aparece este error:

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

También veo este mensaje en los registros de Elasticsearch:

flood stage disk watermark [95%] exceeded ... all indices on this node will marked read-only
Sean Hammond
fuente
Me encontré con este problema cuando hiciste esta pregunta. ES discuten diciendo la liberación de memoria
Abhijith S

Respuestas:

212

Esto sucede cuando Elasticsearch cree que el disco se está quedando sin espacio, por lo que se pone en modo de solo lectura.

Por defecto, la decisión de Elasticsearch se basa en el porcentaje de espacio libre en disco, por lo que en discos grandes esto puede suceder incluso si tiene muchos gigabytes de espacio libre.

La marca de agua de la etapa de inundación es del 95% de forma predeterminada, por lo que en una unidad de 1 TB necesita al menos 50 GB de espacio libre o Elasticsearch se pondrá en modo de solo lectura.

Para obtener documentos sobre la marca de agua de la etapa de inundación, consulte https://www.elastic.co/guide/en/elasticsearch/reference/6.2/disk-allocator.html .

La solución adecuada depende del contexto, por ejemplo, un entorno de producción frente a un entorno de desarrollo.

Solución 1: libere espacio en disco

Liberar suficiente espacio en disco para que más del 5% del disco esté libre resolverá este problema. Elasticsearch no saldrá automáticamente del modo de solo lectura una vez que haya suficiente disco libre, sin embargo, tendrá que hacer algo como esto para desbloquear los índices:

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

Solución 2: cambie la configuración de la marca de agua de la etapa de inundación

Cambie la "cluster.routing.allocation.disk.watermark.flood_stage"configuración a otra cosa. Puede configurarse en un porcentaje menor o en un valor absoluto. A continuación, se muestra un ejemplo de cómo cambiar la configuración de los documentos :

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

Nuevamente, después de hacer esto, tendrá que usar el comando curl anterior para desbloquear los índices, pero después de eso no deberían volver a entrar en modo de solo lectura.

Sean Hammond
fuente
8
Hola. Pero recibo este error, incluso cuando hay suficiente espacio libre en mi sistema. ¿Hay otras razones por las que podría estar informando este problema?
Sankalpa Timilsina
Tengo el mismo problema, aunque tengo un 82,43% de disco disponible. Lo soluciono con el comando curl, pero después de unos días obtengo lo mismo.
manu
@SankalpaTimilsina ¿obtuviste la respuesta? Estoy enfrentando el mismo problema.
Malik Faiq
52

De forma predeterminada, Elasticsearch instalado entra en modo de solo lectura cuando tiene menos del 5% de espacio libre en disco. Si ve errores similares a este:

Elasticsearch :: Transport :: Transport :: Errores :: Prohibido: [403] {"error": {"root_cause": [{"type": "cluster_block_exception", "reason": "bloqueado por: [PROHIBIDO / 12 / indexar solo lectura / permitir eliminar (api)]; "}]," tipo ":" cluster_block_exception "," motivo ":" bloqueado por: [PROHIBIDO / 12 / indexar solo lectura / permitir eliminar (api)]; " }, "estado": 403}

O en /usr/local/var/log/elasticsearch.log puede ver registros similares a:

Se superó la marca de agua del disco de la etapa de inundación [95%] en [nCxquc7PTxKvs6hLkfonvg] [nCxquc7] [/ usr / local / var / lib / elasticsearch / nodes / 0] gratis: 15,3 gb [4,1%], todos los índices de este nodo se marcarán como leídos -solamente

Luego, puede solucionarlo ejecutando los siguientes comandos:

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
fuente
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
fuente
Recibo una {"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [null] and no indices exist"con tu comando, ¿alguna idea?
Cyril Duchon-Doris
1
¡Gracias! Mi disco se estaba quedando sin espacio. Incluso después de liberar algo de espacio, el problema persistía. ¡Este comando resolvió mi problema!
Fred
Esta es la solución correcta para las versiones modernas de Elasticsearch. Sin embargo, no funcionó con _all. Tuve que aplicarlo a cada índice manualmente.
rubik
@rubik, ¿puede mencionar cómo lo "aplica a cada índice manualmente"? Soy nuevo en Elasticsearch y tengo el mismo problema en el que _todo no funciona.
rom
@de Claro. Simplemente reemplácelo _allcon el nombre del índice y repita la solicitud para cada índice.
rubik