3

我正在设置一个从电报收集指标到 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 个表,一个用于原始数据,一个用于下采样数据。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)

4

1 回答 1

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

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

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

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

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

于 2019-10-25T09:51:05.037 回答