基础概念
与常见的数据库的对比
-
概念名称 Influxdb 关系型数据库
数据库 database database
表 measurement table
行 points row
列 tag,field,timestamp column
InfluxDB独有的概念
Point: 代表一行的数据,由时间戳(time)、数据(field)和标签(tags)组成
tag sets: tags在InfluxDB中会按照字典序排序,不管是tag-key还是tag-value,只要不一致就分别属于两个key
tag: 标签,表名+tag一起作为数据库的索引是“key-value”的形式
field name: InfluxDB支持一条数据插入多个fieldName。但实际存储中还是被当做多条数据存储
timestamp: 每一条数据都需要指定一个时间戳,在 TSM 存储引擎中会特殊对待,以为了优化后续的查询操作
Series: 相当于是 InfluxDB 中一些数据的集合,在同一个 database 中,retention policy、measurement、tag sets 完全相同的数据同属于一个 series,同一个 series 的数据在物理上会按照时间顺序排列存储在一起
retention policy: 存储策略,用于设置数据保留的时间,每个数据库刚开始会自动创建一个默认的存储策略 autogen,数据保留时间为永久,之后用户可以自己设置,例如保留最近2小时的数据。插入和查询数据时如果不指定存储策略,则使用默认存储策略,且默认存储策略可以修改。InfluxDB 会定期清除过期的数据
Shard: 在 InfluxDB 中是一个比较重要的概念,它和 retention policy 相关联。每一个存储策略下会存在许多 shard,每一个 shard 存储一个指定时间段内的数据,并且不重复,例如 7点-8点 的数据落入 shard0 中,8点-9点的数据则落入 shard1 中。每一个 shard 都对应一个底层的 tsm 存储引擎,有独立的 cache、wal、tsm file
TSM存储引擎组成
TSM 存储引擎主要由几个部分组成: cache、wal、tsm file、compactor
Shard
shard 并不能算是其中的一个组件,因为这是在 tsm 存储引擎之上的一个概念。在 InfluxDB 中按照数据的时间戳所在的范围,会去创建不同的 shard,每一个 shard 都有自己的 cache、wal、tsm file 以及 compactor,这样做的目的就是为了可以通过时间来快速定位到要查询数据的相关资源,加速查询的过程,并且也让之后的批量删除数据的操作变得非常简单且高效。
在 InfluxDB 中,通过 retention policy 设置数据的保留时间,当检测到一个 shard 中的数据过期后,只需要将这个 shard 的资源释放,相关文件删除即可,这样的做法使得删除过期数据变得非常高效。
Cache
cache 中的数据并不是无限增长的,有一个 maxSize 参数用于控制当 cache 中的数据占用多少内存后就会将数据写入 tsm 文件。
如果不配置的话,默认上限为 25MB,每当 cache 中的数据达到阀值后,会将当前的 cache 进行一次快照,之后清空当前 cache 中的内容,再创建一个新的 wal 文件用于写入,剩下的 wal 文件最后会被删除,快照中的数据会经过排序写入一个新的 tsm 文件中。
WAL
wal 文件的内容与内存中的 cache 相同,其作用就是为了持久化数据,当系统崩溃后可以通过 wal 文件恢复还没有写入到 tsm 文件中的数据。
由于数据是被顺序插入到 wal 文件中,所以写入效率非常高。但是如果写入的数据没有按照时间顺序排列,而是以杂乱无章的方式写入,数据将会根据时间路由到不同的 shard 中,每一个 shard 都有自己的 wal 文件,这样就不再是完全的顺序写入,对性能会有一定影响。看到官方社区有说后续会进行优化,只使用一个 wal 文件,而不是为每一个 shard 创建 wal 文件。
wal 单个文件达到一定大小后会进行分片,创建一个新的 wal 分片文件用于写入数据。
STM file
单个 tsm file 大小最大为 2GB,用于存放数据。
TSM file 使用了自己设计的格式,对查询性能以及压缩方面进行了很多优化,在后面的章节会具体说明其文件结构。
Compactor
compactor 组件在后台持续运行,每隔 1 秒会检查一次是否有需要压缩合并的数据。
主要进行两种操作,一种是 cache 中的数据大小达到阀值后,进行快照,之后转存到一个新的 tsm 文件中。
另外一种就是合并当前的 tsm 文件,将多个小的 tsm 文件合并成一个,使每一个文件尽量达到单个文件的最大大小,减少文件的数量,并且一些数据的删除操作也是在这个时候完成
常用命令
- 显示数据库
show databases
- 新建数据库
create database <数据库名称>
create database test #没有报错表示执行成功,test是数据库名称
- 删除数据库
drop database test #区分大小写,test是数据库名称
- 使用指定的数据库
use device
- 显示所有表
show measurements
- 新建表
insert device_temperature,device_id=001 value=35
- 没有特定的建表语句所以插入时就会建表
- device_temperature 是表名
- device_id=001是索引tag
- value=35是记录值field,可以是多个记录值
- 添加数据时会自动写入时间戳,也可以自己指定时间戳
insert device_temperature,device_id=001 value=35 1435362189575692182
- 删除表
drop measurement device_temperature
- 显示数据保留策略
show shards #显示当前所有shared数据文件和他们的过期时间
show retention policies on test #test是数据库名称
- 创建数据库保留策略
create retention policy "rp_name" on "db_name" duration 3w replication 1 default
- rp_name: 保留策略名称
- db_name: 数据库名称
- duration 3w: 3周,近3周之前的数据会被删除,还支持小时(h),天(d),星期(w),分钟(m),秒(s),为0的话表示永久保存
- replication: 副本的个数,这里是1
- default:是否是默认策略
- 修改数据库保留策略
alter retention policy "rp_name" on "db_name" duration 30d default
- 删除数据库保留策略
drop retention policy "rp_name" on "db_name"
查询语句
-
数据查询
select * from device_temperature #查询此表所有数据
#当然可以加limit限制查询的条数,可以按照time进行排序
select * from /.*/ LIMIT 1 #查询此数据库所有表的第一条记录
select * from device."rp_3w".device_temperature
delete from "device_temperature" #删除表所有数据,则表就不存在了
drop MEASUREMENT "device_temperature" #删除表(注意会把数据保留删除使用delete不会)
表信息查询
show measurements #查看表
show FIELD KEYS from measurement_name #查看字段key
show series from measurement_name #查看key数据
show tag keys from device_temperature #查看tag keys
show tag values from device_temperature with key=device_id #查看tag values 必须制定tag key
用户管理命令
SHOW USERS #查看用户
CREATE USER test WITH PASSWORD '123456' #创建普通用户
CREATE USER test2 WITH PASSWORD '123456' WITH ALL PRIVILEGES #创建admin用户
REVOKE ALL PRIVILEGES FROM test2 #取消权限赋予
REVOKE READ ON mydb FROM test #取消test用户的读权限
SHOW GRANTS FOR test #展示test用户的权限
GRANT ALL ON mydb TO test #授予admin权限
GRANT READ ON mydb TO test #授权test在数据库中的读权限