命令行工具
使用CMD定位到安装目录,运行influxd即可启动InfluxDB数据库:
influxd
InfluxDB默认使用的是8086端口,如果influxd启动后就结束,检查是否有类似下面的输出,如果是很可能是端口被占用了:
run: open server: open service: listen tcp :8086: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
influxDB启动成功后,可以使用influx命令行工具进行功能测试,例如:
influx
Connected to http://localhost:8086 version 1.7.9
InfluxDB shell version: 1.7.9
>
这样就已经连接成功,并告诉我们数据库的监听端口是8086。
数据库命令
查看所有数据库
show databases
name: databases
name
----
_internal
_internal数据库是用来存储InfluxDB内部的实时监控数据的
添加数据库
create database mydb
切换当前数据库
use mydb
Using database mydb
删除数据库
drop database mydb
查看所有的measurement
> show measurements
name: measurements
name
----
cpu
数据格式
现在我们已经有了一个数据库,那么InfluxDB就可以开始接收读写了。
首先对数据存储的格式来个入门介绍。InfluxDB里存储的数据被称为时间序列数据,其包含一个数值,就像CPU的load值或是温度值类似的。时序数据有零个或多个数据点,每一个都是一个指标值。数据点包括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没有普通RDBMS的建表语句,它直接通过写入数据的形式自动创建measurement。
写入数据
将数据点写入InfluxDB,只需要遵守如下的行协议:
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
其中tag key、tag value、field key会以字符串形式保存,field value可以为字符串、整数、浮点数、布尔值保存。最后的unix-nano-timestamp是一个时间戳,如果不指定InfluxDB默认会取当前时间。
例如:
> insert cpu,host=deanpc temperature=56.5,rate=12.2 1577754163702229301
> select * from cpu
name: cpu
time host rate temperature
---- ---- ---- -----------
1577754163702229301 deanpc 12.2 56.5
读取数据
> select * from cpu
name: cpu
time host rate temperature
---- ---- ---- -----------
1577754163702229301 deanpc 12.2 56.5
更新数据
InfluxDB没有提供传统RDBMS的Update语句,如果需要修改数据,可以使用INSERT语句来实现,修改数据的时候,指定时间戳,InfluxDB会覆盖原来的数据:
> insert cpu,host=deanpc temperature=34.5 1577754163702229301
> select * from cpu
name: cpu
time host rate temperature
---- ---- ---- -----------
1577754163702229301 deanpc 12.2 34.5
会发现,原来增加进去的数据就被更新了。但如果,执行下面的语句:
> insert cpu temperature=34.5 1577754163702229301
> select * from cpu
name: cpu
time host rate temperature
---- ---- ---- -----------
1577754163702229301 34.5
1577754163702229301 deanpc 12.2 34.5
会发现,并没有更新原来的数据,而是变成了新增。
在InfluxDB中,measurement中每条记录为一个point,可以类比成传统RMDBS的行。point它是由具有相同timestamp的相同series的field组成的集合。而series是共同retention policy,measurement和tag set的集合。在上面的insert或select的时候,没有指定retention policy时,默认是autogen。
所以如果想更新数据,更新的insert语句需要和新增数据时的retention policy、measurement、tag set、timestamp一致。可以理解InfluxDB中每个Point的主键都是复合主键。也就是,只能更新field set的内容,而不能更新tag set的内容。
删除数据
> select * from cpu
name: cpu
time host rate temperature
---- ---- ---- -----------
1577754163702229301 34.5
1577754163702229301 deanpc 12.2 34.5
> delete from cpu where time = 1577754163702229301
> select * from cpu
>
上面的例子,数据删除后,select返回的结果集是空的,此时measurement已不存在了:
> show measurements
>
即返回的结果集合也为空。