InfluxDB(一):influxdb基本概念.md

InfluxDB是一个用于存储和分析时间序列数据的开源数据库

主要特性有:

  • 内置HTTP接口,使用方便
  • 数据可以打标记,查让查询可以很灵活
  • 类SQL的查询语句
  • 安装管理很简单,并且读写数据很高效
  • 能够实时查询,数据在写入时被索引后就能够被立即查出

1、概念介绍

image-20210904095611189

timestamp:time存着时间戳,这个时间戳以RFC3339格式展示了与特定数据相关联的UTC日期和时间。
field set:每组field key和field value的集合,如butterflies = 3, honeybees = 28
field key/value:在InfluxDB中不能没有field,field没有索引。
tag set:不同的每组tag key和tag value的集合,如location = 1, scientist = langstroth
tag key/value:在InfluxDB中可以没有tag,tag是索引起来的。
measurement: 是一个容器,包含了列time,field和tag。概念上类似表。
retention policy:单个measurement可以有不同的retention policy。measurement默认会有一个autogen的保留策略,autogen中的数据永不删除且备份数replication为1(只有一份数据,在集群中起作用)。
series:series是共同retention policy,measurement和tag set的集合
point:point是具有相同timestamp、相同series(measurement,rp,tag set相同)的field。这个点在此时刻是唯一存在的。 相反,当你使用与该series中现有点相同的timestamp记将新point写入同一series时,该field set将成为旧field set和新field set的并集。

1.1、与关系型数据库比较

