ITPub博客

首页 > 数据库 > > influxdb1.X的CQ、RP实战

influxdb1.X的CQ、RP实战

作者:飘絮絮絮丶 时间:2022-02-08 16:26:46 0 删除 编辑

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   website2016-05-10T23:18:00Z   10      302016-05-10T23:18:10Z   12      392016-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还没有数据,我们需要等待它运行一段时间(半小时起步)


作者:ShootHzj链接:https://www.jianshu.com/p/4dee1575b0ec来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3146233/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42218