elasticsearch ttl vs 每日丢弃表
elasticsearch ttl vs daily dropping tables
我知道在 elasticsearch 中有两种主要模式可以保持滚动 window 数据:
- 按照 logstash 的建议创建每日索引,并删除旧索引,因此当它们超出 window
时删除它们包含的所有记录
- 使用 elasticsearch 的 TTL 功能和单个索引,让 elasticsearch 在旧记录不在 window
时自动单独删除它们
我本能地选择 2,因为:
- 我不必编写 cron 作业
- 单个大索引更容易与我的同事沟通并让他们查询(我认为?)
- 任何导致旧日志事件出现的噩梦流动态都不会导致创建新索引,并且旧事件只会在 elasticsearch 用于执行 ttl 清理的 60 年代期间徘徊。
但我的直觉告诉我,一次删除一个索引可能会减少很多计算密集度,尽管我不知道密集度降低了多少,也不知道 ttl 的成本有多少。
就上下文而言,我的入站流很少会达到每秒 4K 条消息 (mps) 以上的峰值,更有可能保持在 1-2K mps 左右。
有没有人有比较这两种方法的经验?你可能会说我是这个世界的新手!将不胜感激任何帮助,甚至包括帮助思考这种事情的正确方法。
干杯!
简短的回答是,选择选项 1 并简单地删除不再需要的索引。
详细的回答是它在某种程度上取决于您添加到索引中的文档量以及您的分片和复制设置。如果您的索引吞吐量相当低,TTL 可以是高性能的,但是当您开始向 Elasticsearch 写入更多文档时(或者如果您的复制因子很高),您将 运行 陷入两个问题。
- 删除具有 TTL 的文档需要 Elasticsearch 运行 定期服务(IndicesTTLService) to find documents that are expired across all shards and issue deletes 对于所有这些文档。搜索大型索引可能是一项非常费力的操作(尤其是当您被严重分片时),但更糟糕的是删除。
- 在 Elasticsearch(实际上是 Lucene)中不会立即执行删除,而是文档 "marked for deletion"。需要进行段合并以删除已删除的文档并回收磁盘 space。如果您在索引中有大量删除,它会给您的段合并操作带来更多更多压力,以至于严重影响其他线程池。
我们最初走的是 TTL 路线,并且有一个完全无法使用的 ES 集群,并且由于贪婪的合并线程而开始拒绝搜索和索引请求。
您可以尝试 "what document throughput is too much?",但从您的用例来看,我建议您节省一些时间,只使用性能更高的索引删除路由。
我会选择选项 1 - 即每天下降指数。
每日下降指数
优点:
- 这是删除数据最有效的方式
- 如果您需要重组索引(例如应用新映射、增加分片数量),任何更改都可以轻松应用于新索引
- 使用 aliases
对客户端隐藏了当前索引的详细信息(即名称)
- 可以将基于时间的搜索定向为仅搜索特定的小索引
- Index templates 简化创建每日索引的过程。
这些好处在 Time-Based Data Guide, see also Retiring Data
中也有详细说明
缺点:
- 需要更多的设置工作(例如设置 cron 作业),但是有一个插件 (curator) 可以帮助解决这个问题。
- 如果您对数据执行更新,那么文档数据的所有版本都需要位于同一个索引中,即多个索引不适合您。
使用 TTL 或查询删除数据
优点:
- 简单易懂,易于实施
缺点:
- 当您删除文档时,它只会被标记为已删除。在包含它的段 merged 离开之前,它不会被物理删除。这是非常低效的,因为删除的数据会消耗磁盘 space、CPU 和内存。
我知道在 elasticsearch 中有两种主要模式可以保持滚动 window 数据:
- 按照 logstash 的建议创建每日索引,并删除旧索引,因此当它们超出 window 时删除它们包含的所有记录
- 使用 elasticsearch 的 TTL 功能和单个索引,让 elasticsearch 在旧记录不在 window 时自动单独删除它们
我本能地选择 2,因为:
- 我不必编写 cron 作业
- 单个大索引更容易与我的同事沟通并让他们查询(我认为?)
- 任何导致旧日志事件出现的噩梦流动态都不会导致创建新索引,并且旧事件只会在 elasticsearch 用于执行 ttl 清理的 60 年代期间徘徊。
但我的直觉告诉我,一次删除一个索引可能会减少很多计算密集度,尽管我不知道密集度降低了多少,也不知道 ttl 的成本有多少。
就上下文而言,我的入站流很少会达到每秒 4K 条消息 (mps) 以上的峰值,更有可能保持在 1-2K mps 左右。
有没有人有比较这两种方法的经验?你可能会说我是这个世界的新手!将不胜感激任何帮助,甚至包括帮助思考这种事情的正确方法。
干杯!
简短的回答是,选择选项 1 并简单地删除不再需要的索引。
详细的回答是它在某种程度上取决于您添加到索引中的文档量以及您的分片和复制设置。如果您的索引吞吐量相当低,TTL 可以是高性能的,但是当您开始向 Elasticsearch 写入更多文档时(或者如果您的复制因子很高),您将 运行 陷入两个问题。
- 删除具有 TTL 的文档需要 Elasticsearch 运行 定期服务(IndicesTTLService) to find documents that are expired across all shards and issue deletes 对于所有这些文档。搜索大型索引可能是一项非常费力的操作(尤其是当您被严重分片时),但更糟糕的是删除。
- 在 Elasticsearch(实际上是 Lucene)中不会立即执行删除,而是文档 "marked for deletion"。需要进行段合并以删除已删除的文档并回收磁盘 space。如果您在索引中有大量删除,它会给您的段合并操作带来更多更多压力,以至于严重影响其他线程池。
我们最初走的是 TTL 路线,并且有一个完全无法使用的 ES 集群,并且由于贪婪的合并线程而开始拒绝搜索和索引请求。
您可以尝试 "what document throughput is too much?",但从您的用例来看,我建议您节省一些时间,只使用性能更高的索引删除路由。
我会选择选项 1 - 即每天下降指数。
每日下降指数
优点:
- 这是删除数据最有效的方式
- 如果您需要重组索引(例如应用新映射、增加分片数量),任何更改都可以轻松应用于新索引
- 使用 aliases 对客户端隐藏了当前索引的详细信息(即名称)
- 可以将基于时间的搜索定向为仅搜索特定的小索引
- Index templates 简化创建每日索引的过程。
这些好处在 Time-Based Data Guide, see also Retiring Data
中也有详细说明缺点:
- 需要更多的设置工作(例如设置 cron 作业),但是有一个插件 (curator) 可以帮助解决这个问题。
- 如果您对数据执行更新,那么文档数据的所有版本都需要位于同一个索引中,即多个索引不适合您。
使用 TTL 或查询删除数据
优点:
- 简单易懂,易于实施
缺点:
- 当您删除文档时,它只会被标记为已删除。在包含它的段 merged 离开之前,它不会被物理删除。这是非常低效的,因为删除的数据会消耗磁盘 space、CPU 和内存。