RP(Retention Policy)
RP是数据库级别,核心作用:
1 指定数据的过期时间
2 指定数据副本数量
3 指定shardgroup duration
shardgroup
每个shardgroup中包含多个shard,每个shardgroup只存储指定时间段的数据。
shardgroup起到的作用是将时序数据按时间分区,便于根据时间纬度选择目标数据分区。
shard
shard是influxdb中存储引擎的实现,具体称之为TSM,TSM的实现类似于LSM。shardgroup根据hash(series),将数据映射到不同的shard,所以相同series的数据肯定会处在同一个shard中。
如下图所示,influxdb中的数据划分形式:先按RP划分,不同存储策略的数据划分到不同的RP下面,在RP下面按照时间range分区形成不同的shardgroup。同一个shardgroup下面的数据按照series进行hash分区。
influxdb的策略是典型的两层sharding, 上层采用range sharding,下层采用hash sharding。对于时序数据而言,基于时间的range sharding是最合理的,但是这样会存在写入存在热点的问题(最新的数据只会写入最新的shard中),因此在下层采用series进行hash。
block
shard中负责具体存储的结构称为block。每个shard中包含若干个data block(数据文件) 和 index block(索引文件)。存储结构如下所示:
时序数据在内存中是一个巨大的map:<key, List<TimeStamp/value>,其中key= series + fieldKey , 同一个block内只会存储一种key对应的时序数据。datablock内部采用列式存储,从而提高存储效率。
TSM引擎工作原理:数据读取
读取原理如下所示:
1 首先根据key找到对应的indexblock。
2 利用indexblock里面的索引信息查找到对应datablock在shard(即TSM文件)中的位置
3 对查到的信息加载到内存中进行进一步的过滤。
参考:初识influxdb