GaussDB(DWS)带你走近IoT时代-时序数据库为万物互联打下坚实的数仓基石

举报
AndyCao 发表于 2022/05/11 22:27:06 2022/05/11
【摘要】 万物互联的时代,最不缺少的就是海量数据,爆炸性增长的数据能给我们带来什么价值,我们如何通过这些海量数据看清事物的本质,甚至能够预测事物的发展趋势,这些是我们面对的挑战和需要解决的问题。时序数据库是这个时代的产物,也不断驱动着这个世界向万物互联不断迈进。

摘要

​ ​ ​ ​ ​ ​ ​ 适用版本:【8.1.3及以上】
​ ​ ​ ​ ​ ​ ​ 万物互联的时代,最不缺少的就是海量数据,爆炸性增长的数据能给我们带来什么价值,我们如何通过这些海量数据看清事物的本质,甚至能够预测事物的发展趋势,这些是我们面对的挑战和需要解决的问题。时序数据库是这个时代的产物,也不断驱动着这个世界向万物互联不断迈进。

概述

​ ​ ​ ​ ​ ​ ​ 随着5G技术的不断成熟,物联网技术得到了快速发展,万物互联的场景在我们身边也越来越触手可及。我们身边的电子设备变得越来越多,手机、电脑、智能手表、全屋智能、自动驾驶汽车等等,承载的信息量成倍增加,数以亿计的信息昼夜不停地描绘着这个世界。

​ ​ ​ ​ ​ ​ ​ 物联网时代,每个物体每时每刻都在产生各种维度的数据信息,这些信息尽可能全面的刻画我们所生活的世界,这些采集到的数据信息,帮助我们更好的生活,不断改变我们的生活方式。例如当下非常火热的自动驾驶,需要在汽车上配备各种传感器,用以实时采集运行时汽车的各项监控数据,采集的维度包括:坐标、速度、方向、温度、功率等等。每辆汽车上的传感器每天采集数据的数量级可能达到TB级。

​ ​ ​ ​ ​ ​ ​ 这些采集到的数据和时间强相关,采样时间间隔固定,描述了物体在历史时刻中测量数据的变化,我们将这种类型的数据统称为时间序列(Time Series)数据。我们将这些时序数据存储起来,这些海量数据不仅帮助我们了解物体的实时状态,通过多个维度的分析,更能够帮助数据使用者更好的指定策略,分析目标对象的趋势和规律等,甚至能够帮助我们预测不确定的未来。

时序数据的特征

​ ​ ​ ​ ​ ​ ​ 下图是一个典型发电机组数据采样示意图。共有三台发电机组,每个时间点分别采样四种数据:包括电压、功率、频率和电流相角。随着时间的流逝,每个采样的时间点将采样到的数据源源不断的传输。

​ ​ ​ ​ ​ ​ ​ 这样的时序数据场景随处可见,那么面对采样到的这些时序数据,我们应该怎样存储呢。

​ ​ ​ ​ ​ ​ ​ 我们将示意图转化为具体的一张表中的数据存储,从上图中我们可以看到,橙色区域的列包含发电机、生产厂商、型号、位置、ID这五列,可以看到这五列表示发电机组的一些物理信息,不会随时间的变化而变化;蓝色部分的列包含电压、功率、频率、电流相角这四列,这些列是我们目标采样维度,这些列存储的采样数据会随着时间动态变化;最后一列为时间列,表示我们采样的时间点。

​ ​ ​ ​ ​ ​ ​ 综上,我们将时序数据列做了以下三种分类:

  • Tag列:通常将表征数据源来源或者属性信息的列作为Tag列,该列的数值通常相对稳定,不随时间变化而变化。

  • Field列:一般将采样的维度作为数据列,因为该列的数据一般随时间变化而变化,存储各个指标的value。

  • Time列:表示采样时刻的时间戳。

​ ​ ​ ​ ​ ​ ​ 发电机组的某个指标随时间变化形成一条时间线,通过tag + field + time组合确定一条时间线。发电机组采样示意图中每条虚线都可以表示为一条时间线。通过上述的发电机组的采样模型我们对时序数据有一定的初步认识。那么相比较于传统数据库的应用场景,时序场景下的数据存储带来了哪些挑战呢?时序数据在实际采集过程中存在以下技术要求和特点:

  • 海量数据写入能力

    ​ 例如在自动驾驶汽车监测的数据每秒只采集5种测量数据(速度、温度、发动机功率、方向、坐标),1000W量汽车每秒中将会有5000W的TPS。

  • 写入平稳、持续

    ​ 传统业务数据通常和应用的访问量成正比,而访问量通常存在波峰波。不同于传统业务场景,时序数据的产生通常以一个固定的时间频率进行采集,不会受其他因素的制约,其数据生成的速度是相对比较平稳。

  • 写多读少

    ​ 时序数据90%左右的操作都是写操作。主要与其应用场景相关,例如在监控场景下,虽然每天需要存储很多数据,但是真正去读取的数据通常比较少,通常只会关注几个特定关键指标在一定时间范围内的数据。

  • 高压缩率

    ​ 高压缩率能够带来两方面的收益。一方面能够节省大量的硬件存储成本,节省硬盘的开销。另一方面压缩后的数据可以更容易存储到内存中,显著提高查询的性能。

  • 实时写入最近生成的数据,无更新

    ​ 时序数据的写入是实时的,采集的数据是反应物体客观信息,数据是随着时间推进不断产生,不存在旧数据更新场景。

  • 最近的数据读取概率高

    ​ 最近时间的数据具有的价值越高,因此最近的数据被读取的概率越高。例如在监控场景下,最近几个小时或者几天的监控数据最可能被访问,而一个季度或者一年前的数据极少访问。

  • 多维度分析

    ​ 时序数据来自不同个体,这些个体可能拥有不同的属性。在监控场景下,我们对某个集群上每台机器上的网络流量监控,可以对集群下的某台机器的网络流量查询,也可以对集群总的网络流量查询。

