行协议
InfluxDB的行协议是一种写入数据点到InfluxDB的文本格式。必须要是这样的格式的数据点才能被Influxdb解析和写入成功,当然除非你使用一些其他服务插件。
使用虚构的温度数据,本页面介绍了行协议。 它涵盖:
语法
数据类型
引号
特殊字符和关键字
最后一节,将数据写入InfluxDB,介绍如何将数据存入InfluxDB,以及InfluxDB如何处理行协议重复问题。
语法
一行Line Protocol表示InfluxDB中的一个数据点。它向InfluxDB通知点的measurement,tag set,field set和timestamp。以下代码块显示了行协议的示例,并将其分解为其各个组件:
measurement
你想要写入数据的measurement,这在行协议中是必需的,例如这里的measurement是weather
。
Tag set
你想要数据点中包含的tag,tag在行协议里是可选的。注意measurement和tag set是用不带空格的逗号分开的。
用不带空格的=
来分割一组tag的键值:
多组tag直接用不带空格的逗号分开:
例如上面的tag set由一个tag组成location=us-midwest
,现在加另一个tag(season=summer
),就变成了这样:
空格1
分离measurement和field set,或者如果您使用数据点包含tag set,则使用空格分隔tag set和field set。行协议中空格是必需的。
没有tag set的有效行协议:
Field set
每个数据点在行协议中至少需要一个field。使用无空格的=
分隔field的键值对:
多组field直接用不带空格的逗号分开:
例如上面的field set由一个field组成temperature=82
,现在加另一个field(bug_concentration=98
),就变成了这样:
空格2
使用空格分隔field set和可选的时间戳。如果你包含时间戳,则行协议中需要空格。
Timestamp
数据点的时间戳记以纳秒精度Unix时间。行协议中的时间戳是可选的。 如果没有为数据点指定时间戳,InfluxDB会使用服务器的本地纳秒时间戳。
在这个例子中,时间戳记是1465839830100400200
(这就是RFC6393格式的2016-06-13T17:43:50.1004002Z
)。下面的行协议是相同的数据点,但没有时间戳。当InfluxDB将其写入数据库时,它将使用您的服务器的本地时间戳而不是2016-06-13T17:43:50.1004002Z
。
使用HTTP API来指定精度超过纳秒的时间戳,例如微秒,毫秒或秒。我们建议使用最粗糙的精度,因为这样可以显着提高压缩率。 有关详细信息,请参阅[API参考]。
小贴士: 使用网络时间协议(NTP)来同步主机之间的时间。InfluxDB使用主机在UTC的本地时间为数据分配时间戳; 如果主机的时钟与NTP不同步,写入InfluxDB的数据的时间戳可能不正确。
数据类型
本节介绍行协议的主要组件的数据类型:measurement,tag keys,tag values,field keys,field values和timestamp。
其中measurement,tag keys,tag values,field keys始终是字符串。
注意:因为InfluxDB将tag value存储为字符串,所以InfluxDB无法对tag value进行数学运算。此外,InfluxQL函数不接受tag value作为主要参数。 在设计架构时要考虑到这些信息。
Field value可以是整数、浮点数、字符串和布尔值:
浮点数 —— 默认是浮点数,InfluxDB假定收到的所有field value都是浮点数。 以浮点类型存储上面的
82
:整数 —— 添加一个
i
在field之后,告诉InfluxDB以整数类型存储: 以整数类型存储上面的82
:字符串 —— 双引号把字段值引起来表示字符串: 以字符串类型存储值
too warm
:布尔型 —— 表示TRUE可以用
t
,T
,true
,True
,TRUE
;表示FALSE可以用f
,F
,false
,False
或者FALSE
: 以布尔类型存储值true
:
在measurement中,field value的类型在分片内不会有差异,但在分片之间可能会有所不同。例如,如果InfluxDB尝试将整数写入到与浮点数相同的分片中,则写入会失败:
但是,如果InfluxDB将整数写入到一个新的shard中,虽然之前写的是浮点数,那依然可以写成功:
引号
本节涵盖何时不要和何时不要在行协议中使用双(“
)或单('
)引号。
时间戳不要双或单引号。下面这是无效的行协议。 例:
field value不要单引号,即时是字符串类型。下面这是无效的行协议。 例:
measurement名称,tag keys,tag value和field key不用单双引号。InfluxDB会假定引号是名称的一部分。例如:
查询数据中的"weather"
,你需要为measurement名称中的引号转义:
当field value是整数,浮点数或是布尔型时,不要使用双引号,不然InfluxDB会假定值是字符串类型:
当Field value是字符串时,使用双引号:
特殊字符和关键字
特殊字符
对于tag key,tag value和field key,始终使用反斜杠字符\来进行转义:
逗号
,
:
等号
=
:
空格:
对于measurement,也要反斜杠\来转义。
逗号
,
:
空格:
字符串类型的field value,也要反斜杠\来转义。
双引号
"
:
行协议不要求用户转义反斜杠字符\。所有其他特殊字符也不需要转义。例如,行协议处理emojis没有问题:
关键字
行协议接受InfluxQL关键字作为标识符名称。一般来说,我们建议避免在schema中使用InfluxQL关键字,因为它可能会在查询数据时引起混淆。
写数据到InfluxDB
写入数据的方法
HTTP API
使用HTTP API将数据写入InfluxDB。 向/write
端点发送POST
请求,并在请求主体中提供您的行协议:
CLI
使用InfluxDB的命令行界面(CLI)将数据写入InfluxDB。启动CLI,使用相关数据库,并将INSERT
放在行协议之前:
你还可以使用CLI从文件导入行协议。
重复数据
一个点由measurement名称,tag set和timestamp唯一标识。如果您提交具有相同measurement,tag set和timestamp,但具有不同field set的行协议,则field set将变为旧field set与新field set的合并,并且如果有任何冲突以新field set为准。
Last updated
Was this helpful?