Elasticsearch 时间序列数据流(TSDS)深度解析
elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch
什么是时间序列数据流
时间序列数据流(Time Series Data Stream, TSDS)是Elasticsearch中专门为存储时间序列指标数据而设计的一种数据结构。它将带有时间戳的指标数据建模为一个或多个时间序列,相比普通数据流可以显著提高存储效率。根据官方基准测试,使用TSDS存储指标数据可以节省高达70%的磁盘空间。
TSDS适用场景
TSDS最适合满足以下特征的场景:
- 数据是近实时写入的指标数据
- 数据按照
@timestamp
时间戳顺序写入 - 数据具有明显的时序特征
对于日志、追踪等非指标类时间序列数据,建议使用普通数据流而非TSDS。
TSDS核心特性
1. 维度与指标字段
TSDS文档必须包含:
- 一个或多个维度字段:用于标识时间序列的字段,通常是描述被测量实体的属性(如设备ID、位置等)
- 一个
@timestamp
字段:记录数据点的时间 - 通常还包含一个或多个指标字段:包含数值测量值
维度字段需要使用time_series_dimension
参数标记,支持keyword、ip和数值类型字段。指标字段则使用time_series_metric
参数标记,支持数值类型和特定聚合类型。
2. 时间序列模式
TSDS的索引模板必须包含data_stream
对象并设置index_mode: time_series
选项。这会启用TSDS相关功能,包括:
- 自动生成
_tsid
元数据字段 - 基于时间的索引管理
- 维度路由等特性
3. 时间边界索引
TSDS中的每个后备索引都有明确的时间范围(通过index.time_series.start_time
和index.time_series.end_time
设置)。写入时,Elasticsearch会根据文档的@timestamp
将其路由到合适的时间范围内索引中。
4. 维度路由
通过index.routing_path
设置,TSDS可以将具有相同维度的文档路由到相同的分片上,提高查询效率和压缩率。路由路径必须由keyword
类型的维度字段组成。
5. 索引排序优化
TSDS内部使用索引排序,按_tsid
和@timestamp
对分片段进行排序,使得相同时间序列的数据存储在一起,提高压缩效率。
TSDS高级配置
前瞻时间(Look-ahead time)
通过index.look_ahead_time
设置可以配置索引能接受未来多长时间的数据。计算公式为:
index.time_series.end_time = now + index.look_ahead_time
回溯时间(Look-back time)
通过index.look_back_time
设置可以配置索引能接受过去多长时间的数据。计算公式为:
index.time_series.start_time = now - index.look_back_time
最佳实践
- 维度设计:选择能够唯一标识时间序列的字段作为维度,通常是被测量实体的ID或属性
- 指标类型:正确标记指标类型(counter或gauge)以获得最佳聚合效果
- 时间范围:合理配置look-ahead和look-back时间以适应业务场景
- 路由路径:选择高基数维度作为路由路径以提高查询性能
总结
Elasticsearch的TSDS为时间序列指标数据提供了高度优化的存储和查询方案。通过理解其核心概念和配置选项,可以构建出高效的时间序列数据处理系统。对于监控、IoT等产生大量时间序列数据的场景,TSDS是理想的选择。
elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考