influx1.X的下采样数据和数据存留
大量参考翻译自 https://docs.influxdata.com/influxdb/v1.8/guides/downsample_and_retain/
InfluxDB 每秒可以处理数十万个数据点。 长时间处理这么多数据可能会引起存储问题。 一个自然的解决方案是对数据进行下采样; 将高精度原始数据仅保留有限的时间,并将较低精度的汇总数据存储更长时间。 本指南描述了如何使用 InfluxQL 自动化下采样数据和过期旧数据的过程。
influxdb
1.X有CQ和RP的概念,不过在influx2
中,这两个概念都被替换掉了,不过还是很有必要学习了解一下这两个概念并感悟一下为什么在influx2
替换掉了这两个概念
定义
-
Continuous query CQ 是
influxQL
中的一种查询语句,它自动地周期性地运行在数据库中。CQs 需要在select
语句上执行聚合函数, 并且一定需要GROUP BY time()
语句 -
Retention policy RP 是
influxDB
中地一部分数据结构,描述了数据在influxDB
中存留的时间。InfluxDB
根据服务器上的时间和数据上的时间,删除比RP的DURATION
更老的数据。一个数据库可以拥有多个RP,RP不能扩数据库。
样本数据
本部分使用虚构的实时数据以 10 秒的间隔跟踪通过电话和网站向餐厅订购的食品数量。 我们将此数据存储在名为 food_data 的数据库中、在measurement
orders
中的字段phone
和website
。
样本
name: orders
------------
time phone website
2016-05-10T23:18:00Z 10 30
2016-05-10T23:18:10Z 12 39
2016-05-10T23:18:20Z 11 56
目标
假设在长期运行中,我们只对以30分钟为周期的通过电话和网站的订单数感兴趣,在接下来,我们通过CQ和RP来
- 自动地将10秒为周期的解决方案数据聚合为30分钟为周期的数据
- 自动地将2小时之前的10秒为周期的数据行删除
- 自动地删除52周前地30分钟为周期地数据
数据库准备
我们在向food_data
插入数据之前先做一些准备工作。原因是因为CQ只对最近的数据进行操作。
创建数据库
CREATE DATABASE "food_data"
创建2小时的RP
如果在写入数据的时候不指定RP,那么InfluxDB
会使用默认的RP。由于我们想把每十秒写进来的数据自动使用2小时的RP(而不需要手动指定),我们将默认的RP修改成2h。
CREATE RETENTION POLICY "two_hours" ON "food_data" DURATION 2h REPLICATION 1 DEFAULT
这个语句在food_data
中创建了一个名叫two_hours
的RP。two_hours
默认保留2小时的数据,并且是food_data
数据库的默认RP
创建52周的RP
接下来我们创建一个52周的RP,用来存储每30分钟的数据。
CREATE RETENTION POLICY "a_year" ON "food_data" DURATION 52w REPLICATION 1
注意,这个RP并不是默认RP
创建CQ
现在我们已经设置了我们的 RP,我们想要创建一个连续查询 (CQ),它会自动定期将 10 秒采样数据下采样到 30 分钟采样,然后将这些结果存储在不同的measurement
和不同的RP中
使用CREATE CONTINUOUS QUERY
语句来创建CQ
CREATE CONTINUOUS QUERY "cq_30m" ON "food_data" BEGIN
SELECT mean("website") AS "mean_website",mean("phone") AS "mean_phone"
INTO "a_year"."downsampled_orders"
FROM "orders"
GROUP BY time(30m)
END
不换行,用于复制
CREATE CONTINUOUS QUERY "cq_30m" ON "food_data" BEGIN SELECT mean("website") AS "mean_website",mean("phone") AS "mean_phone" INTO "a_year"."downsampled_orders" FROM "orders" GROUP BY time(30m) END
这个语句在food_data
中创建了一个名为cq_30m
的CQ。cq_30m
告诉influxdb
计算在measurement
orders
中在DEFAULT RP two hours
下的30分钟内的website
和phone
的平均值。并且还让influxdb
将这些结果写到measurement
downsampled_orders
,并使用a_year
的老化策略,字段名分别为mean_website
和mean_phone
。Influxdb
每30分钟运行一次前30分钟的数据
结果
有了CQ和RP,之后,我们就可以往数据库中写入数据了,让我们插入几条数据
INSERT orders phone=5,website=20
INSERT orders phone=5,website=21
INSERT orders phone=5,website=20
INSERT orders phone=2,website=4

这个时候downsampled_orders
还没有数据,我们需要等待它运行一段时间(半小时起步)


网友评论