Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

对齐时间序列内存存储结构开发总结


一、问题背景

某用户有这样的测试场景,模拟车联网100万台车辆数据的批量写入,每台车包含27列数据共2700万个测点,每个测点每秒采集1条新纪录。共写入1小时的数据,每个测点写入3600个点。写入性能要求在3节点1副本的分布式场景下达到100万行每秒。

在现有存储模型下,我们测试了单机的写入性能,为19万行每秒。即使使用3节点1副本的情况写入性能较单机提升约2倍,也无法达到要求。因此,对现有写入性能提升瓶颈的分析是不可或缺的。

在该用户场景中,存在每台车27个时间序列的时间戳完全相同的情况。而在现有的存储模型里,每个时间序列均为时间戳与测量值相互对应的形式。因此,如果使用现有模型会重复存储27列相同的时间戳。

可以预见对时间戳对齐的序列存储进行优化,减少对相同时间戳重复写入,是一个写入性能提升的关键点。在本场景中可减少26次重复时间戳的写入,优化后最多提升1/2的写入速度。



某用户有这样的测试场景,模拟100万设备,每个设备包含27列测点,共2700万个测点,每个测点每秒采集1条数据,每个设备27个测点数据采集的时间戳完全相同。


在现有的存储模型里,每个时间序列均会存储一列时间戳和一列值。由于设备内各序列时间戳相同,因此 27 列时间戳完全相同。因此,在内存中对于可按时间对齐的序列仅存储一列时间戳即可,即对齐的时间序列。在本场景中即可减少26次重复时间戳的写入,优化后写入数据量可减少至 28/54。


同样,原有非对齐序列,需要对各个序列按时间单独排序。排序也仅需要对唯一的时间列进行排序,排序的工作量可降低至1/27。同样,在理论上,排序时间也可节省26列的时间,排序速度最多可提升1/2。


二、方案设计


针对上述背景,优化的主要思路为对多个时间戳相同的时间序列只存储一个时间戳列。为此分别设计了如下几种方案。

...

模拟实际应用场景,用户按行写入的场景较多,乱序数据较多。


查询场景

用户可能查Vector内的1列、30列、100列等等。用户可能查对齐时间序列内的1列、30列、100列等等。


测试重点关注:内存占用、write 速度、sort速度、遍历速度、查询

...

经综合比较,由于方案一内存浪费过大,方案三写入耗时较高、性能较差,最终选择方案二列式存储方案作为Vector数据类型内存存储结构。开发完成后,测试得到的写入性能,单机性能达到45万行每秒, 在3节点1副本的分布式场景下为109.5万行每秒,达到了100万行每秒的性能预期。