如何仅在 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 不断写出下采样数据。
这对我来说不太好:
- 我正在使用 grafana 查询 influxdb,它从单个 table 中读取
到图表。我想要一张同时包含旧数据和新数据的图表。
- 使用 2 个数据库会增加磁盘使用量
有没有什么方法可以对同一个 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
如果您在 INTO
和 FROM
子句中指定相同的源和目标 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)并将其保存在相同的保留策略中。另一种方法是使用代理,根据查询的时间范围增加查询,以获得正确的数据。
我正在设置从 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 不断写出下采样数据。 这对我来说不太好:
- 我正在使用 grafana 查询 influxdb,它从单个 table 中读取 到图表。我想要一张同时包含旧数据和新数据的图表。
- 使用 2 个数据库会增加磁盘使用量
有没有什么方法可以对同一个 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
如果您在 INTO
和 FROM
子句中指定相同的源和目标 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)并将其保存在相同的保留策略中。另一种方法是使用代理,根据查询的时间范围增加查询,以获得正确的数据。