influxDB学习笔记--理论篇

一、概念

InfluxDB是一个由InfluxData开发的开源时序型数据库,由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。

二、下载和安装

1.下载

地址:https://portal.influxdata.com/downloads/#influxdb(本文使用的是最新版1.8.1,刚好是在本文开始编写的前一天发布的;2.0在公测,暂不用)

在官网上提供了各个操作系统的安装包和安装方法,本文使用CentOS版本,如下:

windows 64位

SHA256:0144bea73498b1dce2e1760832a201e1294a53c4562350b704787c54cf683cea

https://dl.influxdata.com/influxdb/releases/influxdb-1.8.1_windows_amd64.zip
unzip influxdb-1.8.1_windows_amd64.zip

RedHat & CentOS

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

2.启动

windows 64位

下载之后解压后,双击influxd.exe即可启动后台服务。

RedHat & CentOS

#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
>

说明:

  • InfluxDB的HTTP接口默认起在8086上,所以influx默认也是连的本地的8086端口,你可以通过influx --help来看怎么修改默认值。
  • -precision参数表明了任何返回的时间戳的格式和精度,在上面的例子里,rfc3339是让InfluxDB返回RFC339格式(YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ)的时间戳,如果不加,那么会显示一串数字的时间戳。
  • 学习文档可以参考官方文档https://docs.influxdata.com/influxdb/v1.8/introduction/get-started/

1、创建数据库

CREATE DATABASE mydb
SHOW DATABASES
USE mydb

语法与mysql等传统数据库类似,在这里称为influxQL。

2、数据结构

2.1、InfluxDB基本数据结构

数据结构 含义
database 数据库
measurement 数据库中的表
retention policy 保存策略:让InfluxDB能够知道可以丢弃哪些数据,设置数据自动清除时间,从而更高效的处理数据
points 表里面的一行数据

2.2、points的数据结构介绍

数据结构 含义
time 每个数据记录时间,是数据库中的主索引(会自动生成)
fields 各种记录值(没有索引的属性)也就是记录的值,至少有一个
tags 各种有索引的属性
series 表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来。

2.3、注意点

  • time时间戳,如果在插入数据的时候没有写时间戳,那么默认插入时间为当前系统时间。

  • 当一条数据的time和tags完全相同时候,新数据会替换掉旧数据,旧数据则丢失。

  • tags 和time可以作为排序字段,field则不可以。

  • fields和tags的字段类型是由存入的第一条记录值决定的。

3、插入数据

数据行的格式如下:

[,=...] =[,=...] [unix-nano-timestamp]

influxdb和传统数据库有些不一样,并不需要先创建表后再根据字段顺序和格式来插入数据。直接使用以下语句,相当于创建了表并写入了数据。

> insert cpu,host=serverA,region=us_west value=0.74 1594854900000

4、查询数据

在所有查询操作之前需要用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 ""::field,""::tag,标识查询列属于哪一种类型,如下:

> 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

四、行协议

1、概念

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|
+-----------+--------+-+---------+-+---------+

2、数据类型

行协议的主要组件的数据类型: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支持冲整数转到浮点,或者从浮点转到整数。

五、数据存储策略

1、概念

**Retention Policy (RP)**是InfluxDB数据架构的一部分,它描述了InfluxDB保存数据的时间。InfluxDB会比较服务器本地的时间戳和请求数据里的时间戳,并删除比你在RPs里面用DURATION设置的更老的数据。一个数据库中可以有多个RPs但是每个数据库的RPs是唯一的。

值得注意的是,在创建数据库时,InfluxDB会自动创建一个名为autogen有无限的保留时间。

2、创建策略

语法

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:将新的保留策略设置为数据库的默认保留策略。此选项可选的。

3、修改策略

语法

ALTER RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> SHARD DURATION <duration> DEFAULT

4、删除策略

语法

DROP RETENTION POLICY <retention_policy_name> ON <database_name>

5、查询策略

语法

SHOW RETENTION POLICIES [ON <database_name>]

六、查询子句

1、WHERE子句

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

2、GROUP BY子句

2.1、GROUP BY tags

语法:

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

2.2、GROUP BY时间间隔

语法:

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

2.3、GROUP BY高级语法

语法:

SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(<time_interval>,<offset_interval>),[tag_key] [fill(<fill_option>)]
2.3.1、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包含以下四种参数值:

  • 任一数值:用这个数字返回没有数据点的时间间隔
  • linear:返回没有数据的时间间隔的线性插值结果。
  • none: 不返回在时间间隔里没有点的数据
  • previous:返回时间隔间的前一个间隔的数据

用例:

/* 没有使用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

2.4、INTO子句

语法:

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

2.5、ORDER BY TIME DESC

主要用于返回最新的一个点。当然可以不需要desc,默认为降序。这点和sql语法是一致的,这里不做赘述。

2.6、LIMIT和SLIMIT子句

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>

七、schema查询语法

InfluxQL是一种类似SQL的查询语言,用于与InfluxDB中的数据进行交互。下面我们要介绍一些有用的查询schema的语法:

1、SHOW DATABASES

返回当前实例上的所有的数据库。

语法

SHOW DATABASES

用例:

> show databases
name: databases
name
----
_internal
mydb
db01
copy_mydb_database

2、SHOW RETENTION POLICIES

返返回指定数据库的保留策略的列表。

语法

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

3、SHOW SERIES

返回指定数据库的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

4、SHOW MEASUREMENTS

返回指定数据库的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

5、SHOW TAG KEYS

返回指定数据库的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

6、SHOW TAG VALUES

返回数据库中指定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

7、SHOW FIELD KEYS

返回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)的帮助了。 连续查询主要用在将数据归档,以降低系统空间的占用率,主要是以降低精度为代价。

1、基本语法

CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
BEGIN
  <cq_query>
END

在cq_query中可以设置成定时将计算的结果保存在另一个表中。

2、高级语法

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分钟内的数据计算。

这里值得注意的是,如果此时在中使用了GROUP BY time duration,那么FOR定义的duration 必须大于或者等于GROUP BY指定的time duration,不然就会报错。反过来,如果EVERY定义的duration 大于GROUP BY指定的time duration,那么执行将按照EVERY定义的duration来执行。

本文的撰写背景是由于公司的业务扩展,个人需要学习应用技术。本文主要用在学习交流目的,如果有错误之处,请在评论区指出,谢谢。

你可能感兴趣的:(大数据,influxDB,数据库)