Elasticsearch

ES插入数据报错:[TOO_MANY_requests/12/disk usage exceeded flood-stage watermark,index has read-only-allow-delete block];

Posted by dm on December 12, 2022

Elasticsearch插入数据报错:[TOO_MANY_requests/12/disk usage exceeded flood-stage watermark,index has read-only-allow-delete block]

排查过程

  1. 使用df -h查询当前服务器磁盘空间使用情况,发现磁盘空间已经使用超过98%。
  2. Es数据查询结果正常,无法进行新增、编辑操作。
  3. 更换其他索引操作新增流程仍操作失败。

问题原因

  1. ElasticSearch进入“只读”模式,只允许删除,ES说明文档中有写明,当ES数据所在目录磁盘空间使用率超过90%后,ES将修改为只读状态,所以初步判断是磁盘空间不足导致es自动关闭了索引的写功能,只能进行读取或者删除。本次错为当前情况,后续解决方案也是按照此种方案解决。
  2. 其他可能导致相同异常的情况罗列:JVMMemoryPressure 超过92%并持续30分钟时,ES触发保护机制,并且阻止写入操作,以防止集群达到红色状态,启用写保护后,写入操作将失败,并且抛出 ClusterBlockException ,无法创建新索引,并且抛出 IndexCreateBlockException,当五分钟内恢复不到88%以下时,将禁用写保护。

解决方案

  1. 磁盘扩容(清理日志,释放磁盘空间);

  2. 手动将 index.blocks.read_only_allow_delete 改成false;

    1. 查看Es索引情况:服务器中执行指令
    curl --user 账号:密码 -XGET 'localhost:9200/index_name/_settings?pretty'
    

    查看返回信息:

    {
      "index_name" : {
        "settings" : {
          "index" : {
            "number_of_shards" : "5",
            "blocks" : {
    # 发现确实这个索引的read_only_allow_delete属性是true,由此导致了无法再向其中插入数据
              "read_only_allow_delete" : "true"
            },
            "provided_name" : "index_name",
            "creation_date" : "1516454800021",
            "number_of_replicas" : "1",
            "uuid" : "6WjhtrARTOOjsEUaOqNzlw",
            "version" : {
              "created" : "6010199"
            }
          }
        }
      }
    }
    
    1. 把read_only_allow_delete设置为false:服务器中执行

      curl -XPUT 'localhost:9200/index_name/_settings'  -H 'Content-Type: application/json' -d '{"index.blocks.read_only_allow_delete": null}'
      
    2. 通过第一步指令,查看read_only_allow_delete属性是否改为false。

  3. 调整自动锁阈值:官方文档中具体方法

  4. 删除无用索引;