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

Sea*_*ond 61 elasticsearch

当试图像往常一样将文档发布到Elasticsearch时,我收到此错误:

cluster_block_exception [FORBIDDEN/12/index read-only / allow delete (api)];
Run Code Online (Sandbox Code Playgroud)

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

flood stage disk watermark [95%] exceeded ... all indices on this node will marked read-only
Run Code Online (Sandbox Code Playgroud)

Sea*_*ond 122

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

默认情况下,Elasticsearch的决定基于可用的磁盘空间百分比,因此即使您有大量的可用空间,也可能会发生这种情况.

洪水阶段水印默认为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}'
Run Code Online (Sandbox Code Playgroud)

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

"cluster.routing.allocation.disk.watermark.flood_stage"设置更改为其他内容.它可以设置为较低的百分比或绝对值.以下是如何从文档更改设置的示例:

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"
  }
}
Run Code Online (Sandbox Code Playgroud)

再次,在执行此操作后,您将不得不使用上面的curl命令来解锁索引,但之后它们不应再次进入只读模式.

  • 你好 但是,即使系统中有足够的可用空间,我也会收到此错误。还有其他原因可以报告此问题吗? (4认同)
  • 使用curl命令“curl: (35) error:1408F10B:SSLroutines:ssl3_get_record:wrong version number”可能会出现以下错误。这意味着您没有为 TLS 配置 Elasticsearch。所以只需使用 http 即可 (4认同)
  • 我有同样的问题,即使我有 82.43% 的可用磁盘。我用curl命令修复了它,但几天后我得到了同样的结果。 (2认同)

zai*_*tsu 41

curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
Run Code Online (Sandbox Code Playgroud)

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


小智 27

当您的计算机磁盘空间不足时,通常会出现此错误。为避免此错误消息而应遵循的步骤

  1. 重置索引上的只读索引块:

    $ curl -X PUT -H "Content-Type: application/json" http://127.0.0.1:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
    
    Response
    ${"acknowledged":true}
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将低水印更新为至少 50 GB 免费、至少 20 GB 免费的高水印和 10 GB 免费的洪水阶段水印,并每分钟更新有关集群的信息

     Request
     $curl -X PUT "http://127.0.0.1:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d' { "transient": { "cluster.routing.allocation.disk.watermark.low": "50gb", "cluster.routing.allocation.disk.watermark.high": "20gb", "cluster.routing.allocation.disk.watermark.flood_stage": "10gb", "cluster.info.update.interval": "1m"}}'
    
      Response
      ${
       "acknowledged" : true,
       "persistent" : { },
       "transient" : {
       "cluster" : {
       "routing" : {
       "allocation" : {
       "disk" : {
         "watermark" : {
           "low" : "50gb",
           "flood_stage" : "10gb",
           "high" : "20gb"
         }
       }
     }
    }, 
    "info" : {"update" : {"interval" : "1m"}}}}}
    
    Run Code Online (Sandbox Code Playgroud)

运行这两个命令后,您必须再次运行第一个命令,以便索引不会再次进入只读模式


Pay*_*jad 16

默认情况下,当可用磁盘空间少于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}'
Run Code Online (Sandbox Code Playgroud)

  • 为我工作,使用本地 docker 弹性容器遇到它。 (3认同)

小智 6

仅使用以下命令更改设置在我的环境中不起作用:

curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
Run Code Online (Sandbox Code Playgroud)

我还必须运行 Force Merge API 命令:

curl -X POST "localhost:9200/my-index-000001/_forcemerge?pretty"
Run Code Online (Sandbox Code Playgroud)

参考:强制合并 API