Skip to content

一、InfluxDB基本概念

InfluxDB下载地址

https://portal.influxdata.com/downloads/

InfluxDB排名

https://db-engines.com/en/ranking/time+series+dbms

InfluxDB 是一个开源分布式时序、事件和指标数据库。使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。

它有三大特性:

  1. Time Series (时间序列):你可以使用与时间有关的相关函数(如最大,最小,求和等)
  2. Metrics(度量):你可以实时对大量数据进行计算
  3. Eevents(事件):它支持任意的事件数据

特点:

  • schemaless(无结构),可以是任意数量的列
  • Scalable
  • min, max, sum, count, mean, median 一系列函数,方便统计
  • Native HTTP API, 内置http支持,使用http读写
  • Powerful Query Language 类似sql
  • Built-in Explorer 自带管理工具
  • InfluxDB作为时序数据库
1,influxdb 是go语言开发,是一种时间序列数据库

2,influxdb 是无需预先定义列,无结构
1,influxdb 是go语言开发,是一种时间序列数据库

2,influxdb 是无需预先定义列,无结构
mysqlinfluxdb说明
databasedatabase数据库
tablemeasurement类似mysql中表的概念
record(point)tag + field + timestamp [tag(可索引),field(不可索引)]传统表中的一行数据,映射到influxdb中,可以划分为三个
  1. database 数据库,和mysql的数据库相比,没有太大的歧义
  1. measurement 对比的是mysql中的table,从实际体验来看,两个之间最明显的区别在于没有单独的创建measurement的方法,直接新增一条数据时,若measurement不存在,则直接创建并插入一条数据
  1. Point 这个对比的是mysql中的record,在influxDB中,表示每个表中,某个时刻,满足某个条件的>filed数据(简单来说就是 timestamp + tag + filed)的组成一个point

  2. Shard

Shard 在 InfluxDB 中是一个比较重要的概念,它和 retention policy 相关联。每一个存储策略下会存在许多 shard,每一个 shard 存储一个指定时间段内的数据,并且不重复,例如 7点-8点 的数据落入 shard0 中,8点-9点的数据则落入 shard1 中。每一个 shard 都对应一个底层的 tsm 存储引擎,有独立的 cache、wal、tsm file

  1. 组件

TSM 存储引擎主要由几个部分组成: cache、wal、tsm file、compactor

1)Cache:cache 相当于是 LSM Tree 中的 memtabl。插入数据时,实际上是同时往 cache 与 wal 中写入数据,可以认为 cache 是 wal 文件中的数据在内存中的缓存。当 InfluxDB 启动时,会遍历所有的 wal 文件,重新构造 cache,这样即使系统出现故障,也不会导致数据的丢失。

cache 中的数据并不是无限增长的,有一个 maxSize 参数用于控制当 cache 中的数据占用多少内存后就会将数据写入 tsm 文件。如果不配置的话,默认上限为 25MB,每当 cache 中的数据达到阀值后,会将当前的 cache 进行一次快照,之后清空当前 cache 中的内容,再创建一个新的 wal 文件用于写入,剩下的 wal 文件最后会被删除,快照中的数据会经过排序写入一个新的 tsm 文件中。

2)WAL:wal 文件的内容与内存中的 cache 相同,其作用就是为了持久化数据,当系统崩溃后可以通过 wal 文件恢复还没有写入到 tsm 文件中的数据。

3)TSM File:单个 tsm file 大小最大为 2GB,用于存放数据。

4)Compactor:compactor 组件在后台持续运行,每隔 1 秒会检查一次是否有需要压缩合并的数据。

主要进行两种操作,一种是 cache 中的数据大小达到阀值后,进行快照,之后转存到一个新的 tsm 文件中。

另外一种就是合并当前的 tsm 文件,将多个小的 tsm 文件合并成一个,使每一个文件尽量达到单个文件的最大大小,减少文件的数量,并且一些数据的删除操作也是在这个时候完成
1)Cache:cache 相当于是 LSM Tree 中的 memtabl。插入数据时,实际上是同时往 cache 与 wal 中写入数据,可以认为 cache 是 wal 文件中的数据在内存中的缓存。当 InfluxDB 启动时,会遍历所有的 wal 文件,重新构造 cache,这样即使系统出现故障,也不会导致数据的丢失。

