山豆根

首页 » 常识 » 诊断 » 从时序数据的特点说起,揭秘TDengin
TUhjnbcbe - 2021/5/21 17:30:00
北京医治皮肤科医院 http://news.39.net/bjzkhbzy/180906/6508755.html

小T导读:了解TDengine的朋友应该知道,TDengine在处理时序数据时,有非常卓越的表现。这取决于我们对时序数据特点的挖掘和总结,并且TDengine充分利用时序数据的特点,设计了存储模型和查询模型。本文主要介绍TDengine的存储引擎设计,看看TDengine是如何通过创新数据存储引擎达到超强性能的。

作者|程洪泽

本文编辑|李夏昕

01时序数据的特点

我们先观察一些时序数据,然后来总结一下时序数据的特点。

上图展示了一些典型的时序数据,横轴是时间,纵轴是采集量,可以看出:

有些时序数据在很长一段时间内都是固定的值,但是某些时间点也会产生异常跳变,异常检测在时序数据的处理过程中,也是非常重要的一环,但本文不过多展开;

有些时序数据在一段时间内是一个变化趋势;

有些时序数据在一定数值范围内会进行波动,有些波动频率高,有些波动频率低;

……

因此我们总结出了时序数据的特点,如下图所示,我们可以利用这些特点,进行存储引擎的设计。0TDengine的数据模型TDengine的数据模型主要有以下特点:

一个数据采集点一张表;

一张表的数据在文件中以块的形式连续存放;

文件中的数据块大小可配;

采用BlockRangeINdex(BRIN)索引块方法。

一个数据采集点一张表的设计逻辑会导致表的数量级膨胀,因此引入vnode的概念,对数据进行Sharding。点击《万字详解TDengine.0整体架构设计思路》可以详细了解vnode的概念,这里不再过多阐述。

总的来讲,vnode是时序数据存储的基本单元,一个vnode包含一定数量的表(数据采集点),数据的负载均衡、同步是以vnode为单位进行的,vnode可以充分利用多核的特点,提高并发速度。

对于一个vnode内的数据,我们按照时间段对数据进行分区(Partition),将同一时间段的数据存储在一个数据文件组中,并以文件组为单位对过期数据进行删除。在我们的设计中,时间段和文件编号是一一对应的,因此,查询某个时间段的数据,我们只需要计算出索引号,就可以到对应的文件中进行查询。

0TSDB存储引擎TDengine针对时序数据的特点,专门研发了TSDB存储和查询引擎。作为一个查询引擎,它提供了基本的查询接口。我们这里主要讲解TSDB的存储引擎。TSDB存储了一个vnode中表的META信息以及时序数据(采集信息),后者以行和列两种结构存储(TDengine.0开始引入行存储)。时序数据在内存中以SkipList方式进行索引的,在硬盘中是以BlockRangeINdex(BRIN)方式进行索引的。META数据

TSDB存储了vnode表中的META数据。META包括表/超级表的SCHEMA、子表TAG值、TAGSCHEMA和子表/超级表的从属关系。META数据的添加、更新以及删除等操作先在内存中进行,最后序列化并写入硬盘。

META数据在TSDB中是全内存加载的,根据子表的第一个TAG值建立一个内存索引,因为只对TAG的第一个值索引,所以速度最快。使用vnode的Sharding方式可以充分利用多个vnode资源进行表的过滤查询操作。

META数据的持久化存储

META数据写入内存时会同时生成序列化记录,以appendonly形式存储到内存buffer中。内存数据达到一定量后触发落盘操作,落盘时,更新的序列化META数据以appendonly形式写入硬盘META文件,每张表的最新状态、表的更新和删除都会append到META文件中,序列化成一条记录。

时序数据

TSDB也负责存储vnode中表的时序数据(采集数据),时序数据在写入时首先会写入到TSDB事先分配的内存缓冲区中,当内存缓冲区的数据积累到一定量后,触发落盘,然后进行持久化存储。

TSDB内存中的时序数据为行存储,因而支持以appendonly形式添加buffer,从而充分利用已分配的内存资源,缓存足够多的数据进行落盘,有利于一个块的数据量进行积累,有利于压缩。为了便于查询和乱序数据的处理,内存中建立了一个SkipList作为内存索引。内存中还维护了已经写入数据的最新时间和最老时间等信息。

内存中一条数据的行存储格式如下图所示。时序数据的持久化存储TSDB内存中的数据积累到一定量时,会触发落盘。在落盘时,时序数据由行存储形式转化为列存储形式,并维护BRIN索引,引入LAST文件和SUB-BLOCK机制处理文件碎片化。列存储形式如下图所示。TSDB工作流程TSDB启动时会事先分配一个BUFFERPOOL作为写入缓冲(默认16MB*6=96MB),缓冲区块大小和个数可配,区块个数可修改。META数据和时序数据从缓冲块申请写入空间,写入引擎向BUFFERPOOL申请缓冲区块,写满的缓冲区块占总缓冲区块的1/时触发落盘操作。落盘时,缓冲区块中的数据写入到META等文件中,落盘结束后缓冲区块归还给BUFFERPOOL,形成循环机制。查询时,对MEM,IMEM以及数据文件中的数据进行合并查询。如下图所示。TSDB设计的优点

对于单表按照时间段的查询效率很高

内存行存储充分利用内存,缓存更多数据

文件中列存储充分发挥压缩算法优势

避免LSM过多的文件合并

标签数据与时序数据分离存储

总结

本文主要讲解了TDengine的存储引擎,当然,决定TDengine高性能和节省TDengine存储空间的原因还包括先进的压缩算法以及查询模型的设计等。

1
查看完整版本: 从时序数据的特点说起,揭秘TDengin