时序数据库Influx-IOx源码学习九(写入总结)

InfluxDB是一个由InfluxData开发的开源时序数据库,专一于海量时序数据的高性能读、写、高效存储与实时分析等,在DB-Engines Ranking时序型数据库排行榜上常年排名第一。数据库

InfluxDB能够说是当之无愧的佼佼者,但 InfluxDB CTO Paul 在 2020/12/10 号在博客中发表一篇名为:Announcing InfluxDB IOx – The Future Core of InfluxDB Built with Rust and Arrow的文章,介绍了一个新项目 InfluxDB IOx,InfluxDB 的下一代时序引擎。服务器

接下来,我将连载对于InfluxDB IOx的源码解析过程,欢迎各位批评指正,联系方式见文章末尾。微信


上一章介绍了Chunk是怎样被写入到持久化设备中的,详情见:数据结构

http://www.javashuo.com/article/p-fhaiemtn-vo.html异步

这一章主要总结一下全部的代码思路,但愿可以更直观的还原IOx的执行,以及执行过程当中的各类数据格式。性能


咱们知道写入是由客户端发起的(在第六章中有客户端写入数据的示例),服务器使用一个Grpc的协议接收客户端数据。 这是第一次入口点,数据格式是LP,相似这样:ui

myMeasurement,tag1=value1,tag2=value2 fieldKey="123" 1556813561098000000

数据接收到以后就会转换为一个ParsedLine结构,根据输入的数据库名、表名、时间及数据,预先对数据进行shard及partition的分配,使用一个多级的BtreeMap结构进行存储。如图: .net

以后会再根据这个数据结构进行遍历,生成为flatbuffers的数据结构(转换为这个格式是为了传输效率及收到方的高效使用),并行对各个shard进行数据写入。3d

根据shardId能够获取到配置的机器组中各个节点的Ip地址,而后根据配置的写入节点数,进行顺序的一个节点一个节点的写入。code

PS:这里比较拗口,就是shard和shard之间是并行写的,可是shard中的每一个节点是串行写入的。

这时候远程服务器,就会收到这个flatbuffers结构的数据,收到以后的第一任务就是写入Write Buffer(这里的Write Buffer至关于其余数据库的WAL,可是不一样的是功能要更多一些,能够作一些排序等额外的工做,就至关于一个写缓冲)。

在排序和写入WAL以后,就开始写入到MutBuffer中了,总体的存储结构如图所示。

到了MbChunk以后,作了一次字典压缩,把field、tag等等的字符串都转为了id,而后使用列式存储,一列一列的存储下来。如图:

以后数据会被移动到readbuffer当中,变为不可写的数据。在readbuffer中数据结构是arrow格式的:

这里出现了两个metadata,第一个是表级别的,第二个是小块级别的,由于在写入过程当中,有可能第一个chunk和第二个chunk的列不同多,这样就在表级别存了一个最全的metadata。

到这里基本上这章就能够结束了,最后附一张pauldix的关于写入及异步模型图:

祝各位玩儿的开心。


欢迎关注微信公众号:

或添加微信好友: liutaohua001

相关文章
相关标签/搜索