InfluxDB存储引擎—— TSM文件与数据写入

在上一篇文章《InfluxDB基础知识(二)》中主要介绍了与存储引擎相关的几个非常重要的概念,本篇主要介绍InfluxDB存储引擎中非常重要的TSM文件结构,以及数据写入流程。

目录

数据写入流程

写入内存

写入磁盘

TSM文件

TSM文件与shardgroup、shard的关系

TSM文件的作用

TSM文件的结构

Series Data section

Series Index Section


数据写入流程

数据写入内存时包含的信息有:measurement、timestamp、tags、fields的值。

写入内存

1. 首先根据measurementtag的值生成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,确定数据flushshardgroup下的哪个shard

3. 生成data block及index block,并写入TSMFile(当一个field的值超过一个block的大小,则生成多个block并按顺序写入文件。详细文件结构将在下文讲述)

TSM文件

TSM文件与shardgroup、shard的关系

在上一篇文章中我们了解了shardgroup与shard的关系,知道一个shardgroup包含多个shard, 数据写入时首先根据时间范围确定shardgroup, 然后再根据seriesKey进行hash确定写入的shard。shard是InfluxDB中存储引擎的实现,组成架构如图:

一个shard可能会包含多个TSM文件,每个TSM文件最大为2G。结合上一篇文章中所说到的,可以知道一个shardgroup包含多个shard,一个shard包含多个TSM文件。

TSM文件的作用

TSM文件是InfluxDB中实际存储数据的文件,包含数据和数据的索引两部分

TSM文件的结构

如图所示,从图片最左边看起,TSM包含两部分数据:Series Data section和Series Index Section

Series Data 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编码。其他数据类型,不同数据类型对应不同的编码算法。

Series Index Section

这部分由一个个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文件的结构

猜你喜欢

转载自blog.csdn.net/u013480467/article/details/81479138