详解时序数据库不同分类与性能对比
详解时序数据库不同分类与性能对比
随着物联网时代的到来,时序数据库因其对海量时序数据的高效存储、高可扩展性和时序分析计算等特性,已成为工业领域颇受欢迎的数据库选择。本文将详细解析三种不同存储架构下时序数据库的特点及其对时序数据的读写、压缩等性能。
基于关系型数据库的时序数据库
在没有专门管理时序数据的数据库之前,人们通常使用关系型数据库管理时序数据。关系型数据库通常基于B+tree数据结构,这种数据结构在处理单个时间序列的批量数据写入时具有很高的性能。但是随着时序数据规模的不断增长,这种数据结构在同时处理数千、数万个时间序列的批量数据写入请求时,性能会急剧下降。
因此,在海量时序数据写入的工业场景中,关系型数据库的性能会显得捉襟见肘,并不适用。部分时序数据库继承了关系型数据库的生态优势,如原生支持标准SQL语法,并通过扩展关系型数据库以优化时序数据存储。这类时序数据库在数据写入后建立针对时序数据的表模型,并按时间分区进行数据点的分区存储和压缩,最终写入关系型数据库中。
该类时序数据库的典型代表如TimescaleDB,其通过扩展关系型数据库PostgreSQL实现时序数据管理。TimescaleDB通过在PostgreSQL的查询计划器、数据模型和执行引擎添加钩子,可以构建高度定制化的扩展层。基于该扩展模型,TimescaleDB可以利用PostgreSQL的多个属性,例如可靠性、安全性以及丰富的第三方工具。
总结来看,基于关系型数据库的时序数据库提供了全部的SQL功能,但由于无法避免时序数据场景中不需要的事务保证,对读写性能具有较大副作用。且由于关系型数据库基于行式存储构建时序数据的表模型,对于测点数、数据量大的时序数据来说,写入速度和压缩比相比采用列式存储的时序数据库,会有较大的差距,其分布式架构的可扩展性也存在短板。
基于KV存储的时序数据库
基于KV(key-value)存储的时序数据库,通过扩展NoSQL数据库实现时序数据存储,其将写入的时序数据解析后,构建成KV模型,并以KV形式将数据持久化在分布式文件系统上。一组键值对中,key是由测量指标、标签组合、测量字段键构成,value则是由测量字段值和时间戳构成。
该类数据库的代表是OpenTSDB,其使用了日志结构合并树(log structured merge tree,LSM-tree)的数据结构。这是一种针对写入密集的工作负载优化的数据结构,非常适合时序数据写入频率高、体量大的应用场景。
LSM-tree结构由三部分组成:预写日志(WAL)、内存表(分为可变内存表和不可变内存表)和排序字符串表(sorted string table,sstable)。
在此结构下写入或更新数据时,每条KV数据将以追加的方式写入预写日志(WAL),相同的数据也被再次写入可变内存表中,这个内存表也就是时序数据的缓存表。当可变内存表的大小达到阈值后,会变成不可变内存表,并首先对其缓存的数据按照key的字典顺序排序,然后将排序后的KV数据以数据块的形式顺序写入sstable文件。
需要注意的是,LSM-tree层级(level)中只能容纳一定大小的sstable文件,不同文件之间可能存在key范围重叠的情况,这时会触发合并操作。数据库会将当前层级中与下一层级中存在key范围重叠的sstable文件合并写入一个新的sstable文件。
总体而言,基于KV存储的时序数据库运用LSM-tree结构,具有高通量写入的天然性能优势,再加上使用了分布式文件系统,因此具有很高的扩展性。但是这类数据库也存在一定的问题。由于合并操作的存在,相同的数据会在不同层级之间重复写入,因此产生了写放大问题,从而导致数据的写入吞吐量降低。同时,时序数据通常具有多个标签组合,当标签集的数据量增加时,基于标签组合的key的数量会急剧膨胀,而key通常是在内存中索引的,所以内存资源占用也会急剧增加。
原生时序数据库
原生时序数据库是面向时序数据存储全新研发的时序数据库。该类型时序数据库不依赖第三方存储,使用列式存储,提供极致的数据写入、查询和压缩能力,部署和运维更加简单。
从下图可以看出,这类数据库灵活运用了时序索引、数据缓存、数据分区、预写日志等多类设计,在存储结构LSM-tree的基础上,旨在全面提升全链路的时序数据管理性能。
原生时序数据库的代表是InfluxDB和IoTDB。InfluxDB在其类似LSM-tree的TSM-tree结构中,引入了series-key的概念,根据时间特征对数据实现了很好的分类,从而有效减少了冗余存储,提高了数据压缩率。
IoTDB则依靠自研的时序数据标准文件格式Apache TsFile,为其写入、压缩、查询的优异性能提供了良好的基础。TsFile是IoTDB的底层数据文件存储格式,其结构分为数据区与索引区,通过索引区的文件级索引,并仅将必要的数据列加载到内存中,TsFile可实现海量序列低延迟查询;通过数据区的多种分段摘要信息,TsFile能够保障IoTDB的数据过滤、聚合性能。
同时,TsFile支持列式存储,并采用二阶差分编码、游程编码(RLE)、位压缩和Snappy等先进的编码和压缩技术,优化时序数据的存储和访问,实现时序数据高压缩比,相比InfluxDB磁盘空间占用可降低80%。TsFile也支持对时间戳列和数据值列进行单独编码,以达到更好的数据处理效能。
基于TsFile文件格式,IoTDB进一步自研构建了顺乱序分离引擎IoTLSM。当新数据写入时,首先记入预写日志(WAL),通过IoTDB独有的顺乱序判断机制,将这个数据分到顺序空间或乱序空间。
如果数据分到顺序空间,并触发刷盘,存储引擎会直接将数据文件刷到最高层,这便对顺序数据实现了最优先、最优化的处理。如果数据分到乱序空间,IoTDB会通过多种空间类合并、跨空间合并方法消除乱序文件,从而解决了工业场景出现乱序数据、影响写入性能的痛点。
最后,对于前文提到的LSM-tree结构合并操作导致的写放大问题,IoTDB的存储引擎结构也会明显地降低数据的写入次数、保障数据的高吞吐性能。可见,原生时序数据库在保障性能表现的基础上,通过其特性的各类技术,对于前文类型中数据库的结构痛点也能够进行优化。
总结
时序数据库的打造是一个系统工程,单个算法和机制不能决定一个时序数据库的性能和用户体验,需要将各个优化算法和处理机制统一融合到一个整体的系统中,来提高时序数据库的读写、压缩性能,其中也经常需要在不同技术之间进行权衡、互相补充。在时序数据库的众多架构路线中,原生时序数据库架构在迭代中受到的限制更小,能够更快地进行演进,这也是此类数据库最为流行的原因。
尽管时序数据库已经实现一些突破,但相关核心技术仍在飞速发展中,可以预见未来将有更多更新颖的架构、方法被提出,不妨祝愿现有的各类时序数据库产品加速发展,期待未来有更多高性能、高稳定性的新型产品出现,从而更好地挖掘急剧增加、亟待管理的工业数据价值。