Elasticsearch错误:cluster_block_exception [FORBIDDEN / 12 / index只读/允许删除(api)],超出了洪水阶段磁盘水印


107

尝试按正常方式将文档发布到Elasticsearch时,出现此错误:

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

我还在Elasticsearch日志上看到此消息:

flood stage disk watermark [95%] exceeded ... all indices on this node will marked read-only

当您提出这个问题时,我只是遇到了这个问题。ES讨论说释放内存
Abhijith S,

Answers:


213

当Elasticsearch认为磁盘空间不足,因此将其置于只读模式时,就会发生这种情况。

默认情况下,Elasticsearch的决定基于可用磁盘空间的百分比,因此在大磁盘上,即使您有许多GB的可用空间,也可能发生这种情况。

泛洪阶段水印默认为95%,因此,在1TB驱动器上,您至少需要50GB的可用空间,否则Elasticsearch会将其自身设置为只读模式。

有关洪水阶段水印的文档,请参阅https://www.elastic.co/guide/en/elasticsearch/reference/6.2/disk-allocator.html

正确的解决方案取决于上下文-例如生产环境与开发环境。

解决方案1:释放磁盘空间

释放足够的磁盘空间以使超过5%的磁盘可用将解决此问题。但是,一旦有足够的可用磁盘,Elasticsearch不会自动退出只读模式,您必须执行以下操作来解锁索引:

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

解决方案2:更改洪水阶段水印设置

"cluster.routing.allocation.disk.watermark.flood_stage"设置更改为其他设置。可以将其设置为较低的百分比或绝对值。这是一个如何从docs更改设置的示例:

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

同样,执行完此操作后,您将必须使用上面的curl命令来解锁索引,但是在那之后它们不应再次进入只读模式。


8
你好 但是,即使系统中有足够的可用空间,我也会收到此错误消息。还有其他原因可以报告此问题吗?
桑卡帕·蒂米西娜(Sankalpa Timilsina),

即使我有82.43%的可用磁盘,我也遇到同样的问题。我用curl命令修复了它,但是几天后我得到了同样的结果。
manu

@SankalpaTimilsina您得到了答案,我正面临着同样的问题。
Malik Faiq

52

默认情况下,当可用磁盘空间少于5%时,Elasticsearch会进入只读模式。如果您看到与此类似的错误:

Elasticsearch :: Transport :: Transport :: Errors :: Forbidden:[403] {“错误”:{“ root_cause”:[{“类型”:“ cluster_block_exception”,“原因”:“被阻止:[FORBIDDEN / 12 /索引只读/允许删除(api)];“}],” type“:” cluster_block_exception“,”原因“:”被阻止者:[FORBIDDEN / 12 / index只读/允许删除(api)];“ },“状态”:403}

或者在/usr/local/var/log/elasticsearch.log中,您可以看到类似于以下内容的日志:

[nCxquc7PTxKvs6hLkfonvg] [nCxquc7] [/ usr / local / var / lib / elasticsearch / nodes / 0]上超过洪水阶段磁盘水印[95%]:15.3gb [4.1%],此节点上的所有索引都标记为已读-只要

然后,您可以通过运行以下命令来修复它:

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

23
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

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


我得到{"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [null] and no indices exist"您的命令,知道吗?
Cyril Duchon-Doris

1
谢谢!我的磁盘空间不足。即使我释放了一些空间,问题仍然存在。这个命令解决了我的问题!
弗雷德

这是现代Elasticsearch版本的正确解决方案。但是,它不适用于_all。我不得不手动将其应用于每个索引。
rubik

@rubik能否请您提及如何“手动将其应用于每个索引”?我是Elasticsearch的新手,面临着_all无法正常工作的相同问题。

@rom当然。只需将其替换_all为索引名称,然后对每个索引重复该请求即可。
rubik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.