时间绑定索引与基于维度的路由
与仅写入最新支持索引的常规数据流不同,时间序列数据流 (TSDS) 使用时间绑定支持索引,根据文档的时间戳值接收文档。本页提供了帮助您使用时间绑定索引的详细信息和最佳实践。
每个 TSDS 支持索引都有一个用于接收 @timestamp 值的时间范围,该范围由以下两个设置定义
index.time_series.start_time:最早可接收的时间戳(包含)index.time_series.end_time:最晚可接收的时间戳(不包含)
当您向 TSDS 添加文档时,Elasticsearch 会根据其 @timestamp 值将文档添加到相应的支持索引中。这意味着 TSDS 可以同时写入多个支持索引,而不仅仅是写入最新的一个。
如果没有任何支持索引可以接收文档的 @timestamp 值,Elasticsearch 将拒绝该文档。
Elasticsearch 会在索引创建和滚动更新过程中自动配置 index.time_series.start_time 和 index.time_series.end_time 设置。
TSDS 旨在摄取当前的指标数据。当 TSDS 首次创建时,初始支持索引具有以下设置
index.time_series.start_time值设置为now - index.look_back_timeindex.time_series.end_time值设置为now + index.look_ahead_time
只有处于此范围之内的数据才会被索引。
要检查写入 TSDS 的可接收时间范围,请使用 获取数据流 API (get data stream API)
GET _data_stream/my-tsds
在可接收时间范围内的写入操作仍可能被拒绝。以下操作可能会影响可写入的时间范围,要么是因为它们将支持索引设置为只读,要么是删除了该索引:
- 删除
- 降采样 (Downsample)
- 强制合并
- 只读
- 可搜索快照
- 收缩 (Shrink),这可能会在操作结束时恢复非只读状态
索引生命周期管理在 index.time_series.end_time 过去之前,不会继续执行这些操作。
除了基于时间的路由外,时间序列数据流还使用基于维度的路由来确定将数据路由到哪个分片。具有相同维度的文档会使用以下两种策略之一路由到相同的分片:
- 索引维度 (Index dimensions)
- 基于内部管理的
index.dimensions设置进行路由。 - 路由路径
- 基于
index.routing_path设置进行路由(作为后备方案)。
基于 index.dimensions 的策略提供更好的摄取性能。它使用自动更新(且不可由用户配置)的维度路径列表。对于通过动态模板设置 time_series_dimension: true 的时间序列数据流,此策略不可用。
要禁用基于 index.dimensions 的路由,请将 index.index_dimensions_tsid_strategy_enabled 设置为 false,或者手动将 index.routing_path 设置为您想要使用的维度
"settings": {
"index.mode": "time_series",
"index.routing_path": ["host", "service"]
}
具有相同维度值的文档会被路由到同一个分片,从而提高时间序列数据的压缩和查询性能。
index.routing_path 设置支持通配符(例如 dim.*)并且可以动态匹配新字段。