InfluxDB 学习

原文: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,其主键索引总是时间戳。tagfield是在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

一个measurementcputaghostregionvalue值为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路径,参数qCREATE 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格式的时间,可以在请求参数里设置epoch参数,其中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是唯一的。

转载于:https://www.cnblogs.com/i6010/articles/11589380.html

你可能感兴趣的:(InfluxDB 学习)