时序数据库应用场景

​ ​ ​ ​ ​ ​ ​ 典型时序数据库主要服务两类业务场景,应用性能监控(Application Performance Management, APM)和物联网(Internet of Things, IoT)

  • 商业零售:电商系统订单交易金额,支付金额数据,尚品库存,物流数据;
  • 金融交易:股票交易系统持续记录股票价格,交易量等;
  • 社会生活:智能电表会实时记录每个小时的用电量数据等;
  • 工业领域:工业机器数据例如风力发电机,获取实时转速、风速数据、发电量数据等;
  • 系统监控:IT基础设施的负载和资源使用率,DevOps监控数据、移动/Web应用程序事件流等;
  • 环境监测:自然环境(如温度、空气、水文、风力等)的监测,科学测量结果等;
  • 城市管理:城市交通的监测(车辆、人流、道路等);
  • 自动驾驶:自动驾驶汽车持续收集所处环境中的变化数据等。

DWS时序表建表最佳实践

语法格式

CREATE TABLE [ IF NOT EXISTS ] table_name
({ column_name data_type [ kv_type ] 
    | LIKE source_table [like_option [...] ] }
}
    [, ... ])
[ WITH ( {storage_parameter = value}  [, ... ] ) ]

[ TABLESPACE tablespace_name ]
[ DISTRIBUTE BY  HASH ( column_name [,...])]
[ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ]
[ table_partitioning_clauses ]
[ PARTITION BY { 
        {RANGE (partition_key) ( partition_less_than_item [, ... ] )} 
 } [ { ENABLE | DISABLE } ROW MOVEMENT ] ]; 
其中like选项like_option为:{ INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | DISTRIBUTION | ALL }

​ ​ ​ ​ ​ ​ ​ 时序表的建表语法,在很大程度上继承了行存和列存的语法,降低了用户的学习成本,能够更容易理解和使用。我们将时序表的列分为三种kv_type类型(tag、field、time),那么如何将对应的列指定为合适的类型,帮助我们更好的提高导入、查询等场景的性能,让业务场景运行的更加高效呢?
​ ​ ​ ​ ​ ​ ​ 我们继续以发电机组的场景作为示例,创建一张存储发电机组采样数据的时序表:

CREATE TABLE IF NOT EXISTS GENERATOR(
dynamo text TSTag,
manufacturer text TSTag,
model text TSTag,
location text TSTag,
ID bigint TSTag,
voltage numeric TSField,
power bigint TSTag,
frequency numeric TSField,
angle numeric TSField,
time timestamptz TSTime) with (orientation=TIMESERIES, period='7 days', ttl='1 month') distribute by hash(model);

我们可以看到,上述建表语句中:

  • 对于不随时间的变化而变化,描述发电机的属性信息的列(发电机信息、生产厂商、型号、位置、ID)被设置为tag列,在建表时需要将对应的列后面指定为TSTag;
  • 对于采样数据的维度(电压、功率、频率、电流相角)这些对应的采样数值随时间的变化而变,我们将这些维度设置为field列,建表语句数据类型后面指定为TSField;
  • 最后一列我们指定为时间列time,存储field列数据对应的时间信息,建表时将指定为TSTime。

​ ​ ​ ​ ​ ​ ​ 在写建表语句时,对于tag列的顺序,我们可以适当优化一下,将唯一性(distinct值)较高的列尽量写在前面,这样对于时序场景的性能有一些提升。如果用户没有手动优化,GaussDB(DWS) IoT数仓也可以自适应的帮助用户提高时序场景的性能。
​ ​ ​ ​ ​ ​ ​ 另外,创建时序表时一定要指定表级参数orientation属性设置为timeseries。时序表不需要手动指定DISTRIBUTE BY和PARTITION BY, 默认按照所有tag列分布,且分区健默认为tstim指定的时间列。
​ ​ ​ ​ ​ ​ ​ 对于create table like语法,该语法需要自动从源表中继承列名和对应的kv_type类型。因此如果源表是非时序表,新表是时序表,对应的列的kv_type类型无法确定,则无法创建成功。

总结

​ ​ ​ ​ ​ ​ ​ 在万物互联的时代,时序数据库将会是一个非常具有市场和挑战性的领域。如何帮助用户更好的解决时序场景下遇到的难题,也是华为云服务的宗旨,帮助客户在物联网时代更快更好的适应潮流的发展,发挥出更有力的作用和创造更大的价值。

​ ​ ​ ​ ​ ​ ​ GaussDB(DWS) IoT数仓针对时序场景下的各种特点和技术要求,在高性能(全并行架构、实时分析)、高扩展(1024大集群、逻辑集群)、多模融合、安全可靠(HA、容灾、备份)、智能运维(智能调优,智能调度)等方面,不断进行创新和挑战中前进,为万物互联的美好时代,打下坚实的数据存储基石。

【这次高斯不是数学家】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/345260

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。