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

时间:2018-05-30 16:21:40

标签: elasticsearch

当尝试将文档正常发布到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

5 个答案:

答案 0 :(得分:62)

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

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

"cluster.routing.allocation.disk.watermark.flood_stage"设置更改为其他设置。它可以设置为较低的百分比或绝对值。以下是如何从the 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命令来解锁索引,但之后它们不应再次进入只读模式。

答案 1 :(得分:19)

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

  

Elasticsearch ::运输::运输::错误::禁止:[403]   {“错误”:{“ root_cause”:[{“类型”:“ cluster_block_exception”,“原因”:“已阻止”   作者:[FORBIDDEN / 12 / index只读/允许删除   (api)];“}],” type“:” cluster_block_exception“,”原因“:”被阻止:   [FORBIDDEN / 12 / index只读/允许删除(api)];“},”状态“:403}

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

  

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

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

<form method="post" action="/">
  <div class="form-row">
    <div class="form-group col-md-6">
      <label for="merchant_id">merchant_id</label>
      <input type="text" class="form-control" id="merchant_id" placeholder="merchant_id">
    </div>
    <div class="form-group col-md-6">
      <label for="transaction_id">transaction_id</label>
      <input type="text" class="form-control" id="transaction_id">
    </div>

    <div class="form-group col-md-6">
      <label for="desc">desc</label>
      <input type="text" class="form-control" id="desc">
    </div>

    <div class="form-group col-md-6">
      <label for="amount">amount</label>
      <input type="number" class="form-control" id="amount">
    </div>

    <div class="form-group col-md-6">
      <label for="redirect_url">redirect_url</label>
      <input type="text" class="form-control" id="redirect_url">

    </div>

    <div class="form-group col-md-6">
      <label for="email">Email</label>
      <input type="email" class="form-control" id="email" placeholder="Email">
    </div>

    <div class="form-group col-md-6">
      <label for="API_Key">API_Key</label>
      <input type="text" class="form-control" id="API_Key">
    </div>

    <div class="form-group col-md-6">
      <label for="apiuser">apiuser</label>
      <input type="text" class="form-control" id="apiuser">

    </div>
  </div>
  <button type="submit" id="submitform" class="btn btn-primary">Submit</button>
</form>

答案 2 :(得分:11)

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

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

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

答案 3 :(得分:2)

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/

答案 4 :(得分:2)

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

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

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

curl -X POST "localhost:9200/my-index-000001/_forcemerge?pretty"

ref:Force Merge API