原文:https://cloud.tencent.com/developer/article/1468894
InfluxDB 学习
安装
brew install influxdb
启动
influxd -config /usr/local/etc/influxdb.conf
入门
$ influx -precision rfc3339
Connected to http://localhost:8086 version 1.2.x InfluxDB shell 1.2.x >
- InfluxDB的HTTP接口默认起在8086上,所以inlux默认也是连的本地的8086端口,你可以通过influx --help来看怎么修改默认值。
- -precision参数表明了任何返回的时间戳的格式和精度,在上面的例子里,rfc3339是让InfluxDB返回RFC339格式(YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ)的时间戳。
用exit 退出命令行。
创建数据库
CREATE DATABASE -name>
例如:
CREATE DATABASE mydb
查看数据库
SHOW DATABASES
系统自带的_internal数据库。
- _internal数据库是用来存储InfluxDB内部的实时监控数据的。
> show databases
name: databases
name
----
_internal
mydb
查看表
show measurements
使用数据库
USE -name>
如:
> USE mydb
Using database mydb
读写数据
现在我们已经有了一个数据库,那么InfluxDB就可以开始接收读写了。
InfluxDB里存储的数据被称为时间序列数据
时序数据有零个或多个数据点,每一个都是一个指标值。
数据点包括time
(一个时间戳),measurement
(例如cpu_load),至少一个k-v格式的field
(也即指标的数值例如 “value=0.64”或者“temperature=21.2”),零个或多个tag
,其一般是对于这个指标值的元数据(例如“host=server01”, “region=EMEA”, “dc=Frankfurt)。
measurement
类比于SQL里面的table,其主键索引总是时间戳。tag
和field
是在table里的其他列,tag是被索引起来的,field没有。
在InfluxDB里,你可以有几百万的measurements,你不用事先定义数据的scheme,并且null值不会被存储。
将数据点写入InfluxDB,只需要遵守如下的行协议:
>[,-key>=-value>...] -key>=-value>[,-key>=-value>...] [unix-nano-timestamp]
例如
cpu,host=serverA,region=us_west value=0.64
使用CLI插入单条的时间序列数据到InfluxDB中,用INSERT
后跟数据点:
INSERT cpu,host=serverA,region=us_west value=0.64
一个measurement
为cpu
,tag
是host
和region
,value
值为0.64
的数据点被写入了InfluxDB中。
> SELECT "host", "region", "value" FROM "cpu" name: cpu time host region value ---- ---- ------ ----- 2019-04-16T02:14:49.279748Z serverA us_west 0.64
说明:我们在写入的时候没有包含时间戳,当没有带时间戳的时候,InfluxDB会自动添加本地的当前时间作为它的时间戳。
支持golang样式的正则
> SELECT * FROM /.*/ LIMIT 1 -- > SELECT * FROM "cpu_load_short" -- > SELECT * FROM "cpu_load_short" WHERE "value" > 0.9
使用
写入数据
向InfluxDB写数据的方式,包括命令行、客户端还有一些像Graphite有一样数据格式的插件
使用HTTP接口创建数据库
使用POST
方式发送到URL的/query
路径,参数q
为CREATE DATABASE
curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE mydb"
使用HTTP接口写数据
通过HTTP接口POST
数据到/write
路径是我们往InfluxDB写数据的主要方式
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'
measurement为cpu_load_short,tag的key为host和region,对应tag的value是server01和us-west,field的key是value,对应的数值为0.64,而时间戳是1434055562000000000。
POST的请求体我们称之为Line Protocol,包含了你希望存储的时间序列数据。它的组成部分有measurement,tags,fields和timestamp。measurement是InfluxDB必须的, 严格地说,tags是可选的,但是对于大部分数据都会包含tags用来区分数据的来源,让查询变得容易和高效。 tag的key和value都必须是字符串。fields的key也是必须的,而且是字符串,默认情况下field的value是float类型的。 timestamp在这个请求行的最后,是一个从1/1/1970 UTC开始到现在的一个纳秒级的Unix time,它是可选的,如果不传, InfluxDB会使用服务器的本地的纳米级的timestamp来作为数据的时间戳,注意无论哪种方式,在InfluxDB中的timestamp只能是UTC时间。
同时写入多个点
同时发送多个数据点到多个series(在InfluxDB中measurement加tags组成了一个series),可以用新的行来分开这些数据点。这种批量发送的方式可以获得更高的性能。
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server02 value=0.67 cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257 cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257'
写了三个数据点到mydb数据库中。第一个点属于series其measurement为cpu_load_short,tag是host=server02, timestamp是server本地的时间戳;第二个点同样是measurement为cpu_load_short, 但是tag为host=server02,region=us-west,且有明确timestamp为1422568543702900257的series; 第三个数据点和第二个的timestamp是一样的,但是series不一样,其measurement为cpu_load_short, tag为direction=in,host=server01,region=us-west。
写入文件中的数据
可以通过curl的@filename来写入文件中的数据,且这个文件里的数据的格式需要满足InfluxDB那种行的语法。
正确的文件(cpu_data.txt)的例子
cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257 cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257
把cpu_data.txt里的数据写入mydb数据库
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary @cpu_data.txt
如果你的数据文件的数据点大于5000时,你必须把他们拆分到多个文件再写入InfluxDB。 因为默认的HTTP的timeout的值为5秒,虽然5秒之后,InfluxDB仍然会试图把这批数据写进去,但是会有数据丢失的风险
无模式设计
InfluxDB是一个无模式(schemaless)的数据库,你可以在任意时间添加measurement,tags和fields。注意:如果你试图写入一个和之前的类型不一样的数据(例如,filed字段之前接收的是数字类型,现在写了个字符串进去),那么InfluxDB会拒绝这个数据。
对于REST的一个说明
InfluxDB API并不是RESTful的。InfluxDB也只提供了三个API。
HTTP返回值
- 2xx:如果你写了数据后收到HTTP 204 No Content,说明写入成功了!
- 4xx:表示InfluxDB不知道你发的是什么鬼。
- 5xx:系统过载或是应用受损。
查询数据
使用HTTP接口查询数据
过发送一个GET
请求到/query
路径,并设置URL的db参数为目标数据库,设置URL参数q
为查询语句。
curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
多个查询
在一次API调用中发送多个InfluxDB的查询语句,可以简单地使用分号;
分隔每个查询,
curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west';SELECT count(\"value\") FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
其他可选参数
时间戳格式
在InfluxDB中的所有数据都是存的UTC时间,时间戳默认返回RFC3339格式的纳米级的UTC时间,例如2015-08-04T19:05:14.318570484Z
,如果你想要返回Unix格式的时间,可以在请求参数里设置epoc
h参数,其中epoch可以是[h,m,s,ms,u,ns]
之一。例如返回一个秒级的epoch:
curl -G 'http://localhost:8086/query' --data-urlencode "db=mydb" --data-urlencode "epoch=s" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
{"results":[{"statement_id":0,"series":[{"name":"cpu_load_short","columns":["time","value"],"values":[[1422568543,2],[1422568543,0.55]]}]}]}
认证
InfluxDB里面的认证默认是关闭的,
最大行限制
可选参数max-row-limit
允许使用者限制返回结果的数目,以保护InfluxDB不会在聚合结果的时候导致的内存耗尽。
在1.2.0和1.2.1版本中,InfluxDB默认会把返回的数目截断为10000条,如果有超过10000条返回,那么返回体里面会包含一个"partial":true的标记。该默认设置可能会导致Grafana面板出现意外行为,如果返回值大于10000时,这个面板就会看到截断/部分数据。
在1.2.2版本中,max-row-limit参数默认被设置为了0,这表示说对于返回值没有限制。
这个最大行的限制仅仅作用于非分块(non-chunked)的请求中,分块(chunked)的请求还是返回无限制的数据。
分块(chunking)
可以设置参数chunked=true开启分块,使返回的数据是流式的batch,而不是单个的返回。返回结果可以按10000数据点被分块,为了改变这个返回最大的分块的大小,可以在查询的时候加上chunk_size参数,例如返回数据点是每20000为一个批次。
curl -G 'http://localhost:8086/query' --data-urlencode "db=deluge" --data-urlencode "chunked=true" --data-urlencode "chunk_size=20000" --data-urlencode "q=SELECT * FROM liters"
采样和数据保留
InfluxDB提供了两个特性——连续查询(Continuous Queries简称CQ)和保留策略(Retention Policies简称RP),分别用来处理数据采样和管理老数据的。
Continuous Query (CQ)是在数据库内部自动周期性跑着的一个InfluxQL的查询,CQs需要在SELECT语句中使用一个函数,并且一定包括一个GROUP BY time()语句。
Retention Policy (RP)是InfluxDB数据架构的一部分,它描述了InfluxDB保存数据的时间。InfluxDB会比较服务器本地的时间戳和你数据的时间戳,并删除比你在RPs里面用DURATION
设置的更老的数据。单个数据库中可以有多个RPs但是每个数据的RPs是唯一的。