如何仅在 influxdb 中对超过 14 天的数据进行下采样并将其与原始数据保存在同一个表中?

Woj*_*Zet 5 retention influxdb grafana

我正在设置从 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        |  +-----+
|  +----------------------+  |
|                            |
+----------------------------+
Run Code Online (Sandbox Code Playgroud)

问题是 - 该解决方案为您提供了 2 张表,一张用于原始数据,一张用于下采样数据。CQ 不断地写入下采样数据。这对我来说不太好:

  • 我正在使用 grafana 查询 influxdb ,它从单个表读取到图形。我想要一张图表来显示旧数据和新数据。
  • 使用 2 个数据库会增加磁盘使用量

有什么方法可以对同一个表中的旧记录进行下采样吗?

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

格拉法纳查询

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

Nik*_*lov 4

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
Run Code Online (Sandbox Code Playgroud)

如果orders在 andINTO子句中指定相同的源表和目标表,即FROM,则数据将写入同一个表。

但是,这并不能解决你的问题。
您仍然需要两个查询才能从两个保留策略获取数据。如果您执行通用select * from disk_raw ...Influx 将使用默认保留策略并从那里返回数据。

通常执行此操作的方法是运行两个查询并连接结果。在单个请求中类似
select * from rp_short.diskraw; select * from rp_long.diskraw

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