cache 中的数据并不是无限增长的,有一个 maxSize 参数用于控制当 cache 中的数据占用多少内存后就会将数据写入 tsm 文件。如果不配置的话,默认上限为 25MB,每当 cache 中的数据达到阀值后,会将当前的 cache 进行一次快照,之后清空当前 cache 中的内容,再创建一个新的 wal 文件用于写入,剩下的 wal 文件最后会被删除,快照中的数据会经过排序写入一个新的 tsm 文件中。

2)WAL:wal 文件的内容与内存中的 cache 相同,其作用就是为了持久化数据,当系统崩溃后可以通过 wal 文件恢复还没有写入到 tsm 文件中的数据。

3)TSM File:单个 tsm file 大小最大为 2GB,用于存放数据。

4)Compactor:compactor 组件在后台持续运行,每隔 1 秒会检查一次是否有需要压缩合并的数据。

主要进行两种操作,一种是 cache 中的数据大小达到阀值后,进行快照,之后转存到一个新的 tsm 文件中。

另外一种就是合并当前的 tsm 文件,将多个小的 tsm 文件合并成一个,使每一个文件尽量达到单个文件的最大大小,减少文件的数量,并且一些数据的删除操作也是在这个时候完成

目录与文件结构

InfluxDB 的数据存储主要有三个目录。默认情况下是 meta, wal 以及 data 三个目录。

meta 用于存储数据库的一些元数据,meta 目录下有一个 meta.db 文件

wal 目录存放预写日志文件,以 .wal 结尾

data 目录存放实际存储的数据文件,以 .tsm 结尾

上面几张图中,_internal为数据库名,monitor为存储策略名称,再下一层目录中的以数字命名的目录是 shard 的 ID 值。

存储策略下有两个 shard,ID 分别为 1 和 2,shard 存储了某一个时间段范围内的数据。再下一级的目录则为具体的文件,分别是 .wal.tsm 结尾的文件

timestamp : 时间戳,ns单位,每个记录都必然有这个属性,没有显示添加时,默认给一个

tag: 标签,kv结构,在database中, tag + measurement 一起构建索引
参与索引创建,因此适合作为查询的过滤条件
tag的数据量不要太多,最好能有典型的辨别性(和mysql的建立索引的原则差不多)
value为String类型
tag是可选的,在measurement不设置tag也是ok的

field:存储数据,kv结构
数据类型为: long, String, boolean, float


4. Series
Series: tag key 与tag value的唯一组合

field key, field value, field set,tag key,tag value,tag set,measurement, retention policy ,series,point
timestamp : 时间戳,ns单位,每个记录都必然有这个属性,没有显示添加时,默认给一个

tag: 标签,kv结构,在database中, tag + measurement 一起构建索引
参与索引创建,因此适合作为查询的过滤条件
tag的数据量不要太多,最好能有典型的辨别性(和mysql的建立索引的原则差不多)
value为String类型
tag是可选的,在measurement不设置tag也是ok的

field:存储数据,kv结构
数据类型为: long, String, boolean, float


4. Series
Series: tag key 与tag value的唯一组合

field key, field value, field set,tag key,tag value,tag set,measurement, retention policy ,series,point

Point

Point由时间戳(time)、数据(field)、标签(tags)组成

Point属性传统数据库中的概念
time每个数据记录时间,是数据库中的主索引(会自动生成)
fields各种记录值(没有索引的属性)也就是记录的值:温度, 湿度
tags各种有索引的属性:地区,海拔

series

所有在数据库中的数据,都需要通过图表来展示,而这个series表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来

> show series from add_test
key
---
add_test,name=YiHui,phone=110
add_test,name=YiHui2,phone=911
> show series from add_test
key
---
add_test,name=YiHui,phone=110
add_test,name=YiHui2,phone=911

