时间序列数据流降采样编辑

降采样提供了一种方法,可以通过以降低的粒度存储来减少 时间序列数据 的占用空间。

指标解决方案会收集大量随着时间推移而增长的时序数据。随着数据的陈旧,它与系统当前状态的相关性降低。降采样过程将固定时间间隔内的文档汇总到单个摘要文档中。每个摘要文档包含原始数据的统计表示:每个指标的 minmaxsumvalue_count。数据流 时间序列维度 保持不变。

降采样实际上允许您以数据分辨率和精度为代价来换取存储大小。您可以将其包含在 索引生命周期管理 (ILM) 策略中,以自动管理指标数据的随着时间推移而产生的数据量和相关成本。

查看以下部分以了解更多信息

工作原理编辑

时间序列 是对特定实体随时间推移进行的一系列观测。观测到的样本可以表示为连续函数,其中时间序列维度保持不变,而时间序列指标随时间推移而变化。

time series function

在 Elasticsearch 索引中,会为每个时间戳创建一个单独的文档,其中包含不可变的时间序列维度,以及指标名称和变化的指标值。对于单个时间戳,可能会存储多个时间序列维度和指标。

time series metric anatomy

对于您最新和最相关的数据,指标序列通常具有较低的采样时间间隔,因此它针对需要高数据分辨率的查询进行了优化。

time series original
图 4. 原始指标序列

降采样通过将原始时间序列替换为具有更高采样间隔的数据流和该数据的统计表示,来处理较旧的、访问频率较低的数据。如果原始指标样本的采样间隔为每十秒一次,例如,随着数据的陈旧,您可以选择将样本粒度降低到每小时或每天一次。您可以选择将 cold 归档数据的粒度降低到每月或更低。

time series downsampled
图 5. 降采样指标序列

对时间序列数据运行降采样编辑

要对时间序列索引进行降采样,请使用 降采样 API 并将 fixed_interval 设置为您想要的粒度级别

response = client.indices.downsample(
  index: 'my-time-series-index',
  target_index: 'my-downsampled-time-series-index',
  body: {
    fixed_interval: '1d'
  }
)
puts response
POST /my-time-series-index/_downsample/my-downsampled-time-series-index
{
    "fixed_interval": "1d"
}

要将时间序列数据作为 ILM 的一部分进行降采样,请在您的 ILM 策略中包含 降采样操作 并将 fixed_interval 设置为您想要的粒度级别

response = client.ilm.put_lifecycle(
  policy: 'my_policy',
  body: {
    policy: {
      phases: {
        warm: {
          actions: {
            downsample: {
              fixed_interval: '1h'
            }
          }
        }
      }
    }
  }
)
puts response
PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "warm": {
        "actions": {
          "downsample" : {
            "fixed_interval": "1h"
          }
        }
      }
    }
  }
}

查询降采样索引编辑

您可以使用 _search_async_search 端点来查询降采样索引。可以在单个请求中查询多个原始数据和降采样索引,并且单个请求可以包含不同粒度(不同的桶时间跨度)的降采样索引。也就是说,您可以查询包含具有多个降采样间隔(例如,15m1h1d)的降采样索引的数据流。

基于时间的直方图聚合的结果以统一的桶大小表示,并且每个降采样索引都返回忽略降采样时间间隔的数据。例如,如果您在以每小时分辨率("fixed_interval": "1h")降采样的降采样索引上运行具有 "fixed_interval": "1m"date_histogram 聚合,则查询将返回一个包含第 0 分钟所有数据的桶,然后是 59 个空桶,然后是下一个小时的另一个包含数据的桶。

关于降采样查询的说明编辑

关于查询降采样索引,需要注意以下几点

  • 当您在 Kibana 和 Elastic 解决方案中运行查询时,会返回正常的响应,不会通知您某些查询的索引是降采样的。
  • 对于 日期直方图聚合,只支持 fixed_intervals(不支持日历感知间隔)。
  • 时区支持存在一些注意事项

    • 以小时倍数为间隔的日期直方图基于在 UTC 生成的值。这对于以小时为单位的时区(例如 +5:00 或 -3:00)非常有效,但需要对报告的时间桶进行偏移,例如,对于时区 +5:30(印度),如果降采样每小时聚合一次值,则报告为 2020-01-01T10:30:00.000 而不是 2020-03-07T10:00:00.000。在这种情况下,结果包含字段 downsampled_results_offset: true,以指示时间桶已移位。如果使用 15 分钟的降采样间隔,则可以避免这种情况,因为它允许为移位的桶正确计算每小时值。
    • 以天为倍数为间隔的日期直方图也会受到类似的影响,如果降采样每天聚合一次值。在这种情况下,每天的开始时间始终在生成降采样值时以 UTC 计算,因此需要对时间桶进行偏移,例如,对于时区 America/New_York,报告为 2020-03-07T19:00:00.000 而不是 2020-03-07T00:00:00.000。在这种情况下,也会添加字段 downsampled_results_offset: true
    • 夏令时和时区周围类似的特殊情况会影响报告的结果,如 所述 的日期直方图聚合。此外,以每天为间隔的降采样会阻碍跟踪与夏令时变化相关的任何信息。

限制和局限性编辑

降采样适用以下限制和局限性

  • 只支持 时间序列数据流 中的索引。
  • 数据仅根据时间维度进行降采样。所有其他维度都会复制到新索引,不会进行任何修改。
  • 在数据流中,降采样索引会替换原始索引,并且原始索引会被删除。对于给定时间段,只能存在一个索引。
  • 源索引必须处于只读模式,降采样过程才能成功。有关详细信息,请查看 手动运行降采样 示例。
  • 支持对同一时段的数据进行多次降采样(对降采样索引进行降采样)。降采样间隔必须是降采样索引间隔的倍数。
  • 降采样作为 ILM 操作提供。请参阅 降采样
  • 新的降采样索引将在原始索引的数据层上创建,并且会继承其设置(例如,分片和副本的数量)。
  • 支持数字 gaugecounter 指标类型
  • 降采样配置是从时间序列数据流 索引映射 中提取的。唯一需要的额外设置是降采样 fixed_interval

试一试编辑

要对降采样进行测试运行,请尝试我们关于 手动运行降采样 的示例。

降采样可以轻松地添加到您的 ILM 策略中。要了解如何操作,请尝试我们关于 使用 ILM 运行降采样 的示例。