ElasticSearch 7.17:删除文档后如何即时获取更新的store.size?
在Elasticsearch 7.17单集群单索引的沙箱环境中,需要通过监控store.size管理内存:当该值超过阈值时删除部分文档,之后希望**即时获取更新后的store.size**来评估内存占用。
已知Delete API仅标记文档为已删除而非实际删除,短期存储可能增长,也清楚这并非Elasticsearch的常规用法,但这是实际需求。
已尝试以下操作流程:
- 创建索引→写入文档→查看
store.size - 执行
delete_by_query删除部分文档 - 执行
forcemerge?only_expunge_deletes=true - 执行
flush、clear cache、refresh - 查看
store.size(期望低于删除前)
所有请求均成功,但最终store.size反而更大,一段时间后才降低。现咨询:能否在删除文档后即时获取store.size的最新值?
1. store.size无法即时下降的核心原因
Elasticsearch的store.size统计的是索引在磁盘上的所有段文件总大小。执行forcemerge?only_expunge_deletes=true后,Lucene会生成不包含已删除文档的新段,但旧的段文件不会立即被物理删除——它们会被标记为待删除,等待后台异步任务清理。
你看到store.size先变大,是因为合并过程中同时存在新旧段文件,待旧段被物理删除后,store.size才会下降。而deleted.docs计数归0,仅表示逻辑上已删除的文档已被清理出活跃段,不代表物理文件已被删除。
2. 缩短store.size更新延迟的可行操作
虽然无法做到绝对“即时”,但可以通过以下操作大幅缩短等待时间:
(1)触发JVM GC回收文件句柄
Lucene的待删除段文件需要等待JVM回收对应的文件句柄后,才会执行物理删除。可以手动触发GC(沙箱环境放心使用,生产环境不建议频繁操作):
POST /_nodes/jvm/gc
(2)调整段文件清理间隔
Elasticsearch默认每隔1分钟执行一次待删除段文件的清理任务,你可以临时调小这个间隔(仅沙箱环境适用):
PUT /_all/_settings { "index.store.delete_pending_files_interval": "1s" }
调整后,后台清理任务会每秒检查一次并删除待删除的段文件。
(3)正确获取store.size统计
确保使用精准的API获取最新数据:
- 查看单索引存储详情:
GET /your_index/_stats/store - 用cat命令快速查看:
GET /_cat/indices/your_index?v&h=index,store.size
3. 关键注意事项
- 强制合并(forcemerge)在生产环境需谨慎使用,尤其是针对活跃索引,会占用大量CPU和IO资源。
- 沙箱环境的测试逻辑与生产环境存储管理逻辑差异较大,生产环境建议使用索引生命周期管理(ILM)处理数据过期,而非手动删除后合并。
内容的提问来源于stack exchange,提问作者Alexis Doucet

