我有一个集群,其中暖节点中的几个索引不包含任何文档。由于它们是只读的,它们无法获取更多文档,所以我想知道删除它们是否会对我的 ElasticSearch 节点的堆使用有任何好处。
我尝试使用 /_cat/shards
为了获得所述索引的每个分片的一些堆信息,但我找不到它,我尝试查看以下指标的值,但即使对于 20GiB 分片,这些值也很小,我认为我正在查看错误的指标(括号中是 33GiB 分片的示例值):
fm: fielddata.memory_size (0b)
qcm: query_cache.memory_size (0b)
sm: segments.memory (44.6mb)
siwm: segments.index_writer_memory (0b)
svmm: segments.version_map_memory (0b)
sfbm: segments.fixed_bitset_memory (0b)
所以我的问题是:
(底线是我的暖节点堆很高,所以我正在考虑删除这些空索引的所有分片,但前提是它有任何好处。)
谢谢。
最佳答案
因此,在通过评论部分收集了一些信息之后,这是我的两分钱:
首先,我不知道有一个 API 可以让您检查每个分片的堆内存。也许 xpack 监控和/或 elasticsearch metricbeat 模块可以为您做到这一点。
但是,既然你问:
... As they are read-only, they can't get any more documents, so I want to know if removing them will do any good to the heap usage of my ElasticSearch nodes.
Elasticsearch 建立在 Lucene 之上。 Lucene 索引由一个或多个不可变索引段组成,本质上是一个“迷你索引”。 Elasticsearch 尝试将频繁请求的段(索引和搜索请求)保留在堆内存中,以便以快速的方式服务这些请求。如果没有更多的段可以加载到堆中(因为堆大小已达到其限制),则段将刷新到磁盘,而其他段则从磁盘加载到堆中。这是一个持续的过程(看看这个 blog post 以供引用)。
正如您所说,您认为“有问题”的索引是只读的(意味着不能执行索引请求)并且也不包含文档(意味着不会针对特定段执行搜索请求)。
总结一下:无论如何,“有问题的”索引很可能不在堆中。
然而,这些索引仍然需要一些磁盘空间,因为它们“存在”。此外,elasticsearch 必须管理它们的分片,并且必须(重新)将它们分配给节点,例如在分片恢复的情况下。
Q: So why are you hesitant to do (deleting the empty indices) it?
A: ... I need to modify my maintenance application's code...
随着 Elasticsearch 6.6 版的发布,index lifecycle management (ilm) .它的目的是通过定义策略来自动化索引的管理/维护。这些策略包含所谓的阶段(热、暖、冷、删除)和相应的操作(翻转、只读、卡住、收缩、删除……)。它们也可以通过 Kibana 进行设置和修改。
您可能想看看 ilm 并用它替换您的应用程序(无意冒犯,只是提示)。
我希望我能帮助你!
关于elasticsearch - 如何知道 ElasticSearch 分片使用的堆数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59548360/