参考链接:
InfluxDB系列教程
时序数据库技术体系 – 初识InfluxDB
influxDB 是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。类似的数据库有Elasticsearch、Graphite等
特色:
influxDB 安装:
# OS X(Via Homebrew)
brew update
brew install influxdb
# Ubuntu(64 bit)
wget https://dl.influxdata.com/influxdb/releases/influxdb_0.13.0_amd64.deb
sudo dpkg -i influxdb_0.13.0_amd64.deb
# Docker Image
docker pull influxdb
> sudo service influxdb start
客户端登录
Influxdb中的概念 | 传统数据库中的概念 |
---|---|
database | 数据库 |
measurement | 数据库中的表 |
points | 表里面的一行数据 |
Point
Point由时间戳(timestamp)、数据(field)、标签(tags)组成。
Point相当于传统数据库里的一行数据,如下表所示:
Point属性 | 传统数据库中的概念 |
---|---|
time | 每个数据记录时间,是数据库中的主索引(会自动生成) |
fields | 各种记录值(没有索引的属性)也就是记录的值:温度, 湿度 |
tags | 各种有索引的属性:地区,海拔 |
Series
Series的官方解释为:一个共享相同Retention Policy, measurement和tag set的数据集。换句话说,Series就是一个数据集,这个数据集由RP,measurement和tag set共同确定。
例子:measurement: census
time | location | scientist | butterflies | honeybees |
---|---|---|---|---|
2015-08-18T00:00:00Z | 1 | langstroth | 12 | 23 |
2015-08-18T00:00:00Z | 1 | perpetua | 1 | 30 |
2015-08-18T00:06:00Z | 1 | langstroth | 11 | 28 |
2015-08-18T00:06:00Z | 1 | perpetua | 3 | 28 |
2015-08-18T05:54:00Z | 2 | langstroth | 2 | 11 |
2015-08-18T06:00:00Z | 2 | langstroth | 1 | 10 |
2015-08-18T06:06:00Z | 2 | perpetua | 8 | 23 |
2015-08-18T06:12:00Z | 2 | perpetua | 7 | 22 |
它的series为:
Arbitrary series number | Retention policy | Measurement | Tag set |
---|---|---|---|
series 1 | default | census | location = 1,scientist = langstroth |
series 2 | default | census | location = 2,scientist = langstroth |
series 3 | default | census | location = 1,scientist = perpetua |
series 4 | default | census | location = 2,scientist = perpetua |
如同MYSQL一样,InfluxDB提供多数据库支持,对数据库的操作也与MYSQL相同。
# 显示数据库
> SHOW DATABASES
# 新建数据库
> CREATE DATABASE <db name>
# 删除数据库
> DROP DATABASE <db name>
# 使用数据库
> USE <db name>
# 显示表
> SHOW <measurement name>
# 新建表
> INSERT <measurement name>, <tag key>=<tag value> <field key>=<field value> [timestamp]
# 删除表
> DROP MEASUREMENT <measurement name>
# 增加数据
> INSERT <measurement name>, <tag key>=<tag value>,<tag key>=<tag value> <field key>=<field value>,<field key>=<field value> [timestamp]
InfluxDB是时序型数据库,没有提供修改和删除数据的方法,但是数据删除可以通过influxDB的数据保存策略实现(Retention Policies)
InfluxDB的数据保留策略(RP) 用来定义数据在InfluxDB中存放的时间,或者定义保存某个期间的数据。
注意:
目的:控制数据库中的数据量,因为influxDB中没有删除数据的操作
Shard Group是influxDB中的一个重要的逻辑概念,它的意思是将数据按照时间进行分区,每一个Shard只能存储特定时间段内的数据。不同Shard Group对应的时间段不会重合。比如2017年9月份的数据落在Shard Group0上,2017年10月份的数据落在Shard Group1上。
每个Shard Group对应多长时间是通过Retention Policy中字段”SHARD DURATION”指定的,如果没有指定,也可以通过Retention Duration(数据过期时间)计算出来,两者的对应关系为:
使用Shard Group的原因:
将数据按照时间分割成小的粒度会使得数据过期实现非常简单,InfluxDB中数据过期删除的执行粒度就是Shard Group,系统会对每一个Shard Group判断是否过期,而不是一条一条记录判断。
实现了将数据按照时间分区的特性。将时序数据按照时间分区是时序数据库一个非常重要的特性,基本上所有时序数据查询操作都会带有时间的过滤条件,比如查询最近一小时或最近一天,数据分区可以有效根据时间维度选择部分目标分区,淘汰部分分区。
Note: Shard为InfluxDB后台真正的存储引擎,influxDB的Sharding策略为Hash Sharding,分布式存储的Sharding策略暂不研究
# 查询策略
> SHOW RETENTION POLICIES ON
name duration shardGroupDuration replicaN default
default 0 168h0m0s 1 true
# name: 保留策略的名称
# duration:持续时间,0表示无限制
# shardGroupDuration--shardGroup的存储时间,shardGroup是InfluxDB的一个基本储存结构
# replicaN--副本个数
# default: 是否是默认策略
# 新建策略
> CREATE RETENTION POLICY ON DURATION REPLICATION [SHARD DURATION ] [DEFAULT]
# 修改策略
> ALTER RETENTION POLICY ON DURATION DEFAULT
# 删除策略
> DROP RETENTION POLICY ON
InfluxDB的连续查询是在数据库中自动定时启动的一组语句,语句中必须包含 SELECT 关键词和 GROUP BY time() 关键词。
InfluxDB会将查询结果放在指定的数据表中。
连续查询的目的:
注意:InfluxDB的连续查询操作只能由管理员用户完成
# 创建连续查询
> CREATE CONTINUOUS QUERY <continusous query name> ON <db name>
[RESAMPLE [EVERY <interval>] [FOR <interval>]]
BEGIN SELECT <function>(<stuff>)[,<function>(<stuff>)] INTO <different_measurement>
FROM <current_measurement> [WHERE <stuff>] GROUP BY time(<interval>)[,<stuff>]
END
# 显示已存在的连续查询
> SHOW CONTINUOUS QUERIES
# 删除连续查询
> DROP CONTINUOUS QUERY <continuous query name> ON <db name>
COUNT()函数:
返回一个field中的非空值的数量
> SELECT COUNT() FROM [WHERE ] [GROUP BY ]
# 注意:InfluxDB中的函数如果没有指定时间的话,会默认以 epoch 0 (1970-01-01T00:00:00Z) 作为时间。
# 可以在where中加入时间条件
> SELECT COUNT() FROM WHERE time >= 'yyyy-mm-ddThh:MM:ssZ' AND time < 'yyyy-mm-ddThh:MM:ssZ' GROUP BY time(
DISTINCT()函数:
返回一个字段(field)的唯一值。
> SELECT DISTINCT() FROM [WHERE ] [GROUP BY ]
MEAN() 函数:
返回一个字段(field)中的值的算术平均值(平均值)。字段类型必须是长整型或float64。
> SELECT MEAN() FROM [WHERE ] [GROUP BY ]
MEDIAN()函数:
从单个字段(field)中的排序值返回中间值(中位数)。字段值的类型必须是长整型或float64格式。
> SELECT MEDIAN() FROM [WHERE ] [GROUP by ]
SPREAD()函数:
返回字段的最小值和最大值之间的差值。数据的类型必须是长整型或float64。
> SELECT SPREAD() FROM [WHERE ] [GROUP BY ]
SUM()函数
返回一个字段中的所有值的和。字段的类型必须是长整型或float64。
> SELECT SUM() FROM [WHERE ] [GROUP BY ]
TOP()函数
作用:返回一个字段中最大的N个值,字段类型必须是长整型或float64类型。
> SELECT TOP( [,<tag_key(s)>], ) [,|] [INTO_clause] FROM_clause [WHERE_clause] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause]
BOTTOM()函数
作用:返回一个字段中最小的N个值。字段类型必须是长整型或float64类型。
> SELECT BOTTOM(<field_key>[,<tag_keys>],<N>)[,<tag_keys>] FROM <measurement_name> [WHERE <stuff>] [GROUP BY <stuff>]
FIRST()函数
作用:返回一个字段中最老的取值。
> SELECT FIRST(<field_key>)[,<tag_key(s)>] FROM <measurement_name> [WHERE <stuff>] [GROUP BY <stuff>]
LAST()函数
作用:返回一个字段中最新的取值。
> SELECT LAST(<field_key>)[,<tag_key(s)>] FROM <measurement_name> [WHERE <stuff>] [GROUP BY <stuff>]
MAX()函数
作用:返回一个字段中的最大值。该字段类型必须是长整型,float64,或布尔类型。
> SELECT MAX(<field_key>)[,<tag_key(s)>] FROM <measurement_name> [WHERE <stuff>] [GROUP BY <stuff>]
MIN()函数
作用:返回一个字段中的最小值。该字段类型必须是长整型,float64,或布尔类型。
> SELECT MIN(<field_key>)[,<tag_key(s)>] FROM <measurement_name> [WHERE <stuff>] [GROUP BY <stuff>]
PERCENTILE()函数
作用:返回排序值排位为N的百分值。字段的类型必须是长整型或float64。
百分值是介于100到0之间的整数或浮点数,包括100。
> SELECT PERCENTILE(<field_key>, <N>)[,<tag_key(s)>] FROM <measurement_name> [WHERE <stuff>] [GROUP BY <stuff>]
DERIVATIVE()函数
作用:返回一个字段在一个series中的变化率。
InfluxDB会计算按照时间进行排序的字段值之间的差异,并将这些结果转化为单位变化率。其中,单位可以指定,默认为1s。
> SELECT DERIVATIVE(<field_key>, [<unit>]) FROM <measurement_name> [WHERE <stuff>]
其中unit的取值可以有以下几种:
u --microseconds
s --seconds
m --minutes
h --hours
d --days
w --weeks
DERIVATIVE()函数还可以在GROUP BY time()的条件下与聚合函数嵌套使用,格式如下:
> SELECT DERIVATIVE(AGGREGATION_FUNCTION(),[<unit>]) FROM WHERE GROUP BY time()
DIFFERENCE()函数
作用:返回一个字段中连续的时间值之间的差异。字段类型必须是长整型或float64。
最基本的语法:
> SELECT DIFFERENCE(<field_key>) FROM <measurement_name> [WHERE <stuff>]
与GROUP BY time()以及其他嵌套函数一起使用的语法格式:
> SELECT DIFFERENCE(<function>()) FROM WHERE GROUP BY time()
其中函数可以包含:
COUNT(), MEAN(), MEDIAN(),SUM(), FIRST(), LAST(), MIN(), MAX(), 和 PERCENTILE()。
ELAPSED()函数
作用:返回一个字段在连续的时间间隔间的差异,间隔单位可选,默认为1纳秒。
可选单位如下表
Units | Meaning |
---|---|
u | microseconds(1 millionth of a second) |
ms | milliseconds(1 thousandth of a second) |
s | second |
m | minute |
h | hour |
d | day |
w | week |
> SELECT ELAPSED(<field_key>, <unit>) FROM <measurement_name> [WHERE <stuff>]
MOVING_AVERAGE()函数
作用:返回一个连续字段值的移动平均值,字段类型必须是长整形或者float64类型。
语法:
> SELECT MOVING_AVERAGE(<field_key>,<window>) FROM <measurement_name> [WHERE <stuff>]
与其他函数和GROUP BY time()语句一起使用时的语法:
> SELECT MOVING_AVERAGE(<function>(<field_key>),<window>) FROM <measurement_name> WHERE <stuff> GROUP BY time(<time_interval>)
此函数可以和以下函数一起使用:
COUNT(), MEAN(),MEDIAN(), SUM(), FIRST(), LAST(), MIN(), MAX(), and PERCENTILE().
NON_NEGATIVE_DERIVATIVE()函数
作用:返回在一个series中的一个字段中值的变化的非负速率。
> SELECT NON_NEGATIVE_DERIVATIVE(<field_key>, [<unit>]) FROM <measurement_name> [WHERE <stuff>]
unit取值可以有:
Unit | Meaning |
---|---|
u | microseconds |
s | seconds |
m | minutes |
h | hour |
d | days |
w | weeks |
与聚合类函数放在一起使用时的语法如下所示:
> SELECT NON_NEGATIVE_DERIVATIVE(AGGREGATION_FUNCTION(),[<unit>]) FROM WHERE GROUP BY time()
STDDEV()函数
作用:返回一个字段中的值的标准偏差。值的类型必须是长整型或float64类型。
基本语法:
> SELECT STDDEV() FROM [WHERE ] [GROUP BY ]