时序场景写入概述

数据库是存储数据的地方,完成数据表建模和存储选型,下面就要向表写入数据。 数据写入面临如下挑战:

  1. 数据量大,对吞吐量要求高
  2. 写入场景复杂,如:乱序、异频等场景

1. 数据量大

时序数据最大的特点就是数据量大,反应到实际场景中包括3个方面:

  1. 设备数量大:设备总量达到几十万到百万量级,并且会增长
  2. 采集频率高:指标需要秒级别的频率采集,部分指标可能需要10ms采集一次
  3. 采集指标多:以车辆网为例,每辆车包含的指标数可能有几千个

综上,在庞大的设备数量、采集指标又高频的采集密度下,产生的数据量巨大,对数据库的吞吐量是个极大的挑战。 MatrixDB开发了MatrixGate高速写入工具,通过segment节点并行接入数据的实现方式,可以达到5000万数据点/秒的写入速度。

mxgate

实现方式,请参考MatrixDB - MatrixDB如何实现单机5000万数据点/秒写入速度

评测报告,请参考MatrixDB - 时序数据库插入性能评测:MatrixDB是InfluxDB的78倍

2. 写入场景复杂

在实际场景中,数据写入面临的问题不仅仅是数据量大、来源形式多样化,还包括一些复杂的异常情况,如:

  1. 分批上报自动合并
  2. 乱序、延迟上报
  3. 异频上报

2.1 分批上报自动合并

在某些场景中,设备在某个时刻的采集指标不会一次性的全部发送回来,而是分批次回传。多次回传的数据需要合并到一起,而不是分多条记录存放。 upsert

对于这种场景,MatrixDB提供了UPSERT语义,基于唯一约束做数据的合并。具体使用方法请参考:MatrixDB - MatrixDB 4.2新特性解读之UPSERT

2.2 乱序、延迟上报

乱序、延迟上报同样是通过upsert支持。

2.3 异频上报

所谓的异频上报,是指设备的不同指标分别按照不同的频率来采集,比如,有的是1s采集一次,有的是2s采集一次。如下图所示:

upsert

异频上报会导致在存储数据的时候,对于低频采集的指标值中会存在大量NULL。只要存在NULL列,则在MatrixDB存储中也会占用存储空间,对于Heap表,存储开销为[列数/8]字节;对于Mars表,存储开销为[RowGroup行数/8]字节。所以要根据NULL的情况综合考虑解决方案。