如何仅在 influxdb 中对超过 14 天的数据进行下采样,并将其保持在与原始数据相同的 table 中?

How to downsample data older than 14 days only in influxdb and keep it in the same table as raw data?

我正在设置从 telegraf 收集指标到 influxdb。然后grafana使用influxdb作为数据源来展示图表。

我的问题是减少磁盘使用,所以我想对旧数据(超过 3 天)进行缩减采样并保持新数据(不到 3 天)不变(原始)

我尝试了 influxdb 的保留策略 (RP) 和连续查询 (CQ),如指南中所述: https://docs.influxdata.com/influxdb/v1.2/guides/downsampling_and_retention

         influxdb ("telegraf")
+----------------------------+
|                            |
| +-----------------------+  |
| |  table disk_raw       |  |
| |  CURRENT RP (RAW)     +---------+
| |  (deleted after 3d)   |  |      |
| +-----------------------+  |      |CQ (average 30 min of datapoints into 1)
| +-----------------------+  |      |
| |  table_disk_ds        |  |      |
| |  LONGTERM RP          +<--------+
| |(downsampled, kept 90d)|  |
| +-----------------------+  |
|                            +<----+
+----------------------------+     |
                                   |
                                   |
      grafana                      | grafana query
+----------------------------+     |
|                            |     |
|  +----------------------+  |     |
|  |    data graph        |  +-----+
|  +----------------------+  |
|                            |
+----------------------------+

问题是 - 此解决方案为您提供 2 tables,一个用于原始数据,一个用于下采样数据。 CQ 不断写出下采样数据。 这对我来说不太好:

有没有什么方法可以对同一个 table 中的旧记录进行缩减采样?

配置示例: https://docs.influxdata.com/influxdb/v1.2/guides/downsampling_and_retention

grafana查询

SELECT mean("used_percent") FROM "disk" WHERE ("device" = 'dm-0') AND $timeFilter GROUP BY time(10s) fill(none)

EDIT2:这是在 Grafana
中使用模板变量实现的解决方法 https://github.com/grafana/grafana/issues/4262#issuecomment-475570324
这似乎是一个非常好的解决方案。

原始答案 查看您链接的 influxb 页面中的示例

CREATE CONTINUOUS QUERY "cq_30m" ON "food_data" BEGIN
  SELECT mean("website") AS "mean_website",mean("phone") AS "mean_phone"
  INTO "a_year"."orders"
  FROM "orders"
  GROUP BY time(30m)
END

如果您在 INTOFROM 子句中指定相同的源和目标 table,即 orders,则数据将写入相同的 table.

但是,这并不能解决您的问题。
您仍然需要两个查询来从两个保留策略中获取数据。如果你做一个通用的 select * from disk_raw ... Influx 将使用默认的保留策略和 return 数据。

您通常采用的方法是 运行 两个查询并将结果串联起来。在单个请求中,类似于
select * from rp_short.diskraw; select * from rp_long.diskraw

编辑: 这是关于为什么不可能做你(和很多其他人)想要的事情的讨论 https://github.com/influxdata/influxdb/issues/2625 还有一些解决方法。
简而言之,一种方法是手动处理下采样和高分辨率数据(即不使用 CQ)并将其保存在相同的保留策略中。另一种方法是使用代理,根据查询的时间范围增加查询,以获得正确的数据。