Elasticsearch插入数据报错:[TOO_MANY_requests/12/disk usage exceeded flood-stage watermark,index has read-only-allow-delete block]
排查过程
- 使用
df -h
查询当前服务器磁盘空间使用情况,发现磁盘空间已经使用超过98%。 - Es数据查询结果正常,无法进行新增、编辑操作。
- 更换其他索引操作新增流程仍操作失败。
问题原因
- ElasticSearch进入“只读”模式,只允许删除,ES说明文档中有写明,当ES数据所在目录磁盘空间使用率超过90%后,ES将修改为只读状态,所以初步判断是磁盘空间不足导致es自动关闭了索引的写功能,只能进行读取或者删除。本次错为当前情况,后续解决方案也是按照此种方案解决。
- 其他可能导致相同异常的情况罗列:JVMMemoryPressure 超过92%并持续30分钟时,ES触发保护机制,并且阻止写入操作,以防止集群达到红色状态,启用写保护后,写入操作将失败,并且抛出 ClusterBlockException ,无法创建新索引,并且抛出 IndexCreateBlockException,当五分钟内恢复不到88%以下时,将禁用写保护。
解决方案
-
磁盘扩容(清理日志,释放磁盘空间);
-
手动将 index.blocks.read_only_allow_delete 改成false;
- 查看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" } } } } }
-
把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}'
-
通过第一步指令,查看
read_only_allow_delete属性
是否改为false。
-
调整自动锁阈值:官方文档中具体方法
-
删除无用索引;