当 TSDS 遇到 ILM:设计不会拒绝延迟数据的时间序列数据流

0 阅读7分钟

作者:来自 Elastic Bret Wortman

TSDS 时间边界如何与 ILM 阶段交互;以及如何设计能够容忍延迟到达 metrics 的策略。

Elasticsearch 允许你以快速且灵活的方式对数据进行索引。你可以在云中免费试用,或在本地运行以了解索引是多么简单。


最近,我将一位客户的 metrics 集群从 “全部在 hot tier” 迁移到 hot / cold / frozen 架构。这是我之前做过几十次的变更。然而几分钟之内,Logstash 完全停止了数据推进。

Elasticsearch 开始拒绝延迟到达的 metrics。这些拒绝导致 pipeline 落后,从而产生更多延迟数据,进而触发更多拒绝。最终,pipeline 完全停滞。

我们不得不从 snapshot 恢复,重新索引数据,并重新设计数据摄取 pipeline 才得以恢复。

根本原因并不是 index lifecycle management(ILM)本身,而是 time series data streams(TSDS)以及它们如何对具有时间边界的 backing indices 进行约束。

TSDS 可以将 metrics 的存储需求降低 40–70%,但使 TSDS 高效的架构变化也改变了索引随时间的行为方式。在设计 ILM 策略或当你的摄取 pipeline 可能产生延迟到达的数据时,这些变化非常关键。

简而言之

在使用 TSDS 时:

  • backing indices 只接受特定时间窗口内的文档。
  • 如果延迟数据在索引进入 cold 或 frozen 之后到达,Elasticsearch 会拒绝这些文档,或者在已配置的情况下将其路由到 failure store。

设计规则:

`warm_min_age > rollover_max_age + maximum_expected_lateness`AI写代码

什么是时间序列数据流?

时间序列数据流(TSDS)是一种针对 metrics 数据优化的专用数据流。数据会被路由,使相关文档位于同一分片中,从而优化查询和检索。Elasticsearch 的实现方式如下:

每个文档包含:

  • 一个 timestamp。
  • 用于标识时间序列的维度字段。
  • 表示测量值的指标字段。

示例包括:

  • 每个主机的 CPU 使用率。
  • 每个服务的请求延迟。
  • 每个传感器的温度读数。

维度用于标识我们要测量的对象,而指标表示随时间变化的值。

维度

维度描述被测量的实体。

示例:

`

1.  host.name
2.  service.name
3.  container.id

`AI写代码

我们在 mappings 中使用以下方式定义它们:

`time_series_dimension: true`AI写代码

指标

指标表示数值型数据,并使用以下方式定义:

`time_series_metric`AI写代码

常见的指标类型:

  • Gauge:会上下波动的值。
  • Counter:持续增加直到重置的值。

Elastic Agent 主要收集 metrics 和 logs 数据,因此即使你没有手动启用任何 TSDS 索引,你的集群中也可能已经存在它们。

_tsid 字段

Elasticsearch 会基于维度字段在内部生成 _tsid 值。这使得具有相同维度的文档可以被路由到同一个分片,从而提升:

  • 压缩率。
  • 查询局部性。
  • 聚合性能。

关键区别:有时间边界的 backing indices

传统数据流始终写入最新的 backing index,即 write index,但 TSDS 的行为不同。

每个 TSDS backing index 都有一个定义好的时间窗口,只接受 @timestamp 值落在该时间窗口内的文档:

