配置时间序列数据流以进行降采样
要对时间序列数据流 (TSDS) 进行降采样,您可以使用索引生命周期管理 (ILM) 或数据流生命周期。(您也可以对单个时间序列索引使用 降采样 API,但大多数用户无需使用此 API。)
开始之前,请参阅 降采样概念。
降采样需要只读数据。
在大多数情况下,您可以选择数据流生命周期选项。如果您在 Elastic Stack 中使用 数据层,请选择索引生命周期选项。
要使用 数据流生命周期 对时间序列进行降采样,请将 降采样 (downsampling) 部分添加到数据流生命周期(针对现有数据流)或索引模板(针对新数据流)中。
- 将
fixed_interval设置为您所需的粒度级别。原始时间序列数据将按此间隔进行聚合。 - 将
after设置为索引滚动更新后运行降采样前等待的最短时间。 -
(可选)将 downsampling_method设置为您首选的 降采样方法,如果不指定,将使用默认方法 (aggregate)。
PUT _data_stream/my-data-stream/_lifecycle
{
"data_retention": "7d",
"downsampling_method": "aggregate",
"downsampling": [
{
"after": "1m",
"fixed_interval": "10m"
},
{
"after": "1d",
"fixed_interval": "1h"
}
]
}
降采样操作在 索引时间序列结束时间 过去后运行。
要作为索引生命周期管理 (ILM) 的一部分对时间序列数据进行降采样,请在您的 ILM 策略中包含 降采样操作 (downsample actions)。您可以跨不同阶段配置多个降采样操作,以随着时间的推移逐步降低数据粒度。
此示例显示了一个包含滚动更新和两个降采样操作的策略:一个在热阶段 (hot phase) 进行 5 分钟间隔的初始聚合,另一个在温阶段 (warm phase) 进行 1 小时间隔的进一步聚合
PUT _ilm/policy/datastream_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover" : {
"max_age": "5m"
},
"downsample": {
"fixed_interval": "5m",
"sampling_method": "aggregate"
}
}
},
"warm": {
"actions": {
"downsample": {
"fixed_interval": "1h",
"sampling_method": "aggregate"
}
}
}
}
}
}
- 将
fixed_interval设置为您所需的粒度级别。原始时间序列数据将按此间隔进行聚合。降采样操作在索引滚动更新且 索引时间序列结束时间 过去后运行。 -
(可选)将 sampling_method设置为您首选的 降采样方法,如果不指定,将使用默认方法 (aggregate)。
本节提供了一些降采样的最佳实践。
在选择降采样间隔时,请务必考虑测量值的原始采样率。使用一个能显著减少文档数量的间隔。例如,如果传感器每 10 秒发送一次数据,降采样到 1 分钟会将文档数量减少 83%。降采样到 5 分钟则会将文档数量减少 96%。
这同样适用于对已经过降采样的数据进行再次降采样。
使用 索引生命周期管理 (ILM) 时,您可以在以下每个阶段中最多定义一轮降采样
hot(热)阶段:在 索引时间序列结束时间 过去后运行warm(温)阶段:在min_age时间后运行(从滚动更新后开始计数,并遵守 索引时间序列结束时间)cold(冷)阶段:在min_age时间后运行(从滚动更新后开始计数,并遵守 索引时间序列结束时间
阶段不需要匹配的分层。如果该阶段存在匹配的分层,ILM 会自动将数据迁移到相应的分层。为防止这种情况,请添加 迁移操作 (migrate action) 并指定 enabled: false。
如果您保持默认的迁移操作启用状态,降采样将在源索引所在的分层上运行,该分层通常具有更多资源。然后,较小的降采样数据会被迁移到下一个分层。
由于降采样操作会一次性处理整个索引,因此它会增加集群的负载。较小的索引可以改善任务分配,从而有助于最大程度地减少降采样对集群性能的影响。
要减小索引大小,请
- 限制主分片的数量,或
- (仅限 ILM)在
hot阶段的 滚动更新操作 中使用max_primary_shard_docs来限制每个分片的文档数量。指定一个低于默认值 2 亿的值,以帮助防止因降采样导致的负载峰值。