“一个数据采集点一张表”大幅提升时间序列数据的插入和查询性能

物联网、车联网、工业互联网等场景的数据是时间序列数据,具有有其独特性,如果可以充分利用这些独特之处,推出一款时序数据库,就可以大幅提升时间序列数据的插入和查询性能。

TDengine 是一款高性能、分布式、支持 SQL 的时序数据库(Time Series DatabaseTSDB),其 TSDB 核心代码包括集群功能全部开源,同时 TDengine 还带有内建的缓存、流式计算、数据订阅等系统功能,能大幅减少研发和运维的复杂度,可广泛应用于物联网、车联网、工业互联网、IT 运维、金融等领域。

为充分利用时间序列数据的特点,TDengine 采用一个数据采集点一张表的策略,要求对每个数据采集点单独建表。
数据采集点是指按照预设时间周期或受事件触发采集物理量的硬件或软件。一个数据采集点可以采集一个或多个采集量,但这些采集量都是同一时刻采集的,具有相同的时间戳。对于复杂的设备,往往有多个数据采集点,每个数据采集点采集的周期都可能不一样,而且完全独立,不同步。比如对于一台汽车,有数据采集点专门采集 GPS 位置,有数据采集点专门采集发动机状态,有数据采集点专门采集车内的环境,这样一台汽车就有三个数据采集点。

时间序列数据是结构化的,因此,TDengine 采取的是结构化存储,而不是流行的 KV 存储。由于时间序列数据,每个数据采集点的数据源是唯一的,而且用户关心的往往是一个时间段的数据,而不是某个特殊时间点。一个数据采集点一张表的策略,有几大优点:

  1. 由于不同数据采集点产生数据的过程完全独立,每个数据采集点的数据源是唯一的,一张表也就只有一个写入者,这样就可采用无锁方式来写,写入速度就能大幅提升。
  2. 对于一个数据采集点而言,其产生的是时间序列数据,因此写的操作可用追加的方式实现,进一步大幅提高数据写入速度。
  3. 一个数据采集点的数据是以块为单位连续存储的。如果读取一个时间段的数据,它能大幅减少随机读取操作,成数量级的提升读取和查询速度。
  4. 一个数据块内部,采用列式存储,对于不同数据类型,采用不同压缩算法,而且由于一个数据采集点的采集量的变化是缓慢的,压缩率更高。

如果采用传统的方式,将多个数据采集点的数据写入一张表,由于网络延时不可控,不同数据采集点的数据到达服务器的时序是无法保证的,写入操作是要有锁保护的,而且一个数据采集点的数据是难以保证连续存储在一起的。
因此,采用一个数据采集点一张表的方式,能最大程度的保证单个采集点,时间序列数据的插入和查询的性能是最优的。