导读
近些年来得益于传感器技术、无线网络技术、云计算和人工智能技术的发展,物联网的基础设施日益完善,并应用到了新能源、智能家居、车联网、智慧工业等众多领域中,实现了“人与物”、“物与物”之间的互联。物联网给各行各业带来红利的同时,也给当前的技术带来了巨大的挑战,其中最关键的就是数据规模的急剧增长。根据 IDC 报告,到 2025 年物联网数据规模将达到 79.4 ZB,寻找合适的物联网数据存储解决方案自然变得非常重要。本文将结合物联网的数据特点和业务特性来解读如何降低数据存储成本,以及对比业内一些时序数据存储的实现方式。
物联网存储场景
物联网数据的产生是基于传感器采集的设备状态、事件、消息等数据,设备根据自身的类型使用对应的物联网通信协议接入到数据网关(IoT 网关),最后转发到存储,这是物联网数据流转到存储的通用链路。但是由于这些数据的应用场景不同,决定了其对存储架构的需求差异。例如业务上如果存储的是设备最新状态信息,那么每台设备只会对应一行设备状态数据(元数据),这个数据量级是由设备数决定的,一般在百万级,对于存储的需求更偏向于支持高 TPS 和索引能力。
另一种场景是业务上存储的是设备所有历史状态或者历史事件数据,那么设备数与数据量是 1 对 N 的关系,数据总量与设备数和存储时间范围正相关。以车辆轨迹数据存储为例,每辆汽车间隔一段时间就会上报一个 GPS 点,那么就需要存储一段时间内所有车辆上报的历史坐标,用于查看行车轨迹和位置,通常这类数据被称为时间序列数据(Timeseries Data)。时序数据的特点与访问模式都与传统互联网数据有非常大的差异,这导致其对于存储架构有着特殊的要求。
时序数据特点和读写模式
在解读时序数据存储架构之前,首先需要了解一下时序数据的一些概念和特点。通常来说,一个经典的时序数据模型包括:数据源(datasource),标签(tags),时间戳(timestamp),度量指标(mertics)。数据源 + 标签表示独立的时间线,数据源 + 标签 + 时间戳表示独立的时间点。
例如我们构造了一组时序数据样例,将其映射到二维表结构上如下图所示,图中包含了三组时间线,每一个时间线代表了设备个体的历史数据变化。其中数据源(datasource)和 tags(标签)用于区分设备,不同的设备型号的度量指标(mertics)不一样。
从中可以总结出如下几个特点:
- 数据源唯一
时序数据总是由固定设备产生,不同设备之间产生数据的过程相互独立。这一点对于数据的访问性能和存储空间都有着非常大的优化空间。
- 指标维度多
物联网设备种类非常复杂,每种类型的设备度量指标大不一样,例如 A 类型设备上报的是温度、湿度,而 B 类型设备上报的是压力值。存储所有设备的度量指标所需要定义的字段会达到几十个甚至上百个,且会动态增加。如果使用关系型数据库来存储,则需要根据字段数的动态变化频繁修改数据表 schema,这显然是不能接受的。如果按照设备类型分表存储,那么当业务上对多种类型设备聚合分析时,就需要多表 join,这不仅会提高业务代码的复杂度,同时会降低查询的性能。
- 时间顺序产生
时序数据是按照固定的周期或者是某个事件触发上报的,每一行时序数据都会带有数据上报时间戳 timestamp 属性。通常情况下,同一个设备