TL;DR InfluxDB技术技巧 - InfluxDB Kapacitor
作者:Regan Kuchan / 开发者
2016年5月26日
导航至
在这篇博文中,我们回顾了本周最有趣的InfluxDB Kapacitor和TICK-stack相关的问题、解决方案、教程和问答,这些问题、解决方案、教程和问答可能被您忽略了。
使用INTO查询保留标签
问题:我正在使用INTO
查询将数据移动到新的度量。InfluxDB表示已正确写入正确数量的点,但当我查询新度量中的数据时,我发现丢失了一个点。
在我的数据中,color
是一个标签,而name
是一个字段。
> SELECT * FROM "french_bulldogs"
name: french_bulldogs
---------------------
time color name
2016-05-25T00:05:00Z peach nugget
2016-05-25T00:05:00Z grey rumple
2016-05-25T00:10:00Z black prince
> SELECT * INTO "all_dogs" FROM "french_bulldogs"
name: result
------------
time written
1970-01-01T00:00:00Z 3
> SELECT * FROM "all_dogs"
name: all_dogs
--------------
time color name
2016-05-25T00:05:00Z grey rumple
2016-05-25T00:10:00Z black prince
nugget
去哪里了?
答案:如果您在INTO
中使用SELECT *
,InfluxDB会将当前度量中的任何标签转换为新度量中的字段。这可能导致InfluxDB覆盖先前由标签区分的点。
在您的情况下,当InfluxDB将数据写入all_dogs
时,会将color
从标签转换为字段。因为nugget
和rumple
具有相同的时间戳,且不再通过标签区分,所以InfluxDB将用rumple
点覆盖nugget
点。
使用GROUP BY *
在INTO
查询中保留标签作为标签
> SELECT "name" INTO "all_dogs" FROM "french_bulldogs" GROUP BY *
name: result
------------
time written
1970-01-01T00:00:00Z 3
> SELECT * FROM "all_dogs"
name: all_dogs
--------------
time color name
2016-05-25T00:05:00Z peach nugget
2016-05-25T00:05:00Z grey rumple
2016-05-25T00:10:00Z black prince
使用Kapacitor进行流式传输还是不进行流式传输?
问题:我正在使用Kapacitor将流数据与偏移的流数据连接起来,并将连接后的数据写回到InfluxDB。如果偏移量覆盖了一个长时间范围(例如,24小时),这会工作吗?Kapacitor能否在RAM中处理那么多的数据?
var current_data = stream
| from()
.measurement('sparkle_trees')
var previous_data = stream
| from()
.measurement('sparkle_trees')
| shift(24h)
current_data
|join(previous_data)
.tolerance(10s)
.as('current_data','previous_data')
|influxDBOut()
.database('enchanted_forest')
.retentionPolicy('default')
.measurement('joined_data')
回答:您的TICKscript将正常工作,但在实际中并不好。首先,每次您重新启动Kapacitor时,您必须等待24小时后才能进行任何连接。其次,您必须在RAM中缓冲24小时的数据;除非您有非常小的摄取速率,否则这是不切实际的。
我们建议使用批处理任务而不是流式任务。使用批处理任务,Kapacitor可以简单地查询旧数据,并在Kapacitor首次启动时立即开始处理连接。此外,Kapacitor只需要在RAM中适应单个批次的数据。
例如
var current_data = batch
| query('SELECT * FROM "enchanted_forest"."default"."sparkle_trees"')
.period(5m)
.every(5m)
var previous_data = batch
| query('SELECT * FROM "enchanted_forest"."default"."sparkle_trees"')
.period(5m)
.every(5m)
// Select data -24h from the current time
.offset(24h)
// Shift data to match current time
| shift(24h)
current_data
|join(previous_data)
.as('current_data','previous_data')
|influxDBOut()
.database('enchanted_forest')
.retentionPolicy('default')
.measurement('joined_data')
何时在查询中双引号标识符
问题:我已经成功将数据写入InfluxDB,但在查询数据时出现意外的错误
> INSERT monsters exists=true
> SELECT exists FROM monsters
ERR: error parsing query: found EXISTS, expected identifier, string, number, bool at line 1, char 8
回答:字段键exists
是InfluxQL关键字。如果标识符也是InfluxQL关键字,则必须在查询中双引号
> SELECT "exists" FROM monsters
name: monsters
--------------
time exists
2016-05-25T00:36:01.714188435Z true
2016-05-25T00:36:19.30227374Z true
请参阅我们的文档,获取InfluxQL关键字的完整列表。
有关更多InfluxDB技巧,请参阅我们的常见问题 页面,并在InfluxDB用户组中自由提问。