Elasticsearch触发read-only-allow-delete后无法删除文档的疑问
Elasticsearch
read-only-allow-delete 模式疑问解答 关于read-only-allow-delete的真实含义
这个模式确实设计为允许读取和能直接释放磁盘空间的删除操作,但并非所有删除操作都被放行:
- 允许的操作:删除整个索引、删除分片这类能立刻回收磁盘空间的操作;
- 被拦截的操作:单条文档删除(比如你执行的
DELETE /indexName/_doc/1)只是给文档打删除标记,不会立即释放磁盘,ES会阻止这类操作,避免磁盘占用进一步恶化。
为什么你的删除操作失败
ES的文档删除是「逻辑删除」——仅在文档上标记删除标记,磁盘空间要等到段合并时才会被回收。触发flood-stage水位线后,ES会严格限制任何不会直接释放磁盘的写入/删除操作,所以单条文档删除会被拦截。
有效释放磁盘的操作方法
删除整个索引(最直接)
执行命令:DELETE /indexName该操作会立刻释放对应索引占用的磁盘空间,在
read-only-allow-delete模式下完全允许。强制段合并清理删除标记
执行命令:POST /indexName/_forcemerge?only_expunge_deletes=true这个操作会把所有带删除标记的文档彻底清理,释放磁盘空间,但注意该操作会占用大量节点CPU和IO资源,建议在业务低峰期执行。
临时关闭只读限制后操作
如果需要执行更多清理操作,可以先临时关闭只读限制:PUT /_all/_settings { "index.blocks.read_only_allow_delete": null }完成清理后,若需要重新开启集群保护,可执行:
PUT /_all/_settings { "index.blocks.read_only_allow_delete": true }
注意事项
flood-stage水位线是ES的集群保护机制,触发后自动设置只读模式是为了防止磁盘耗尽导致集群崩溃。优先推荐的解决方式还是扩容磁盘,或者清理大体积的旧索引来释放空间,而非直接关闭水位线。
内容的提问来源于stack exchange,提问作者Suule
相关产品推荐
相关产品推荐

