InfluxDB是目前时序数据库 (TSDB)最优秀的产品,时序数据库是一种设计和优化的数据库,用于注册和存储始终与特定时间点相关联或使用时间戳的数据。时序数据其实就是在不同时间点收集并按时间排序的数据。对于刚刚接触时序数据库的同学来说,好多概念都是新的,理解起来会有一定的难度,本文就来梳理一下这些概念,方便大家快速上手InfluxDB!
database
对应传统数据库中的数据库,在 InfluxDB 中可以创建多个数据库,不同数据库中的数据文件是隔离存放的,存放在磁盘上的不同目录。
measurement
对应传统数据库中的表
retention policy
存储策略,用于设置数据保留的时间,每个数据库刚开始会自动创建一个默认的存储策略 autogen,数据保留时间为永久,之后用户可以自己设置,例如保留最近2小时的数据。插入和查询数据时如果不指定存储策略,则使用默认存储策略,且默认存储策略可以修改。InfluxDB 会定期清除过期的数据。
tag
标签在InfluxDB中是一个非常重要的部分,表名+tag一起作为数据库的索引,是“key-value”的形式。
field
例如上面数据中的 value 就是 fieldName,InfluxDB 中支持一条数据中插入多个 fieldName,这其实是一个语法上的优化,在实际的底层存储中,是当作多条数据来存储。
备注:一个measurement里可以没有tag,但是不能没有feld,因为tag只是索引,并不是用于存储测量值的,而fields就是存储测量值的。
关于tag和filed的使用,我们可以遵循以下原则:
- 把经常查询的字段作为tag
- 如果要使用
GROUP BY()
,要放在tag中 - 如果要使用InfluxQL函数,放到field中
- 如果需要存储的值不是字符串,则需要放到field中,因为tag value只能是字符串
timestamp
每一条数据都需要指定一个时间戳,在 TSM 存储引擎中会特殊对待,以为了优化后续的查询操作。
Point
相当于传统数据库里的一行数据,point=timestamp+field+tag
下图很好的展示了,measurement、fielsds、tags 和point的关系
Series
Series是InfluxDB中最重要的概念,时序数据的时间线就是:一个数据源采集的一个指标随着时间的流逝而源源不断地吐出数据这样形成的一条数据线称之为时间线。Series 相当于是 InfluxDB 中一些数据的集合,在同一个 database 中,retention policy、measurement、tag set完全相同的数据同属于一个 series,同一个 series 的数据在物理上会按照时间顺序排列存储在一起。Series由Measurement和Tags组合而成,我们可以简单的理解:
Measurement不同,就是不同的时间线
Measurement相同,Tags不同也是不同的时间线
shard
shard是InfluxDB存储引擎的实现,负责数据的编码存储、读写服务等。将InfluxDB中时间序列化的数据按照时间的先后顺序存入到shard中,每个shard中都负责InfluxDB中一部分的数据存储工作,并以tsm文件的表现形式存储在物理磁盘上,每个存放了数据的shard都属于一个shard group。
shard group
shard group可以理解为存放shard的逻辑容器,所有的shard在逻辑上都属于这个shard group,每个shard group中的shard都有一个对应的时间跨度和过期时间,每一个shard group都有一个默认的时间跨度,叫做shard group duration。shard group
使得shard查询性能和批量清理数据变得简单高效。
retention policy 、shard group和shard的关系
在一个retention policy中,如果指定的保留时间为24小时,那么在shard group中定义每个shard的duration为1小时,即每个shard的时间跨度为1小时,那么总共会有24个跨度为1小时的shard,在触发数据的RP后,删除最早时间跨度的shard。下图很好的解释了三者的关系。
bucket
是InfluxDB 2.0中存储时间序列数据的指定位置。在InfluxDB 1.8+中,每个database和retention-policy的组合都表示一个bucket。
我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更新文章最大的动力!