1.1列子

建立一个measurement,保存某个应用的性能状况,包含以下指标, 每秒写一次数据到influxDB中

服务机器: host=127.0.0.1
服务接口: service=app.service.index
qps: qps=1340
rt: 1313
cpu: 45.23
mem: 4154m
load: 1.21

1. measurement创建
上面有7个指标参数,第一步就是区分tag和field,前面说到tag会建索引,推荐用于可以区分类型,取值可以预估的字段,所以对上面进行如下区分

tag:
    host
    servie
    
field:
    qps
    rt
    cpu
    mem
    load
建立一个measurement,保存某个应用的性能状况,包含以下指标, 每秒写一次数据到influxDB中

服务机器: host=127.0.0.1
服务接口: service=app.service.index
qps: qps=1340
rt: 1313
cpu: 45.23
mem: 4154m
load: 1.21

1. measurement创建
上面有7个指标参数,第一步就是区分tag和field,前面说到tag会建索引,推荐用于可以区分类型,取值可以预估的字段,所以对上面进行如下区分

tag:
    host
    servie
    
field:
    qps
    rt
    cpu
    mem
    load
> insert myapp,host=127.0.0.1,service=app.service.index qps=1340,rt=1313,cpu=45.23,mem=1,load=1.21

注意:
    命令最后不能有分号; ,否则导致语法错误

> select * from myapp
name: myapp
time                cpu   host      load mem qps  rt   service
----                ---   ----      ---- --- ---  --   -------
1568385256278474506 45.23 127.0.0.1 1.21 1   1340 1313 app.service.index

注释:
    在insert执行语句中,tag与tag、field与field之间用都好进行分割,tag与field之间用空格分割
    tag的value都是,String类型,不需要加双引号
    field的String类型数据,需要放在双引号中,否则会报错
    如果需要显示添加时间戳,在filed后添加空格,再添加时间戳
> insert myapp,host=127.0.0.1,service=app.service.index qps=1340,rt=1313,cpu=45.23,mem=1,load=1.21

注意:
    命令最后不能有分号; ,否则导致语法错误

> select * from myapp
name: myapp
time                cpu   host      load mem qps  rt   service
----                ---   ----      ---- --- ---  --   -------
1568385256278474506 45.23 127.0.0.1 1.21 1   1340 1313 app.service.index

注释:
    在insert执行语句中,tag与tag、field与field之间用都好进行分割,tag与field之间用空格分割
    tag的value都是,String类型,不需要加双引号
    field的String类型数据,需要放在双引号中,否则会报错
    如果需要显示添加时间戳,在filed后添加空格,再添加时间戳

field

#是否可以没有field
> insert gotable , host=217.0.1 ,server=hello
ERR: {"error":"unable to parse 'gotable , host=217.0.1 ,server=hello': invalid field format"}
#是否可以没有field
> insert gotable , host=217.0.1 ,server=hello
ERR: {"error":"unable to parse 'gotable , host=217.0.1 ,server=hello': invalid field format"}

tag

> insert gotabl qps=123 ,rts=123
ERR: {"error":"unable to parse 'gotabl qps=123 ,rts=123': bad timestamp"}
注意:
    tag和tag之间不能有空格

> insert gotabl qps=123,rts=123
> insert gotabl qps=123 ,rts=123
ERR: {"error":"unable to parse 'gotabl qps=123 ,rts=123': bad timestamp"}
注意:
    tag和tag之间不能有空格

> insert gotabl qps=123,rts=123

2.2策略

数据保存的策略 retention policy, 用于决定数据保存多久(意思是数据可以删除),保存几个备份,集群的处理

InfluxDB本身不提供数据的删除操作,因此用来控制数据量的方式就是定义数据保留策略。 因此定义数据保留策略的目的是让InfluxDB能够知道可以丢弃哪些数据,从而更高效的处理数据

查询策略

#语法:
show retention policies on <database name>

> show retention policies on hello(db_name)
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        true