`

1.  GET _data_stream/my-metrics-data-stream
2.  {
3.       "index_mode": "time_series",
4.       "time_series": {
5.         "temporal_ranges": [
6.           {
7.             "start": "2026-01-15T14:35:50.000Z",
8.             "end": "2026-03-16T11:34:40.000Z"
9.           }
10.         ]
11.       }
12.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

当文档被索引时,Elasticsearch 会将其路由到负责该 timestamp 的 backing index,这意味着与传统索引不同,TSDS 可能同时写入多个 backing indices。

例如:

  • 实时数据 → 最新索引。
  • 延迟数据 → 覆盖该时间范围的早期索引。

为延迟到达的数据设计

实际的摄取 pipeline 很少能按时完美交付 metrics。网络中断、途中积压、批量摄取以及边缘设备丢失后重新连接并开始补发,都可能导致 metrics 延迟。

传统索引会默默地吸收这些延迟,而 TSDS 不会。

如果文档的 timestamp 超出可写 backing indices 的范围,Elasticsearch 会拒绝该文档,这意味着你的 ILM 策略必须考虑延迟数据。

关键约束

Backing indices 必须保持可写状态足够长的时间,以接受延迟数据。

在实际操作中:

`time_until_readonly > maximum_expected_lateness`AI写代码

因为 ILM 从 rollover 计算索引年龄,操作规则变为:

`warm_or_cold_min_age > rollover_max_age + maximum_expected_lateness`AI写代码

例如,如果 metrics 最多可能延迟六小时到达,则索引在 rollover 后至少必须保持六小时可写。

未考虑此约束正是之前导致摄取失败的原因。延迟到达的数据被定向到较早的索引,而该索引已在 cold tier,因此被写入阻止。

处理被拒绝的文档

当 TSDS 拒绝文档时,Elasticsearch 会返回错误,提示 timestamp 不在可写索引范围内。你的摄取 pipeline 如何处理该错误决定了你是丢失数据还是导致摄取停滞。

处理被拒绝文档的主要机制是 failure store。

Failure store(在 Elasticsearch 9.1+ 推荐使用)

Elasticsearch 9.1 引入了 failure store,它会自动捕获被拒绝的文档。Elasticsearch 不再将错误返回给客户端,而是将失败的文档写入数据流内的专用 failure index。

你可以使用以下方式检查失败文档:

`GET metrics-myapp::failures/_search`AI写代码

使用 failure store 可以防止摄取 pipeline 因拒绝错误而中断,同时保留失败的数据以供分析或重新索引

监控拒绝问题

延迟到达的问题通常最先表现为摄取异常。你可能会首先注意到:

  • 索引速率突然下降。
  • 被拒绝文档的激增。
  • failure store 条目的数量持续增长。
  • pipeline 输入与输出计数不匹配。

对这些信号设置告警可以让运维人员在 pipeline 停滞之前发现问题。可使用 workflows、机器学习任务以及其他机制来实现自动检测和通知。

TSDS + ILM 迁移清单

如果你正在将 metrics 集群迁移到 TSDS、引入 ILM 分层,或升级到默认使用 TSDS 的 Elasticsearch 版本,请先检查以下内容。

1)测量摄取延迟

在更改 ILM 策略之前,确定:

  • 正常的摄取延迟。
  • 事件期间的最坏延迟。
  • 批量 pipeline 引起的延迟。

你的 ILM 设计必须考虑最大现实延迟。

2)验证索引时间窗口

检查你的 TSDS backing indices:

`GET _data_stream/<your-stream>`AI写代码

查看:

  • time_series.start_time
  • time_series.end_time

这些边界决定哪些索引可以接受文档。理解这些时间窗口可以帮助你确定数据在被拒绝前可以延迟多久。

3)为延迟到达调整 hot tier 大小

确保 backing indices 保持可写状态足够长,以接收延迟数据。

操作规则:

`warm_min_age > rollover_max_age + maximum_expected_lateness`AI写代码

记住,如果 metrics 可能延迟六小时到达,索引至少必须保持六小时可写。

4)决定如何处理被拒绝的文档

在启用 TSDS 之前选择策略:

  • Failure store(在 Elasticsearch 9.1+ 推荐使用)
  • Logstash dead letter queue
  • 延迟到达的备用索引
  • 接受有限的数据丢失

5)监控摄取健康状况

为以下情况添加告警:

  • 索引速率下降
  • 被拒绝的文档
  • failure store 增长
  • pipeline 输入/输出不匹配

延迟数据问题通常最先表现为摄取异常。

总结

时间序列数据流为 metrics 工作负载提供了显著的存储和性能提升,但它们引入了一个重要的架构变化:backing indices 有时间边界,这会影响 ILM 的行为。

使用 TSDS 时:

  • 索引必须保持可写状态足够长,以接受延迟数据。
  • 摄取 pipeline 应安全处理被拒绝的文档。

需要记住的关键规则是:

`warm_min_age > rollover_max_age + maximum_expected_lateness`AI写代码

如果你围绕该约束设计 ILM 策略,TSDS 对 metrics 工作负载非常有效。

如果忽略它,你的摄取 pipeline 可能会以痛苦的方式发现这些时间边界。

原文:www.elastic.co/search-labs…