首页

下采样和数据保留

InfluxDB每秒可以处理十万个Points,长时间使用大量的数据可能会引起存储问题,一个自然地解决方案可以对数据进行采样,仅在有限时间内保存高精度的原始数据,并将较低精度的汇总数据存储更长时间。本篇指南介绍了如何使用InfluxdbQL自动处理下采样数据和过期旧数据的过程,使用Flux和Influxdb2.0缩减采样和保留数据,请参考处理具有Influxdb任务的数据.

定义

  • Continuous query(CQ)是一个在数据库中自动定期运行的InfluxdbQL查询,CQ在SELECT语句中需要一个函数,并且必须包含一个GROUP BY()语句

  • Retention policy (RP) 是influxdb数据结构的一部分,描述了Influxdb保留数据多长时间,Influxdb将本地服务器的时间戳与数据戳进行比较,并删除了早于RP DURATION的数据,一个数据库可以有多个RP且每个数据库的RP是唯一的

这里没有详细的介绍创建和管理CQs和QPs的语法,如果不熟悉这些概念,建议回顾以下内容:

样本数据

本部分使用虚拟的实时数据来跟踪食品订单的数量,每隔10s通过电话或者网站去一家餐馆,将这些数据存储在名为food_data的数据库的orders中;

Sample:

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

目标

假设从长远来看,仅对通过电话和网站每20分钟间隔的平均订单数感兴趣,在接下来的步骤,将使用RP和CQ来:

  • 自动将10秒分辨率数据汇总为30分钟分辨率数据
  • 自动删除早于两个小时的原始十秒分辨率数据
  • 自动删除超过52周的30分钟分辨率数据

数据库准备

在将数据写入数据库之前,我们执行以下步骤food_data,我们在插入任何数据之前先执行此操作,因为CQ仅对最新数据运行;也就是说,时间戳记的数据不早于now()减去FOR CQ子句now()GROUP BY time()时间,如果CQ没有FOR子句,则减去时间间隔的数据

1. 创建数据库

> CREATE DATABASE "food_data"

2. 创建两个小时的默认保留策略

在以下情况下,如果不提供明确的保留策略,inflxudb会写入默认的保留策略。我们使用DEFAULT RP将数据保留两个小时,因为我们希望inflxudb自动将传入的10秒分辨率数据写入保护

使用该CREATE RETENTION POLICY 语句创建一个默认 RP:

> CREATE RETENTION POLICY "two_hours" ON "food_data" DURATION 2h REPLICATION 1 DEFAULT

该查询在数据库中创建了一个名为two_hours的保留策略,two_hours会将数据保存2小时,这是默认的food_data数据库中的RP

Replication factor (REPLICATION 1) 是必须的参数,但必须始终对单节点实例设置为1

Note: 在步骤1中创建food_data数据库时,Influxdb自动生成一个名为RPautogen,并将其设置DEFAULT为数据库的RP, autogen RP具有无限保留期,通过上面的查询,RP two_hours替换autogen成为food_data数据库的新RP

3. 指定52周的保留策略

接下来,我们希望创建另一个保留策略,将数据保留52周,而不是数据库的默认保留策略。 最终,30分钟的汇总数据将存储在该RP中。

使用该CREATE RETENTION POLICY语句创建非默认保留策略

> CREATE RETENTION POLICY "a_year" ON "food_data" DURATION 52w REPLICATION 1

此操作将为food_data数据库创建一个名为a_year的保留策略,a_year设置将数据保留52周,省略DEFAULT参数可确保_year不是food_data数据库默认RP,也就是说,针对food_data该操作未指定RP的的写入和读取操作仍将转到two_hoursRP(DEFAULTRP);

4. 创建连续查询

现在我们已经建立了我们的RPs,我们想创建一个连续的查询(CQ),它将自动并且周期性地将10分辨率数据下采样到30分钟分辨率,然后用不同的保留政策。

使用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

该查询在数据库food_data中创建一个名为cq_30m的CQ;cq_30m告诉Influxdb计算这两个field的30分钟的平均值。websitephone在测量订单和默认RP中两小时; 还会声明Influxdb使用field key和将这些结果写入downsampled_ordersmeasurement中的保留策略.。Influxdb将在之前30分钟内,Influxdb将每30分钟运行一次此查询;

Note: 完全限定(即使用语法 "<retention_policy>"."<measurement>")INTO子句中的度量,Inflxudb要求使用该语法将数据写入RP意外的DEFAULT RP。

结果

有了新的CQ和两个新RP,foo_data就可以开始接受数据了,将数据写入我们的数据库并让其运行一会字后,我们可以看到两个measurement: ordersdownsampled_orders

> SELECT * FROM "orders" LIMIT 5
name: orders
---------
time                    phone  website
2016-05-13T23:00:00Z    10     30
2016-05-13T23:00:10Z    12     39
2016-05-13T23:00:20Z    11     56
2016-05-13T23:00:30Z    8      34
2016-05-13T23:00:40Z    17     32

> SELECT * FROM "a_year"."downsampled_orders" LIMIT 5
name: downsampled_orders
---------------------
time                    mean_phone  mean_website
2016-05-13T15:00:00Z    12          23
2016-05-13T15:30:00Z    13          32
2016-05-13T16:00:00Z    19          21
2016-05-13T16:30:00Z    3           26
2016-05-13T17:00:00Z    4           23

orders插入的是保留在两小时RP中的原始十秒分辨率数据,downsampled_orders中的数据是受52周RP限制的30分钟汇总分辨率数据

笔记:

  • 请注意,我们在第二条语句中完全限定了 (即使用语法 "<retention_policy>"."<measurement>") downsampled_orders 第二个 SELECT语句.我们必须在要选择的查询中指定RP 驻留在除默认RP之外的RP中的数据
  • 默认情况下, InfluxDB 每隔30分钟检查一次,以强制执行一次更新.在两次检查之间, orders 中的数据可以能超过两个小时. TInfluxDB检查执行RP的速率是可配置的设置 请参阅数据库配置.

通过结合使用RPsCQs,我们成功地建立了我们的数据库 在有限的时间内自动保存高精度的原始数据 精度数据,并将较低精度数据存储更长时间.。现在,您已经对这些功能如何协同工作有了大致的了解,请查看有关CQsRPs的详细文档;


InfluxDB OSS 2.0 release candidate

InfluxDB OSS v2.0.rc includes breaking changes that require a manual upgrade from all alpha and beta versions. For information, see:

Upgrade to InfluxDB OSS v2.0.rc