在上一篇文章《InfluxDB基础知识(二)》中主要介绍了与存储引擎相关的几个非常重要的概念,本篇主要介绍InfluxDB存储引擎中非常重要的TSM文件结构,以及数据写入流程。
目录
数据写入流程
写入内存
写入磁盘
TSM文件
TSM文件与shardgroup、shard的关系
TSM文件的作用
TSM文件的结构
Series Data section
Series Index Section
数据写入内存时包含的信息有:measurement、timestamp、tags、fields的值。
1. 首先根据measurement和tag的值生成seriesKey
2. 然后逐个field处理,写入内存中存储数据的数据结构:Map<seriesKey+field,List<Timestamp|Value>>
当内存中的数据量达到一定限制(默认25M)或时间达到限制(默认10分钟),内存中的数据将会flush到磁盘。
将内存中的Map<seriesKey+field,List<Timestamp|Value>>,逐个key处理(即按照field逐个flush,flush完一个field,再处理下一个)
1. 首先根据时间确定数据flush到哪个shardgroup
2. 根据seriesKey进行hash,确定数据flush到shardgroup下的哪个shard
3. 生成data block及index block,并写入TSMFile(当一个field的值超过一个block的大小,则生成多个block并按顺序写入文件。详细文件结构将在下文讲述)
在上一篇文章中我们了解了shardgroup与shard的关系,知道一个shardgroup包含多个shard, 数据写入时首先根据时间范围确定shardgroup, 然后再根据seriesKey进行hash确定写入的shard。shard是InfluxDB中存储引擎的实现,组成架构如图:
一个shard可能会包含多个TSM文件,每个TSM文件最大为2G。结合上一篇文章中所说到的,可以知道一个shardgroup包含多个shard,一个shard包含多个TSM文件。
TSM文件是InfluxDB中实际存储数据的文件,包含数据和数据的索引两部分
如图所示,从图片最左边看起,TSM包含两部分数据:Series Data section和Series Index Section
这部分的组成是data block, data block是存储数据的快,时间戳和field存在data block中,tags不会存储在data block中。
细看data block的结构,包含四个部分:
type:记录存储的value的类型
length:记录时间戳存储段的长度。
timestamps: 数据对应的所有时间戳
values: field的值
可以发现数据是按列存储的,时间戳和field的值分别存储,这有利于数据压缩,InfluxDB对时间戳采用了Facebook开源的Geringei系统中对时序时间的压缩算法:delta-delta编码。其他数据类型,不同数据类型对应不同的编码算法。
这部分由一个个index block组成,每个index block是一个field的数据的索引。
index block由一个index meta和多个index entry组成
index meta中的key记录了数据的seriesKey和field,表示这个index block内所有IndexEntry所索引的时序数据块都是该Key对应的时序数据。
index entry指向对应的data block。offset和size记录了对应data block在文件中的偏移量和长度,通过offset和size即可读取对应的datablock。max time和min time记录了所指向的data block中的时间戳的最大最小值,用户在根据时间范围查找时可以根据这两个字段进行过滤,而不需要读取整个data block进行扫描。
本篇主要介绍了InfluxDB数据写入基本流程,以及磁盘中存储数据的TSM文件的结构