一、InfluxDB基本概念
InfluxDB下载地址
https://portal.influxdata.com/downloads/
InfluxDB排名
https://db-engines.com/en/ranking/time+series+dbms
InfluxDB 是一个开源分布式时序、事件和指标数据库。使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。
它有三大特性:
- Time Series (时间序列):你可以使用与时间有关的相关函数(如最大,最小,求和等)
- Metrics(度量):你可以实时对大量数据进行计算
- 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 是无需预先定义列,无结构
mysql | influxdb | 说明 |
---|---|---|
database | database | 数据库 |
table | measurement | 类似mysql中表的概念 |
record(point) | tag + field + timestamp [tag(可索引),field(不可索引)] | 传统表中的一行数据,映射到influxdb中,可以划分为三个 |
- database 数据库,和mysql的数据库相比,没有太大的歧义
- measurement 对比的是mysql中的table,从实际体验来看,两个之间最明显的区别在于没有单独的创建measurement的方法,直接新增一条数据时,若measurement不存在,则直接创建并插入一条数据
Point 这个对比的是mysql中的record,在influxDB中,表示每个表中,某个时刻,满足某个条件的>filed数据(简单来说就是 timestamp + tag + filed)的组成一个point
Shard
Shard 在 InfluxDB 中是一个比较重要的概念,它和 retention policy 相关联。每一个存储策略下会存在许多 shard,每一个 shard 存储一个指定时间段内的数据,并且不重复,例如 7点-8点 的数据落入 shard0 中,8点-9点的数据则落入 shard1 中。每一个 shard 都对应一个底层的 tsm 存储引擎,有独立的 cache、wal、tsm file
- 组件
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存在,也就是说保存策略创建时,需要指定具体的数据库
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 DURATION | Shard Group Duration |
---|---|
< 2 days | 1 hour |
>= 2 days and <= 6 months | 1 day |
> 6 months | 7 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管理页面操作
- 文档