掘金 后端 ( ) • 2024-04-02 00:06

tsdb模块是influxdb最核心的模块,包揽了influxdb最核心存储的实现,在了解tsdb模块之前,我们需要先了解tsdb模块下的一些概念。主要有: store, shard, tag, series, point 等。

tsdb 基本概念

store

storeinfluxdb的存储模块,全局只有一个该实例。主要负责将数据按一定格式写入磁盘,并且维护influxdb相关的 存储概念。例如:创建/删除Shard、创建/删除retention policy、调度shard的compaction、以及最重要的WriteToShard 等等。在store内部又包含indexengine2个抽象概念,index是对应shard的索引,engine是对应shard的存储实现, 不同的engine采用不同的存储格式和策略。后面要讲的tsdb其实就是一个engine的实现。在influxdb启动时,会创建 一个store实例,然后Open它,初始化时,它会加载已经存在的Shard ,并启动一个Shard监控任务, 监控任务负责调度每个ShardCompaction和对使用inmem索引的Shard计算每种Tag拥有的数值的基数(与配置中max-values-per-tag有关)。

shard

shard 是一组存储单元,用于存放一段时间范围内的数据,shardrp 强关联,这种强关联指的是 shard 属于某个rp下。每个shard底层对应一个TSM存储引擎。当过期策略检查到某一个shard过期后,会释放其对应的资源。

series

series 保存的是一组数据的集合。在同一个database中,retention policy、measurement、tag sets 完全 相同的数据同属于一个series,同一个series的数据在物理上会按照时间顺序排列存储在一起。 series的key为measurement加所有tags的序列化字符串

tag 和 field

tagfield 最本质的区别是,tag可以建立索引,优化查询,而filed不行,根据filed查询需要遍历某个时间范围内的所有数据。tag和field在向数据库中插入数据的时候会有区别,tag在前,并以英文逗号分隔,field在后,以空格分隔。influxdb根据分隔符的不同,来判断是filed或者是tag。

point

timestampmeasurements、retention policytagfield等 组成的一组数据为一个point。 ponit的key 由measurement 和 tag 的hash。数据写入时,通过point的key进行fnv64算法计算之后可以得到HashId, 根据hashID 来选择要写入的shar 细心的人可能会发现,这里是没有shardGroup的,正如我们在 mete 解析中提到的,shardGroup 只是influxdb的meta维护的一个逻辑的概念,它的作用仅仅是把某个时间范围内的一些shard聚合在一起,所以这部分基本概念没有纳入进去。