Q: 我可以只删除索引中的某些数据吗?

编辑

Q: 我可以只删除索引中的某些数据吗?编辑

A: 这很复杂编辑

TL;DR: 不行。Curator 只能删除整个索引。编辑

完整答案:编辑

作为思维练习,将 Elasticsearch 索引想象成数据库或数据库中的表空间。如果您需要从数据库中删除数亿行数据,您会每天运行一个单独的 DELETE from TABLE where date<YYYY.MM.dd 来组装数亿个单独的删除操作,还是会以一种可以简单地运行 DROP table TABLENAME.YYYY.MM.dd 的方式对您的表进行分区?前者对数据库的压力将是天文数字,而后者几乎没有压力。Elasticsearch 的工作方式非常相似。虽然 Elasticsearch 在技术上可以执行这两种方法,但对于使用时间序列数据(如日志记录)的用例,我们建议删除整个索引,而不是极其 I/O 密集的搜索和删除方法。Curator 的创建是为了满足这种需求。

虽然您可以在不同的索引中存储不同的类型(例如 syslog-2014.05.05、apache-2015.05.06),但这在完全不同的方式下会很快变得非常昂贵。Elasticsearch 中的每个分片都是一个 Lucene 索引。每个索引都需要一部分堆来存在并保持最新。如果您有 3 个每日索引,每个索引有 5 个主分片,那么您突然将可用于分片管理的堆空间减少了 3 倍,从 5 个分片变成了 15 个,每个索引,不包括每天的多个索引。缓解这种情况的方法(如果您选择此路线)包括每天大量的索引框,以及使用分片分配/路由将索引移动到集群的特定成员,在那里它们可以产生更小的影响;保留更少的天数的信息;在您的集群中拥有更多节点,等等。

结论:编辑

虽然您可能希望为您的数据设置不同的生命周期,但有时将所有数据存储为最长生命周期,会更容易、更便宜。

后记:编辑

即使它既不推荐 [1],也不符合最佳实践,您仍然可以使用 Delete-by-Query API 自己执行这些搜索和删除操作。但是,Curator 不会被修改为执行此类操作。Curator 旨在管理索引级别,而不是数据级别。


[1] Elasticsearch 不推荐这样做是有原因的,特别是对于时间序列数据。有关更多信息,请阅读 http://blog.mikemccandless.com/2011/02/visualizing-lucenes-segment-merges.html 并观察删除数据时段会发生什么。