在工业互联网和物联网等领域,数据集的价值与其规模是成正比的:应用程序和算法可以使用的数据越多,它们的输出结果就越精确。然而,由众多设备产生的海量数据需要处理,对于大型企业来说,存储成本可能会非常高昂。
但有一个好消息,那就是时序数据非常易于压缩。TDengine 大幅提高了数据压缩率,甚至能将数据集压缩至原始大小的1/10,并且几乎不会影响处理性能。这一切都得益于几个关键的创新点。
列式存储
时序数据库主要用来存储设备随时间变化而产生的数据。这些数据通常以较短的时间间隔进行采集,比如一分钟采集一次,或一秒钟采集一次。这就导致每个数据点与其相邻点的数值十分接近。以每 15s 测量一次温度的设备为例,在这么短的时间内,正常情况下,温度的变化通常不会太大,保持在一个相对稳定的范围内。
和 MySQL 这类采用行式存储的通用数据库不同,TDengine 采用列式存储。
- 大幅提高压缩率:同一列数据相近,便于压缩;不同数据类型可采用不同压缩算法。
- 大幅提高分析性能:时序数据的分析,往往是针对一个采集量在一个时间范围段进行的。如果行式存储,会读取大量的无效数据。
采用列式存储,由于这些数据的相似性,即便不使用复杂的压缩技术,也能达到很好的压缩效果。
两级压缩
TDengine 采用两级压缩技术,即先对数据进行编码,然后在编码的基础上对数据块进行压缩。
TDengine 对数据的编码方式如下:
- 较小的整数数据类型(INT、TINYINT 等)使用 simple8b 编码。
- 较大的整数数据类型(BIGINT 和 UBIGINT)和时间戳使用 delta 编码。
- 浮点数据类型(FLOAT 和 DOUBLE)使用 delta-of-delta 编码。
delta 编码,也称增量编码,是一种在序列数据之间以数据差异(delta)的形式存储或传输数据的方法。例如,对于序列数据 [2, 4, 6, 9, 7],delta 编码会存储 [2, 2, 2, 3, -2],其中每个值表示前一个数据点与当前数据点之间的差异。在时序数据场景下,由于相邻数据点的差异通常较小,Delta编码可以显著减少数据的冗余,从而显著提高压缩效率。
编码后,对于所有的数据类型,会使用标准的数据压缩算法进行压缩。TDengine 默认对所有列使用 lz4 进行压缩。但用户可以在建表时,根据需要配置 zlib、zstd、tsz、xz 或 disabled 等压缩算法,不同的数据类型,可以选择不同的压缩算法。详细可查看《可配置压缩算法》。
存储压缩算法增强后,TDengine 的压缩比预期可再提升一倍以上。
一个设备一张表
为充分利用其数据的时序性和其他数据特点,TDengine 采取一张设备一张表的策略,要求对每个数据采集点单独建表,用来存储这个数据采集点所采集的时序数据。这样的好处是:
- 每张表里的记录按时间自动排序
- 新数据记录的写入变成简单的追加操作
- 数值按列的变化范围更小
- 设备 ID、标签不会重复存储
这样的设计让 TDengine 在数据压缩率上远超其他时序数据库,同时,也便于数据的管理和查询。
可配置压缩算法
从 TDengine 3.3.0.0 版本开始,TDengine 提供了更高级的压缩功能,用户可以在建表时针对每一列配置是否进行压缩、以及使用的压缩算法和压缩级别。
- 第一级压缩支持多种编码方法,可扩充, 包括 simple8b、delta-i、delta-d、bit-packing、disabled
- 第二级压缩支持多种压缩算法,可扩充,包括 lz4、zlib、zstd、tsz、xz、disabled
- 压缩等级支持 高、中、低三种
详见《可配置压缩算法》。
存储压缩算法增强后,TDengine 的压缩比预期可再提升一倍以上。