记录智能电表等设备产生的实时数据,应该选择什么样的数据库?

智能电表产生的实时数据非常建议使用时序数据库Time Series Database)。从描述上看,智能电表设备产生的实时数据具有典型的时间戳标志,是时间序列数据,同时针对多台设备的数据存储和数据监测,可以考虑使用 TDengine database。尤其是 TDengine 最创新的「超级表」功能,能很好地解决数据存储以及读取速度的问题。

假设每个智能电表采集电流、电压、相位三个量,有多个智能电表,每个电表有位置 location 和分组 group ID 的静态属性。其采集的数据类似如下的表格:

TDengine 时序数据库 - 记录智能电表等设备产生的实时数据,应该选择什么样的数据库?

每一条记录都有设备 ID,时间戳,采集的物理量以及每个设备相关的静态标签。每个设备是受外界的触发,或按照设定的周期采集数据。采集的数据点是时序的,是一个数据流。

TDengine 最经典的处理方式就是「一个数据采集点一张表」,那针对表中的 Device ID ,就可以有相应的单独的表。
这样建表的好处就很多,例如由于不同采集设备产生数据的过程完全独立,每个设备的数据源是唯一的,一张表也就只有一个写入者,这样就可采用无锁方式来写,写入速度就能大幅提升。再有就是一个数据采集点的数据是以块为单位连续存储的。如果读取一个时间段的数据,它能大幅减少随机读取操作,成数量级的提升读取和查询速度。

当然,随着设备的增加,一个数据采集点一张表就会导致表的数量巨增,为了解决采集点的聚合操作,便引入了「超级表」这个概念。超级表是指某一特定类型的数据采集点的集合。同一类型的数据采集点,其表的结构是完全一样的,但每个表(数据采集点)的静态属性(标签)是不一样的。针对超级表的查询,TDengine 将把所有子表中的数据视为一个整体数据集进行处理,会先把满足标签过滤条件的表从超级表中找出来,然后再扫描这些表的时间序列数据,进行聚合操作,这样需要扫描的数据集会大幅减少,从而显著提高查询的性能。本质上,TDengine 通过对超级表查询的支持,实现了多个同类数据采集点的高效聚合。

至于提到的高并发问题,TDengine 作为一款 Time Series Database,支持以集群方式部署,以提升系统的处理能力和高可用性。TDengine 集群支持任意数据的多副本从而提升高可用性,并自动实现负载均衡。同时 TDengine 集群具有很好的横向扩展能力以处理更多的数据采集点和更大的数据量,并且分布式的结构更保证了TSDB的高可用性。