name: 名称
duration: 保留时间, 0表示永久保存
shardGroupDuration: shardGroup的存储时间,shardGroup是InfluxDB的一个基本储存结构,应该大于这个时间的数据在查询效率上应该有所降低。
replicaN: 全称是REPLICATION,副本个数
default: 是否是默认策略
#语法:
show retention policies on <database name>

> show retention policies on hello(db_name)
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        true

name: 名称
duration: 保留时间, 0表示永久保存
shardGroupDuration: shardGroup的存储时间,shardGroup是InfluxDB的一个基本储存结构,应该大于这个时间的数据在查询效率上应该有所降低。
replicaN: 全称是REPLICATION,副本个数
default: 是否是默认策略

新建策略retention policy

retention policy依托于database存在,也就是说保存策略创建时,需要指定具体的数据库

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

retention_policy_name: 策略名(自定义的)

database_name: 一个必须存在的数据库名

duration: 定义的数据保存时间,最低为1h,如果设置为0,表示数据持久不失效(默认的策略就是这样的)

REPLICATION: 定义每个point保存的副本数,默认为1

default: 表示将这个创建的保存策略设置为默认的

h(小时),d(天),w(星期)

> create retention policy "2_hour" on hello duration 2h replication 1 default
> show retention policies on hello
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        false
2_hour  2h0m0s   1h0m0s             1        true

数据保存时间,数据分片时间,副本数
duration 这一列,表示的就是这个策略定义的数据保存时间
    因为我们知道每条记录都有一个time表明这条记录的时间戳,如果当前时间与这条记录的time之间差值,大于duration,那么这条数据就会被删除掉
    默认的保存策略autogen中的duraiton=0,这里表示这条数据不会被删除

副本
    副本这个指定了数据有多少个独立的备份存在


分片时间
简单理解为每个分片的时间跨度,比如上面的1_d这个策略中,数据保存最近24小时的,每个小时一个分组
> create retention policy "2_hour" on hello duration 2h replication 1 default
> show retention policies on hello
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        false
2_hour  2h0m0s   1h0m0s             1        true

数据保存时间,数据分片时间,副本数
duration 这一列,表示的就是这个策略定义的数据保存时间
    因为我们知道每条记录都有一个time表明这条记录的时间戳,如果当前时间与这条记录的time之间差值,大于duration,那么这条数据就会被删除掉
    默认的保存策略autogen中的duraiton=0,这里表示这条数据不会被删除

副本
    副本这个指定了数据有多少个独立的备份存在


分片时间
简单理解为每个分片的时间跨度,比如上面的1_d这个策略中,数据保存最近24小时的,每个小时一个分组
  • 我们在创建数据策略的时候,大多时候都没有指定这个值,系统给出的方案如下
Retention Policy’s DURATIONShard Group Duration
< 2 days1 hour
>= 2 days and <= 6 months1 day
> 6 months7 days

修改策略

> alter retention policy "2_hour" on hello duration 4h default
> show retention policies on hello
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        false
2_hour  4h0m0s   1h0m0s             1        true
> alter retention policy "2_hour" on hello duration 4h default
> show retention policies on hello
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        false
2_hour  4h0m0s   1h0m0s             1        true

删除策略

> drop retention policy "2_hour" on hello
> show retention policies on hello
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        false
> drop retention policy "2_hour" on hello
> show retention policies on hello
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        false

2.3 time

  • 直接使用influx-cli查询数据时,时间戳格式不太友好,记录下显示日期的方式
influx -precision rfc3339
influx -precision rfc3339
  • 连接后设置参数
# 进入控制台
influx

# 设置参数
precision rfc3339
# 进入控制台
influx

# 设置参数
precision rfc3339

二、InfluxDB提供多种操作方式:

1)客户端命令行方式

2)HTTP API接口

3)各语言API库

4)基于WEB管理页面操作
1)客户端命令行方式

2)HTTP API接口

3)各语言API库

4)基于WEB管理页面操作
  • 文档

https://docs.influxdata.com/influxdb/v1.7/

https://zhuanlan.zhihu.com/p/97247465