Erro Elasticsearch: cluster_block_exception [FORBIDDEN / 12 / index somente leitura / permitir exclusão (api)], marca d'água do disco em estágio de inundação excedida

107

Ao tentar postar documentos no Elasticsearch normalmente, recebo este erro:

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

Também vejo esta mensagem nos logs do Elasticsearch:

flood stage disk watermark [95%] exceeded ... all indices on this node will marked read-only
Sean Hammond
fonte
Acabei de ter esse problema quando você fez essa pergunta. ES discute dizendo liberando memória
Abhijith S

Respostas:

215

Isso acontece quando o Elasticsearch pensa que o disco está ficando sem espaço, então ele se coloca no modo somente leitura.

Por padrão, a decisão do Elasticsearch é baseada na porcentagem de espaço livre em disco, portanto, em discos grandes, isso pode acontecer mesmo se você tiver muitos gigabytes de espaço livre.

A marca d'água do estágio de inundação é de 95% por padrão, então em uma unidade de 1 TB você precisa de pelo menos 50 GB de espaço livre ou o Elasticsearch se colocará no modo somente leitura.

Para documentos sobre a marca d'água do estágio de inundação, consulte https://www.elastic.co/guide/en/elasticsearch/reference/6.2/disk-allocator.html .

A solução certa depende do contexto - por exemplo, um ambiente de produção versus um ambiente de desenvolvimento.

Solução 1: libere espaço em disco

Liberar espaço em disco suficiente para que mais de 5% do disco fique livre resolverá esse problema. O Elasticsearch não sairá automaticamente do modo somente leitura quando houver disco suficiente livre, porém, você terá que fazer algo assim para desbloquear os índices:

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

Solução 2: alterar a configuração da marca d'água do estágio de inundação

Altere a "cluster.routing.allocation.disk.watermark.flood_stage"configuração para outra coisa. Ele pode ser definido para uma porcentagem inferior ou para um valor absoluto. Aqui está um exemplo de como alterar a configuração dos 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"
  }
}

Novamente, depois de fazer isso, você terá que usar o comando curl acima para desbloquear os índices, mas depois disso eles não devem entrar no modo somente leitura novamente.

Sean Hammond
fonte
8
Oi. Mas estou recebendo este erro, mesmo quando há espaço livre suficiente em meu sistema. Existem outros motivos que podem estar relatando esse problema?
Sankalpa Timilsina
Tenho o mesmo problema, embora tenha 82,43% de disco disponível. Eu conserto com o comando curl, mas depois de alguns dias estou conseguindo o mesmo.
manu
@SankalpaTimilsina você obteve a resposta, estou enfrentando o mesmo problema.
Malik Faiq
52

Por padrão, o Elasticsearch instalado entra no modo somente leitura quando você tem menos de 5% de espaço livre em disco. Se você vir erros semelhantes a este:

Elasticsearch :: Transport :: Transport :: Errors :: Forbidden: [403] {"error": {"root_cause": [{"type": "cluster_block_exception", "reason": "bloqueado por: [FORBIDDEN / 12 / index read-only / allow delete (api)]; "}]," type ":" cluster_block_exception "," reason ":" bloqueado por: [FORBIDDEN / 12 / index read-only / allow delete (api)]; " }, "status": 403}

Ou em /usr/local/var/log/elasticsearch.log, você pode ver registros semelhantes a:

marca d'água do disco de estágio de inundação [95%] excedida em [nCxquc7PTxKvs6hLkfonvg] [nCxquc7] [/ usr / local / var / lib / elasticsearch / nodes / 0] livre: 15,3 gb [4,1%], todos os índices neste nó serão marcados como lidos -só

Em seguida, você pode corrigi-lo executando os seguintes 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
fonte
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
fonte
Estou recebendo um {"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [null] and no indices exist"com o seu comando, alguma ideia?
Cyril Duchon-Doris
1
Obrigado! Meu disco estava ficando sem espaço. Mesmo depois de liberar algum espaço, o problema ainda persistia. Este comando resolveu meu problema!
Fred
Esta é a solução correta para as versões modernas do Elasticsearch. No entanto, não funcionou _all. Tive que aplicá-lo a cada índice manualmente.
rubik
@rubik, você pode mencionar como você "aplica isso a cada índice manualmente"? Eu sou novo no Elasticsearch e enfrentando o mesmo problema em que _all não está funcionando.
rom
@rom Sure. Basta substituir _allpelo nome do índice e repetir a solicitação para cada índice.
rubik