TL;DR InfluxDB 技术提示 - 限制数据库中的序列和持续查询配置

导航至

在本周的帖子中,我们回顾了与 InfluxDB 和 TICK-stack 相关的最有趣的问题、解决方法、如何在数据库中限制序列、持续查询配置以及持续查询结果中的 FILL() 函数,以及来自 GitHub、IRC 和 InfluxDB Google Group 的问答,您可能在过去一周左右错过了这些内容。

限制每个数据库的序列数量

问:有没有办法限制写入 InfluxDB 的序列数量?

答:是的。max-series-per-database 配置设置允许您限制每个数据库写入的序列数量。默认情况下,max-series-per-database 设置为 1,000,000,您可以在配置文件的 [data] 部分找到它。

如果一个点导致数据库中的序列数量超过 max-series-per-database,InfluxDB 将不会写入该点,并返回 500 错误,如下所示

{"error":"max series per database exceeded: <series>"}

配置持续查询的计划

问:我的 CQ 每小时运行一次,在每小时开始时。有没有办法让它每小时运行一次,但在每小时的第三十分钟运行?因此,CQ 不是在 00:0001:00 运行,而是在 00:30 运行,然后在 01:30 运行,然后在 2:30 运行,依此类推。

答:CQ 语法支持使用 offset interval 来更改 CQ 的默认执行时间。例如,以下 CQ 在默认执行时间后 30 分钟(30m)执行

CREATE CONTINUOUS QUERY "thirty_is_the_new_00" [...] GROUP BY time(1h,30m)

请注意,offset interval 也会将每个查询覆盖的时间范围向前移动。在 00:30,CQ 的时间范围将在 23:3000:30 之间,而不是默认的 23:0000:00 之间。

Fill() 持续查询结果

问:我在我的 CQ 中包含了 fill(100) 以用值填充任何无数据间隔,但它似乎不起作用;如果一个间隔没有数据,它仍然在 CQ 结果中丢失。当我创建 CQ 并且当我查看日志时 CQ 似乎正在运行时,我没有看到任何错误。这是预期的行为吗?

我的持续查询

CREATE CONTINUOUS QUERY "fruit_rollup" ON "mydb" BEGIN
SELECT mean("usage_idle") INTO "average_idle" FROM "cpu" GROUP BY time(30m),cpu fill(100)
END

答:这是您的 CQ 的预期行为。基本语法只是忽略 CQ 查询中包含的 fill()

具有高级语法的 CQ(即包含 RESAMPLE 子句的 CQ)确实支持 fill()。请注意,至少必须有一个数据点落在 RESAMPLEFOR 间隔内,fill() 才能运行。如果没有数据落在 FOR 间隔内,CQ 将不会向目标测量写入任何点。

例如,以下 CQ 每半小时运行一次单个查询。当它运行时,查询覆盖 now()now() 前两小时之间的时间范围。如果 cpu 测量在该时间范围内至少有一个数据点,则 CQ 将向 average_idle 测量写入数据,用 100 填充任何无数据的 30m 间隔。但是,如果 cpu 测量在该两小时时间范围内没有数据,则 CQ 不会向 average_idle 测量写入任何结果。

CREATE CONTINUOUS QUERY "fruit_rollup" ON "mydb" RESAMPLE FOR 2h BEGIN
SELECT mean("usage_idle") INTO "average_idle" FROM "cpu" GROUP BY time(30m),cpu fill(100)
END

有关更多 InfluxDB 提示,请参阅我们的 常见问题解答 页面,并随时在 InfluxDB 用户组 中发布您的问题!

下一步是什么?