influxdb1.X的CQ、RP实战

举报
张俭 发表于 2023/12/30 10:34:05 2023/12/30
【摘要】 influx1.X的下采样数据和数据存留大量参考翻译自 https://docs.influxdata.com/influxdb/v1.8/guides/downsample_and_retain/InfluxDB 每秒可以处理数十万个数据点。 长时间处理这么多数据可能会引起存储问题。 一个自然的解决方案是对数据进行下采样; 将高精度原始数据仅保留有限的时间,并将较低精度的汇总数据存储更长...

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根据服务器上的时间和数据上的时间,删除比RPDURATION更老的数据。一个数据库可以拥有多个RP,RP不能扩数据库。

样本数据

本部分使用虚构的实时数据以 10 秒的间隔跟踪通过电话和网站向餐厅订购的食品数量。 我们将此数据存储在名为 food_data 的数据库中、在measurement orders中的字段phonewebsite

样本

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分钟为周期的通过电话和网站的订单数感兴趣,在接下来,我们通过CQRP

  • 自动地将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_30mCQcq_30m告诉influxdb计算在measurement orders中在DEFAULT RP two hours下的30分钟内的websitephone的平均值。并且还让influxdb将这些结果写到measurement downsampled_orders,并使用a_year的老化策略,字段名分别为mean_websitemean_phoneInfluxdb每30分钟运行一次前30分钟的数据

结果

有了CQRP,之后,我们就可以往数据库中写入数据了,让我们插入几条数据

INSERT orders phone=5,website=20
INSERT orders phone=5,website=21
INSERT orders phone=5,website=20
INSERT orders phone=2,website=4

image.png

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

image.png

image.png

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。