一般可以这么说:

  • InfluxDB的measurement(foodships)和SQL数据库里的table类似;
  • InfluxDB的tag(park_id和planet)类似于SQL数据库里索引的列;
  • InfluxDB中的field(#_foodships)类似于SQL数据库里没有索引的列;
  • InfluxDB里面的数据点(例如2015-04-16T12:00:00Z 5)类似于SQL数据库的行;

基于这些数据库术语的比较,InfluxDB的continuous query和retention policy与SQL数据库中的存储过程类似。 它们被指定一次,然后定期自动执行。

在InfluxDB中InfluxQL是一种类SQL的语言。对于来自其他SQL或类SQL环境的用户来说,它已经被精心设计,而且还提供特定于存储和分析时间序列数据的功能。

InfluxQL的select语句来自于SQL中的select形式:

SELECT <stuff> FROM <measurement_name> WHERE <some_conditions>

如果你想看到planet为Saturn,并且在UTC时间为2015年4月16号12:00:01之后的数据:

SELECT * FROM "foodships" WHERE "planet" = 'Saturn' AND time > '2015-04-16 12:00:01' 

如上例所示,InfluxQL允许您在WHERE子句中指定查询的时间范围。您可以使用包含单引号的日期时间字符串,格式为YYYY-MM-DD HH:MM:SS.mmm(mmm为毫秒,为可选项,您还可以指定微秒或纳秒。您还可以使用相对时间与now()来指代服务器的当前时间戳:

SELECT * FROM "foodships" WHERE time > now() - 1h 

SQL数据库和InfluxDB之间存在一些重大差异。SQL中的JOIN不适用于InfluxDB中的measurement。InfluxQL还支持正则表达式,表达式中的运算符,SHOW语句和GROUP BY语句。 InfluxQL功能还包括COUNT,MIN,MAX,MEDIAN,DERIVATIVE等。

### 为什么InfluxDB不是CRUD的一个解释

influxDB是针对时间序列数据进行了优化的数据库。这些数据通常来自分布式传感器组,来自大型网站的点击数据或金融交易列表等。

这个数据有一个共同之处在于它只看一个点没什么用。一个读者说,在星期二UTC时间为12:38:35时根据他的电脑CPU利用率为12%,这个很难得出什么结论。只有跟其他的series结合并可视化时,它变得更加有用。随着时间的推移开始显现的趋势,是我们从这些数据里真正想要看到的。另外,时间序列数据通常是一次写入,很少更新。

结果是,由于优先考虑create和read数据的性能而不是update和delete,InfluxDB不是一个完整的CRUD数据库,更像是一个CR-ud。

2、Influx HttpAPI

详见官方文档

image2019-10-14_16-29-35

例:请求当前策略信息

curl -G 'http://192.198.11.115:8086/query?pretty=true' --data-urlencode "db=hc_data_center" --data-urlencode "q=SHOW RETENTION POLICIES ON telegraf "

3、InfluxQL查询语言

3.1、查询数据

3.1.1、基本的SELECT语句

##### SELECT子句

SLECT *:返回所有的field和tag。

SELECT "<field_key>":返回特定的field。

SELECT "<field_key>","<field_key>":返回多个field。

SELECT "<field_key>","<tag_key>":返回特定的field和tag,SELECT在包括一个tag时,必须只是指定一个field。

SELECT "<field_key>"::field,"<tag_key>"::tag:返回特定的field和tag,::[field | tag]语法指定标识符的类型。 使用此语法来区分具有相同名称的field key和tag key。

##### FROM子句

FROM <measurement_name>:从单个measurement返回数据。如果使用CLI需要先用USE指定数据库,并且使用的DEFAULT存储策略。如果您使用HTTP API,需要用db参数来指定数据库,也是使用DEFAULT存储策略。

FROM <measurement_name>,<measurement_name>:从多个measurement中返回数据。

FROM <database_name>.<retention_policy_name>.<measurement_name>:从一个完全指定的measurement中返回数据,这个完全指定是指指定了数据库和存储策略。

FROM <database_name>..<measurement_name>:从一个用户指定的数据库中返回存储策略为DEFAULT的数据。

#### 例子

// 例一:从单个measurement查询所有的field和tag
> SELECT * FROM "h2o_feet"

// 例二:从单个measurement中查询特定tag和field
> SELECT "level description","location","water_level" FROM "h2o_feet"

// 例三:从单个measurement中选择特定的tag和field,并提供其标识符类型
> SELECT "level description"::field,"location"::tag,"water_level"::field FROM "h2o_feet"

// 例四:从单个measurement查询所有field
> SELECT *::field FROM "h2o_feet"

// 例五:从measurement中选择一个特定的field并执行基本计算
> SELECT ("water_level" * 2) + 4 from "h2o_feet"

// 例六:从多个measurement中查询数据
> SELECT * FROM "h2o_feet","h2o_pH"

// 例七:从完全限定的measurement中选择所有数据
> SELECT * FROM "NOAA_water_database"."autogen"."h2o_feet"

// 例八:从特定数据库中查询measurement的所有数据
> SELECT * FROM "NOAA_water_database".."h2o_feet"

3.1.2、WHERE子句

**WHERE子句在field,tag和timestamp上支持conditional_expressions.
**

##### fields

WHERE子句支持field value是字符串,布尔型,浮点数和整数这些类型。
在WHERE子句中单引号来表示字符串字段值。具有无引号字符串字段值或双引号字符串字段值的查询将不会返回任何数据,并且在大多数情况下也不会返回错误。

field_key ['string' | boolean | float | integer]

支持的操作符:

= 等于
<> 不等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于

##### tags

WHERE子句中的用单引号来把tag value引起来。具有未用单引号的tag或双引号的tag查询将不会返回任何数据,并且在大多数情况下不会返回错误。

tag_key ['tag_value']

支持的操作符:

= 等于
<> 不等于
!= 不等于

##### timestamps
对于大多数SELECT语句,默认时间范围为UTC的1677-09-21 00:12:43.145224194到2262-04-11T23:47:16.854775806Z。 对于只有GROUP BY time()子句的SELECT语句,默认时间范围在UTC的1677-09-21 00:12:43.145224194和now()之间。

#### 例子

// 例二:查询有特定field的key value为字符串的数据
> SELECT * FROM "h2o_feet" WHERE "level description" = 'below 3 feet'
// 例三:查询有特定field的key value并且带计算的数据
> SELECT * FROM "h2o_feet" WHERE "water_level" + 2 > 11.9
// 例六:根据时间戳来过滤数据
> SELECT * FROM "h2o_feet" WHERE time > now() - 7d

3.1.3、GROUP BY子句

GROUP BY子句后面可以跟用户指定的tags或者是一个时间间隔。

GROUP BY *:对结果中的所有tag作group by。

GROUP BY <tag_key>:对结果按指定的tag作group by。

GROUP BY <tag_key>,<tag_key>:对结果数据按多个tag作group by,其中tag key的顺序没所谓。

### GROUP BY time()

GROUP BY time()返回结果按指定的时间间隔group by。

time(time_interval,offset_interval) :
time_interval是一个时间duration。决定了InfluxDB按什么时间间隔group by。例如:time_interval为5m则在WHERE子句中指定的时间范围内将查询结果分到五分钟时间组里。

offset_interval是一个持续时间。它向前或向后移动InfluxDB的预设时间界限。offset_interval可以为正或负。

fill(<fill_option>) :可选的,它会更改不含数据的时间间隔的返回值。

覆盖范围:基本GROUP BY time()查询依赖于time_interval,offset_interval和InfluxDB的预设时间边界来确定每个时间间隔中包含的原始数据以及查询返回的时间戳。

##### 例子

// 例二:时间间隔为12分钟并且还对tag key作group by
> SELECT COUNT("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),"location"

## ORDER BY TIME DESC
默认情况下,InfluxDB以升序的顺序返回结果; 返回的第一个点具有最早的时间戳,返回的最后一个点具有最新的时间戳。 ORDER BY time DESC反转该顺序,使得InfluxDB首先返回具有最新时间戳的点。

3.1.4、LIMIT和SLIMIT子句

LIMIT N指定每次measurement返回的点数。如果N大于measurement的点数,InfluxDB将从该测量中返回所有点。
SLIMIT M指定从指定measurement返回的series数。如果M大于measurement中series联数,InfluxDB将从该measurement中返回所有series。
### 例子

// 例一:限制返回的点数
> SELECT "water_level","location" FROM "h2o_feet" LIMIT 3

// 例一:限制返回的series的数目
> SELECT "water_level" FROM "h2o_feet" GROUP BY * SLIMIT 1

// 例二:限制数据点数和series数并且包括一个GROUP BY time()子句
> SELECT MEAN("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:42:00Z' GROUP BY *,time(12m) LIMIT 2 SLIMIT 1

3.2、管理数据

3.2.1、管理数据库

WITH,DURATION,REPLICATION,SHARD DURATION和NAME子句是可选的用来创建与数据库相关联的单个保留策略。如果您没有在WITH之后指定其中一个子句,将默认为autogen保留策略。创建的保留策略将自动用作数据库的默认保留策略。

一个成功的CREATE DATABASE查询返回一个空的结果。如果您尝试创建已存在的数据库,InfluxDB什么都不做,也不会返回错误。

DROP DATABASE从指定数据库删除所有的数据,以及measurement,series,continuous queries, 和retention policies。

#### 例子

> CREATE DATABASE "NOAA_water_database"> CREATE DATABASE "NOAA_water_database" WITH DURATION 3d REPLICATION 1 SHARD DURATION 1h NAME "liquid"

3.2.2、用DROP从索引中删除series

DROP SERIES删除一个数据库里的一个series的所有数据,并且从索引中删除series。

DROP SERIES不支持WHERE中带时间间隔。

该查询采用以下形式,您必须指定FROM子句或WHERE子句:

#### 例子

//从单个measurement删除所有series:> DROP SERIES FROM "h2o_feet"//从单个measurement删除指定tag的series:> DROP SERIES FROM "h2o_feet" WHERE "location" = 'santa_monica'//从数据库删除有指定tag的所有measurement中的所有数据:> DROP SERIES WHERE "location" = 'santa_monica'

3.2.3、用DELETE删除series

DELETE删除数据库中的measurement中的所有点。与DROP SERIES不同,它不会从索引中删除series,并且它支持WHERE子句中的时间间隔。

#### 例子

//删除measurement`h2o_feet`的所有相关数据:> DELETE FROM "h2o_feet"//删除measurement`h2o_quality`并且tag`randtag`等于3的所有数据:> DELETE FROM "h2o_quality" WHERE "randtag" = '3'//删除数据库中2016年一月一号之前的所有数据:> DELETE WHERE time < '2016-01-01'

一个成功的DELETE返回一个空的结果。 关于DELETE的注意事项:

当指定measurement名称时,DELETE在FROM子句中支持正则表达式,并在指定tag时支持WHERE子句中的正则表达式。
DELETE不支持WHERE子句中的field。
如果你需要删除之后的数据点,则必须指定DELETE SERIES的时间间隔,因为其默认运行的时间为time <now()。

3.2.4、删除measurement

DROP MEASUREMENT删除指定measurement的所有数据和series,并且从索引中删除measurement。

DROP MEASUREMENT <measurement_name>

3.2.5、保留策略管理

以下部分介绍如何创建,更改和删除保留策略。 请注意,创建数据库时,InfluxDB会自动创建一个名为autogen的保留策略,该保留策略保留时间为无限。您可以重命名该保留策略或在配置文件中禁用其自动创建。

### 创建保留策略

CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]

DURATION子句确定InfluxDB保留数据的时间。 是持续时间字符串或INF(无限)。 保留策略的最短持续时间为1小时,最大持续时间为INF。

REPLICATION子句确定每个点的多少独立副本存储在集群中,其中n是数据节点的数量。该子句不能用于单节点实例。

SHARD DURATION子句确定shard group覆盖的时间范围。 是一个持续时间字符串,不支持INF(无限)持续时间。此设置是可选的。 默认情况下,shard group持续时间由保留策略的DURATION决定:

最小允许SHARD GROUP DURATION为1小时。 如果CREATE RETENTION POLICY查询尝试将SHARD GROUP DURATION设置为小于1小时且大于0,则InfluxDB会自动将SHARD GROUP DURATION设置为1h。 如果CREATE RETENTION POLICY查询尝试将SHARD GROUP DURATION设置为0,InfluxDB会根据上面列出的默认设置自动设置SHARD GROUP DURATION。

DEFAULT将新的保留策略设置为数据库的默认保留策略。此设置是可选的。
#### 例子

> CREATE RETENTION POLICY "one_day_only" ON "NOAA_water_database" DURATION 1d REPLICATION 1 > CREATE RETENTION POLICY "one_day_only" ON "NOAA_water_database" DURATION 23h60m REPLICATION 1 DEFAULT 如果您尝试创建与已存在的保留策略相同的保留策略,InfluxDB不会返回错误。  如果您尝试创建与现有保留策略名称相同但具有不同属性的保留策略,InfluxDB会返回错误。

### 修改保留策略
ALTER RETENTION POLICY形式如下,你必须至少指定一个属性:DURATION, REPLICATION, SHARD DURATION,或者DEFAULT:

#### 例子

 ALTER RETENTION POLICY "what_is_time" ON "NOAA_water_database" DURATION 3w SHARD DURATION 30m DEFAULT

3.2.6、删除保留策略

删除指定保留策略的所有measurement和数据:

DROP RETENTION POLICY <retention_policy_name> ON <database_name>	

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×