问:我能否只删除索引中的某些数据?

编辑

问:我能否只删除索引中的某些数据?

编辑

答:情况比较复杂

编辑

简而言之:不可以。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 并观察删除数据时段会发生什么。