InfluxDB是一个由InfluxData开发的开源时序型数据库,由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。
地址:https://portal.influxdata.com/downloads/#influxdb(本文使用的是最新版1.8.1,刚好是在本文开始编写的前一天发布的;2.0在公测,暂不用)
在官网上提供了各个操作系统的安装包和安装方法,本文使用CentOS版本,如下:
SHA256:0144bea73498b1dce2e1760832a201e1294a53c4562350b704787c54cf683cea
https://dl.influxdata.com/influxdb/releases/influxdb-1.8.1_windows_amd64.zip
unzip influxdb-1.8.1_windows_amd64.zip
SHA256: 110038a658a792489fe441b6515d6d1dbf8e86411c185253f9f62838f90b8721
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.8.1.x86_64.rpm
sudo yum localinstall influxdb-1.8.1.x86_64.rpm
下载之后解压后,双击influxd.exe即可启动后台服务。
#sudo yum install influxdb 上一步已经通过yum安装好了,可以忽略此步安装,直接执行以下启动服务的命令即可
sudo service influxdb start
启动fluxdb的服务之后,输入influx
就可以进入cli界面。退出使用exit
# influx -precision rfc3339
Connected to http://localhost:8086 version 1.8.1
InfluxDB shell version: 1.8.1
>
说明:
8086
上,所以influx
默认也是连的本地的8086
端口,你可以通过influx --help
来看怎么修改默认值。-precision
参数表明了任何返回的时间戳的格式和精度,在上面的例子里,rfc3339
是让InfluxDB返回RFC339格式(YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ)的时间戳,如果不加,那么会显示一串数字的时间戳。CREATE DATABASE mydb
SHOW DATABASES
USE mydb
语法与mysql等传统数据库类似,在这里称为influxQL。
数据结构 | 含义 |
---|---|
database | 数据库 |
measurement | 数据库中的表 |
retention policy | 保存策略:让InfluxDB能够知道可以丢弃哪些数据,设置数据自动清除时间,从而更高效的处理数据 |
points | 表里面的一行数据 |
数据结构 | 含义 |
---|---|
time | 每个数据记录时间,是数据库中的主索引(会自动生成) |
fields | 各种记录值(没有索引的属性)也就是记录的值,至少有一个 |
tags | 各种有索引的属性 |
series | 表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来。 |
time时间戳,如果在插入数据的时候没有写时间戳,那么默认插入时间为当前系统时间。
当一条数据的time和tags完全相同时候,新数据会替换掉旧数据,旧数据则丢失。
tags 和time可以作为排序字段,field则不可以。
fields和tags的字段类型是由存入的第一条记录值决定的。
数据行的格式如下:
[,=...] =[,=...] [unix-nano-timestamp]
influxdb和传统数据库有些不一样,并不需要先创建表后再根据字段顺序和格式来插入数据。直接使用以下语句,相当于创建了表并写入了数据。
> insert cpu,host=serverA,region=us_west value=0.74 1594854900000
在所有查询操作之前需要用use database
命令指定在哪一个数据库下查询。具体测试如下:
# influx -precision rfc3339
Connected to http://localhost:8086 version 1.8.1
InfluxDB shell version: 1.8.1
> select * from cpu -- select * from mydb.cpu 或 select * from "mydb"."cpu"都会报下面的错
ERR: database name required
Warning: It is possible this error is due to not setting a database.
Please set a database with the command "use " .
> use mydb -- 当指定了库名之后就能正常查询
Using database mydb
> select * from "mydb"."cpu"
ERR: retention policy not found: mydb
> select * from cpu --也可以直接指定一个或多个field和tag,但必须查询至少一个field,因为tag只是辅助作用
name: cpu
time host region value
---- ---- ------ -----
2020-07-16T06:54:29.809600627Z serverA us_west 0.64
> select * from defalut.cpu -- 此处的defalut是mydb这个库默认使用的保留策略并不是库名!!!
name: cpu
time host region value
---- ---- ------ -----
2020-07-16T06:54:29.809600627Z serverA us_west 0.64
如果实在不想使用use,那么可以使用select * from mydb.defalut.cpu
(库名.存储策略.表名)进行查询。
influx还有一种特别的查询语法,SELECT "
,标识查询列属于哪一种类型,如下:
> select *::field from cpu -- 查询所有的field;*可以替换成具体的field
name: cpu
time value
---- -----
2020-07-16T06:54:29.809600627Z 0.64
> select *::tag from cpu -- 因为必须要指定至少一个field,所以此处查询不了
> select *::field,*::tag from cpu -- 查询所有的field和tag,相当于select * from cpu,此语法较少用到
name: cpu
time value host region
---- ----- ---- ------
2020-07-16T06:54:29.809600627Z 0.64 serverA us_west
InfluxDB的行协议是一种写入数据点到InfluxDB的文本格式。
一行Line Protocol表示InfluxDB中的一个数据点。它向InfluxDB通知点的measurement,tag set,field set和timestamp。以下代码块显示了行协议的示例,并将其分解为其各个组件:
weather,location=us-midwest temperature=82 1465839830100400200
| -------------------- -------------- |
| | | |
| | | |
+-----------+--------+-+---------+-+---------+
|measurement|,tag_set| |field_set| |timestamp|
+-----------+--------+-+---------+-+---------+
行协议的主要组件的数据类型:measurement,tag keys,tag values,field keys,field values和timestamp。其中measurement,tag keys,tag values,field keys始终是字符串。
field的value支持浮点,整数,字符串和布尔型。::
语法允许用户在查询中指定field的类型(可用作转换类型使用)。
语法
SELECT_clause <field_key>::<type> FROM_clause
如果查询试图把整数或者浮点数转换成字符串或者布尔型,InfluxDB目前不支持。
InfluxDB支持冲整数转到浮点,或者从浮点转到整数。
**Retention Policy (RP)**是InfluxDB数据架构的一部分,它描述了InfluxDB保存数据的时间。InfluxDB会比较服务器本地的时间戳和请求数据里的时间戳,并删除比你在RPs里面用DURATION
设置的更老的数据。一个数据库中可以有多个RPs但是每个数据库的RPs是唯一的。
值得注意的是,在创建数据库时,InfluxDB会自动创建一个名为autogen
有无限的保留时间。
语法
CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]
DURATION
:保存数据的时间,最短为一个小时,最长可以无限。如果需要设置无限,输入0
即可。
REPLICATION
:副本数。默认情况下,复制因子n
通常等于数据节点的数目。但是,如果有四个或多个数据节点,则默认复制因子n
是3。
SHARD DURATION
:碎片保留时间。碎片群的持续时间会根据此项来自动设置。设置的对应时间如下:
保留政策期限 | 碎片群持续时间 |
---|---|
< 2 days | 1小时 |
>=2天和<=6个月 | 一天 |
>6个月 | 7天 |
DEFAULT
:将新的保留策略设置为数据库的默认保留策略。此选项可选的。
语法
ALTER RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> SHARD DURATION <duration> DEFAULT
语法
DROP RETENTION POLICY <retention_policy_name> ON <database_name>
语法
SHOW RETENTION POLICIES [ON <database_name>]
SELECT_clause FROM_clause WHERE <conditional_expression> [(AND|OR) <conditional_expression> [...]]
where的语法与sql一致,不过在筛选字符串值的时候,需要用单引号将值括起来。如:
> select * from cpu where host ='serverA' -- 双引号或者无引号都查询不出
name: cpu
time host region value
---- ---- ------ -----
2020-07-16T06:54:29.809600627Z serverA us_west 0.64
语法:
SELECT_clause FROM_clause [WHERE_clause] GROUP BY [* | <tag_key>[,<tag_key]]
例子:
-- 此处的*是指聚合所有的tag,当然也可以写明一个或多个tag
> select * from cpu group by *
name: cpu
tags: host=serverA, region=us_west
time value
---- -----
2020-07-16T06:54:29.809600627Z 0.64
> select count(*) from cpu group by *
name: cpu
tags: host=serverA, region=us_west
time count_value
---- -----------
1970-01-01T00:00:00Z 1
语法:
SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(<time_interval>),[tag_key] [fill(<fill_option>)]
例子:
-- 此处并没有使用where做时间范围的筛选,但实际开发中建议筛选;如果需要聚合tag,可以加逗号再加tag字段
> select count(*) from cpu group by time(10m)
name: cpu
time count_value
---- -----------
2020-07-16T06:50:00Z 1 -- 请注意,此时间戳记的发生在查询时间范围最小值之前
2020-07-16T07:00:00Z 0
语法:
SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(<time_interval>,<offset_interval>),[tag_key] [fill(<fill_option>)]
time(,)
用例:
/**
* offset_interval,即偏移量;负数表示向前移动,正数表示向后移动。
*
**/
> select count(*) from cpu where time >= '2020-07-16T06:50:00Z' and time < '2020-07-16T07:20:00Z' group by time(5m,10m)
name: cpu
time count_value
---- -----------
2020-07-16T06:50:00Z 1
2020-07-16T06:55:00Z 0
2020-07-16T07:00:00Z 0
2020-07-16T07:05:00Z 0
2020-07-16T07:10:00Z 0
2020-07-16T07:15:00Z 0
2.3.2、fill()
填充不含数据的时间间隔的返回值。
fill_option包含以下四种参数值:
用例:
/* 没有使用fill */
> select count(*) from cpu where time >= '2020-07-16T06:50:00Z' and time < '2020-07-16T07:20:00Z' group by time(5m,10m)
name: cpu
time count_value
---- -----------
2020-07-16T06:50:00Z 1
2020-07-16T06:55:00Z 0
2020-07-16T07:00:00Z 0
2020-07-16T07:05:00Z 0
2020-07-16T07:10:00Z 0
2020-07-16T07:15:00Z 0
/* 使用fill(数字) 固定填写某个数值 */
> select count(*) from cpu where time >= '2020-07-16T06:50:00Z' and time < '2020-07-16T07:20:00Z' group by time(5m,10m) fill(10)
name: cpu
time count_value
---- -----------
2020-07-16T06:50:00Z 1
2020-07-16T06:55:00Z 10
2020-07-16T07:00:00Z 10
2020-07-16T07:05:00Z 10
2020-07-16T07:10:00Z 10
2020-07-16T07:15:00Z 10
/*
* 使用fill(linear),线性插值。值得注意的是,如果在时间范围内,只有一个值,那么不会填充数值。
* 在做监控预警预测系统的时候,可以使用此方法来做线性预测
*/
> select count(*) from cpu where time >= '2020-07-16T06:50:00Z' and time < '2020-07-16T07:20:00Z' group by time(5m,10m) fill(linear)
name: cpu
time count_value
---- -----------
2020-07-16T06:50:00Z 1
2020-07-16T06:55:00Z
2020-07-16T07:00:00Z
2020-07-16T07:05:00Z
2020-07-16T07:10:00Z
2020-07-16T07:15:00Z
/* 使用fill(none)去除掉没有值的行 */
> select count(*) from cpu where time >= '2020-07-16T06:50:00Z' and time < '2020-07-16T07:20:00Z' group by time(5m,10m) fill(none)
name: cpu
time count_value
---- -----------
2020-07-16T06:50:00Z 1
/* 使用fill(previous)用前一个值去填充没有值的行 */
> select count(*) from cpu where time >= '2020-07-16T06:50:00Z' and time < '2020-07-16T07:20:00Z' group by time(5m,10m) fill(previous)
name: cpu
time count_value
---- -----------
2020-07-16T06:50:00Z 1
2020-07-16T06:55:00Z 1
2020-07-16T07:00:00Z 1
2020-07-16T07:05:00Z 1
2020-07-16T07:10:00Z 1
2020-07-16T07:15:00Z 1
语法:
SELECT_clause INTO <measurement_name> FROM_clause [WHERE_clause] [GROUP_BY_clause]
用例:
/* 重命名数据库或者迁移到某一个measurement
* influx中是不能直接重命名数据库,所以需要用到into来进行数据库迁移来实现数据库的重命名
* 注意的是,使用时需要先创建要导入的数据库以及默认的存储策略
* influx在创建数据库时自动生成一个"autogen"策略
* mydb"../.*/表示将所有存储策略的数据都转移;GROUP BY *表示将所有的tag相关的数据都保存,如果不加,会重新建立tag
* 当移动大量数据时,我们建议在WHERE子句中顺序运行不同measurement的INTO查询并使用时间边界。防止内存不足。
*/
> create database copy_mydb_database
> SELECT * INTO "copy_mydb_database"."autogen".:MEASUREMENT FROM "mydb"../.*/ GROUP BY *
name: result
time written
---- -------
1970-01-01T00:00:00Z 2
主要用于返回最新的一个点。当然可以不需要desc,默认为降序。这点和sql语法是一致的,这里不做赘述。
limit与mysql中的limit用法一致。这里主要讲slimit。
SLIMIT子句
语义:SLIMIT
返回指定measurement的前个series中的每一个点。
语法:
SELECT_clause [INTO_clause] FROM_clause [WHERE_clause] GROUP BY *[,time(<time_interval>)] [ORDER_BY_clause] SLIMIT <N>
InfluxQL是一种类似SQL的查询语言,用于与InfluxDB中的数据进行交互。下面我们要介绍一些有用的查询schema的语法:
返回当前实例上的所有的数据库。
语法
SHOW DATABASES
用例:
> show databases
name: databases
name
----
_internal
mydb
db01
copy_mydb_database
返返回指定数据库的保留策略的列表。
语法
SHOW RETENTION POLICIES [ON <database_name>]
用例:
-- 如果不指定库名,那么在使用之前先使用use database_name指定库
> SHOW RETENTION POLICIES on mydb
name duration shardGroupDuration replicaN default
---- -------- ------------------ -------- -------
autogen 0s 168h0m0s 1 false
defalut 720h0m0s 24h0m0s 1 true
two_hours 2h0m0s 1h0m0s 1 false
返回指定数据库的series列表。
语法
SHOW SERIES [ON <database_name>] [FROM_clause] [WHERE <tag_key> <operator> [ '' | <regular_expression>]] [LIMIT_clause] [OFFSET_clause]
用例:
> SHOW SERIES
key
---
cpu,host=serverA,region=us_west
cpu,host=serverB,region=us_east
cpu2
返回指定数据库的measurement列表。
语法
SHOW MEASUREMENTS [ON <database_name>] [WITH MEASUREMENT <regular_expression>] [WHERE <tag_key> <operator> ['' | <regular_expression>]] [LIMIT_clause] [OFFSET_clause]
用例:
/* 加了子句: offset 1将结果偏移了一位,所以cpu没有显示 */
> SHOW MEASUREMENTS ON mydb WITH MEASUREMENT =~ /cp.*/ limit 2 offset 1
name: measurements
name
----
cpu2
返回指定数据库的tag key列表。
语法
SHOW TAG KEYS [ON <database_name>] [FROM_clause] [WHERE <tag_key> <operator> ['' | <regular_expression>]] [LIMIT_clause] [OFFSET_clause]
用例:
> show tag keys on mydb from cpu limit 1 offset 1
name: cpu
tagKey
------
region
返回数据库中指定tag key的tag value列表。
语法
SHOW TAG VALUES [ON <database_name>][FROM_clause] WITH KEY [ [<operator> "" | <regular_expression>] | [IN ("" ,")]] [WHERE <tag_key> <operator> ['' | <regular_expression>]] [LIMIT_clause] [OFFSET_clause]
用例:
/*
* 该语句可以加很多子句进行条件筛选,值得注意的是WITH子句是必须的
* 以下where子句表示tag字段region的value不为空
*/
> show tag values on mydb with key in ("host","region") WHERE "region" =~ /./ LIMIT 3
name: cpu
key value
--- -----
host serverA
host serverB
region us_east
返回field key以及其field value的数据类型。
语法
SHOW FIELD KEYS [ON <database_name>] [FROM <measurement_name>]
用例:
> SHOW FIELD KEYS on mydb from cpu
name: cpu
fieldKey fieldType
-------- ---------
value float
InfluxDB的数据保留策略,数据超过保存策略里指定的时间之后,就会被删除。 但是如果我们不想完全将这些数据删除掉,就需要连续查询(Continuous Queries)的帮助了。 连续查询主要用在将数据归档,以降低系统空间的占用率,主要是以降低精度为代价。
CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
BEGIN
<cq_query>
END
在cq_query中可以设置成定时将计算的结果保存在另一个表中。
CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
RESAMPLE EVERY <interval> FOR <interval>
BEGIN
<cq_query>
END
RESAMPLE EVERY :指定执行的频次,如RESAMPLE EVERY 30m表示30分钟执行一次。
RESAMPLE FOR :指定时间范围,如RESAMPLE FOR 60m表示30分钟执行一次。
如果是两个同时写,如RESAMPLE EVERY 30m FOR 60m,那么表示每30分钟执行一次60分钟内的数据计算。
这里值得注意的是,如果此时在
本文的撰写背景是由于公司的业务扩展,个人需要学习应用技术。本文主要用在学习交流目的,如果有错误之处,请在评论区指出,谢谢。