黄向东:工业物联网数据库 IoTDB及其应用

本文约7200字,建议阅读15分钟

本文分享关于工业时序数据库IoTDB(全称Apache IoTDB)及它的一些应用。

IoTDB源自清华大学软件学院。王院长带领团队从2011年开始关注,2014/2015年开始研制,一路走来始终围绕工业数据软件,其中包括了数据管理软件、机器学习软件、数据处理软件以及应用开发软件。我主要负责数据管理软件。让数据发挥价值,首先要把数据管起来,便于未来的数据处理和应用开发。

今天分享关于工业时序数据库IoTDB(全称Apache IoTDB)及它的一些应用,主要分四个方面:IoTDB在解决什么类型的数据;它和工业之间的关系是什么;对于这类数据有哪些管理的挑战;IoTDB有什么特性以及我们的一些应用实践。

工业与时序数据

我们要管理的工业数据到底是什么,它和工业之间是什么关系?如下图所示,随着产业的发展,生产型制造在整个G D P的占比会越来越低,而服务型制造会快速发展。其本质是随着竞争越来越激烈,怎么才能在有限的生产资源下提供更强的生产力,以及在相同的生产力下怎么能将自己制造出来的产品价值进一步提升?

在疫情影响下,很多工业企业进一步加强生产制造的产品自身的价值,并基于产品做增值服务,提升竞争力。那怎么做才能让这样一个向下的曲线变成一个向上的绿色曲线呢?

大数据是整个工业数字化转型升级中的核心生产资料和关键赋能技术。大致分成三类:

第一类,是工业信息化数据,来自传统的CRM、PLM等系统,包括生产过程中的订单信息、维修信息等等,主要是人为产生。第二类,是跨界数据,因为所有的生产运行一定和大环境相关,例如灾害天气、油价提升等问题都会对工业最终生产价值产生一些波动。第三类,是机器设备产生的数据,这个时代的工业设备,带有大量的传感器,帮助人们去诊断和查看设备的运行状态,从而更有效地去管理或者运维这些设备。

这三类数据共同构成了工业大数据的主体,今天我们主要讲的机器设备的数据和人产生的数据很不一样。很多情况下,机器7X24小时工作,比如一个发电厂点一次火,可能需要几百万的投入,一旦点着了火,即使电量饱和要降低生产,也只会降低功率,并不会停工把机器关掉。很多大型设备需要连轴转很多天,而且设备采集数据的频率可能会很高,每秒、每毫秒甚至每微秒会采一次数据。由此,这些机器设备产生数据的速率会远远高于人产生数据的速率。

慢慢地,机器设备变成了产生工业大数据的主体。而有了这些数据之后,人类可以更好地去驱动或调整这些设备,于是这些设备本身也成了消费这些数据的主体。这些机器设备数据就是我们今天要讲的时序数据。

为什么叫做时序数据呢?因为这些数据最典型的特征是记录了每个设备在不同时刻的某些指标的变化情况。如果用一个关系数据库来看,它就是一个表的结构,可视化出来,横轴做时间轴,就会看到每一条时序在表示一个设备的某些物理量或指标在时间维度上的变化。

时序数据和工业之间的关系

GE早在2012年就指出,海量时序数据是未来驱动新一代工业革命的历史性机遇。

以电力为例,发电、输电、配电各个环节的自动化系统,一直在产生和收集这些数据,大量数据怎么去管理和使用,才能保障安全、优化供需平衡?

例如,金风通过收集风速数据和风机转向角的数据和发电数据,可以有效帮助每一台风机提升它的发电量,从而产生非常直观和大量的经济价值。

在制造环节,不管是离散制造,还是流程制造,都有大量的工艺参数数据值得被收集,从而进一步保障生产安全以及提高良品率和产能。例如半导体行业做SMT元器件的贴桩,通过收集每一个元器件的面积、高度、体积、偏移值等数据变化,能尽早发现SMT产线上刀片磨损程度和锡膏浓度对良品率的影响。同时,通过这些时序数据,可以训练出来一些对应的模型,增强监测设备的复判能力,降低需要二次人工复判的工作量,进一步提高良品率的稳定性。

通过对工程机械实际油耗的消耗程度、设备所处地理位置信息的变化、当时的载重和司机踩油门的轻重等系列数据的收集和分析,能帮助司机,合理规划应该怎么踩油门、怎么去跑线路才能使工程机械最省油。在工业运输和工程机械的使用过程中,省10%的油,就能带来很高的经济效益。

要在工业场景中持续发挥数据价值,本质上取决于到底能采集和管理多少时序数据。现在很多智能设备都号称可以监测设备的实时状态,但只管理了实时数据。当这些实时数据能被存到数据库中变成历史数据,就可以进一步做更多有价值的探索。

下图从左到右是对实际数据管理从少到多的一个过程,同时,也是时序数据能发挥出来的价值从低变高的过程。有了实时数据,就可以做状态监控、远程运维;有了较长时间的数据,就可以对这些设备做一些数字画像,进行健康评估,发现劣化趋势,进行故障预测和备件调度;有了设备全生命周期的数据,就可以通过它服役状态下的设备表现情况,对它的制造工艺进行改进和控制。历史数据沉淀得越多,可挖掘的价值深度就越高。

时序数据管理的新需求和新挑战

在工业行业,时序数据并不是一个新概念,自动化设备被发明出来并且被大批量使用的时候,这些数据就已经被收集和存在了DCS系统。为什么现在又重新把这些数据拿出来讲?因为在工业领域的需求在发生变化。

传统DCS系统大多部署在工厂侧,但是现在有智能电表、智能网联车、智能路灯以及许多可移动的智能设备,这些设备也具备了数据的采集能力,数据都需要被管理。

同时,为了做更精细的应用,设备采集数据的频率可能从原来的五秒钟一次变成了现在一秒钟一次,甚至一毫秒一次,这对底层的数据管理系统的性能要求大幅提高,从原来的数万点每秒到千万点每秒甚至一亿点每秒。

而传统的状态监测和实时告警等应用,对历史数据的存储需求并不高,所以很多情况下,大家会采用采十寸一、采百存一的策略,只存下来部分关键数据,而那些正常或细微变化的数据就丢掉了。但量变引起质变,正是这些细微的变化,帮助我们更快更深地洞察问题,所以现在逐渐向应存尽存、全量存储转变。

此外,以往在设备侧产生数据之后,就向云端发送,在数据中心端就可以看到数据。现在由于硬件越来越便宜,边缘计算能力在增强,本地智能化也需要有数据管理能力,并且能和云端做很好的协同。在上述新需求下,如果这些时序数据只是简单存下来,就是不停增加管理成本,只有对数据进行充分的分析、计算,才从成本变成价值。这个过程中,工业用户独特场景带来的时序数据管理的挑战很多。

工业设备足够复杂,尤其是昂贵的工业设备上观测的指标数量非常多。以一个电厂为例,由于一些历史原因和二次加工数据,一个电厂需要被观测的指标可能超过三十万个;此外,为了做振动分析,这些数据的采样频率可能达到兆赫兹的级别。

由于工业场景的环境恶劣和工业控制器的升级问题,很多实时数据并未按照时间产生的顺序到达云端。而一个工业设备可能由多个控制器来组成,且品牌不一,由不同的控制器根据零部件的重要程度不同来决定采集数据的频率,采集数据的起始时刻也不一样。如果用一张表来表示,会看到虽然这个设备有三十万个指标要监测,但是某一个时刻下可能只有七八个指标,另一个时刻下有30个指标。这样参差不齐,会使得用户将来使用数据的成本和难度大幅提升。

边缘设备迭代快。以前一个设备监测三五个点,随着应用的逐渐深化,有更多重要的点需要监测,给设备做诊断时加装小零部件,又增加了一些可采集和可传感的数据。

用传统的关系型数据库存储时,对于schema的维护工作量非常大,并且往往会出现一些错误,导致采到大量数据却无法入库。IoTDB针对这样的情况,采用了云端适配边缘端的方法,根据传过来的数据自动创建这个序列的元数据,来降低管理成本,并且尽可能地让更多数据入库。

复杂设备测点数海量。传统关系数据库会用垂直分表方案,把一个表纵向切成几个表,去表达一个复杂对象或复杂设备,这会造成额外工作量且性能低。而IoTDB容纳的时间序列数量无上限,允许对于单个设备任意复杂化地去描述其资产管理关系和设备的组成关系,以及这些组成关系和零部件上各个测点的关系。

采样频率高。当采样频率变得很高时,用关系数据库易达到1000万行的单表存储上限,且水平分表分库等方案需要每天分表,所以在很多IT系统里有一些日表的概念。这会对查询等操作带来困扰。IoTDB对时序数据的特有处理,能帮助用户持续高效地写入、查询和管理超高吞吐量的数据,并且存储成本非常低。容纳PB级别数据。

各数据独立采集。一个设备上不同零部件的数据采集是独立的,采集频率不一样,采集时刻对不齐,会造成在可视化或者做两条序列的相关性分析等时候,出现向量长度不一样等现实问题。IoTDB把数据整理工作,下放到数据库中,让数据库支持时序数据把多条序列按时间对齐,把缺失的值进行空值填充等方式,让用户更方便地使用数据、发挥价值。

工业环境数据乱序到达。工业环境网络质量难以保证,经常出现如延迟、断网,导致数据无法完全保序到达。而IoTDB 支持时间序列的乱序写入。

总的来讲,对时序数据的处理,一些时序数据库不论是在性能、功能、存储成本上,都存在一定的不足。市面上也有很多新的时序数据库,但它们的应用场景和底层技术栈不是面向工业设计的,而是面向互联网企业应用性能监控的场景而设计,面对工业场景下特殊需求,就会出现很不稳定或者很差的性能表现。

IoTDB与衍生产品

做IoTDB的初衷,是帮助工业用户解决时序数据的存储查询使用问题,能支撑机器数据海量读写,能支撑用户超低成本地存储数据和深度的分析挖掘。我们希望IoTDB成为智能制造或者是未来工业物联网的基础设施之一。

IoTDB的主要特性,除了高吞吐数据、低成本、高压缩、高可用外,还有面向物联网原生的模型和端边协同的模式。作为数据库,它也给用户提供了写入和查询的接口形态。

IoTDB起源于863计划的一个课题,和国内的某家龙头工业企业合作的过程中注意到,他们的工程机械设备数据在Oracle中管理出现了瓶颈,上层没办法进一步做业务运用。

从2015年,我们开始自研IoTDB,在很多场景和技术上做了验证。2018年,我们正式把IoTDB推到Apache基金会,吸引了国内和国际上一系列的同行,围绕IoTDB做一些开发和使用。2020年,IoTDB正式毕业,成了Apache的全球顶级项目。之后在持续的推广过程中,IoTDB拿到了国内一系列的开源奖项。

目前,IoTDB是Apache物联网数据库的唯一项目,甚至可以说是唯一一个专门为时序数据打造的项目。IoTDB也入选了国家“十三五”科技创新成就展、北京市科技进步一等奖等。IoTDB自主研发过程中产生了大量面向时序数据的新专利,也发表了一些论文。它是一个物联网原生的时序数据库,具有它自己的基准性能。

我们希望通过这个产品帮助用户利用数据提质增效、降低数据的管理成本。最重要的是,能低成本、高性能地给用户提供服务,更便捷地从其他的系统中把数据导入IoTDB,提供丰富的数据处理生态和一站式解决方案。

和一些其他的开源系统对比,IoTDB写入性能遥遥领先,并且在实际的用户案例下,一台IoTDB可替代原来15台NoSQL数据库服务器组成的集群。从查询性能上,IoTDB不管是原始数据查询还是聚合查询,都领先同类产品。一个IoTDB就能同时满足实时数据监控以及海量历史数据查询。

IoTDB树型结构管理的数据模型非常适合工厂。一个工厂同一个型号的生产设备不止一台,这些相同型号的设备,当观测指标都相同的时候,IoTDB提供了模板化管理方式。对于设备上多个指标,它能同时去采集;采集频率也相同的时候,可以用对齐的采集模式。对于不同时刻采集,采集频率不一样的形式,我们提供了单元序列的方式,各测点独立采集。对于这些数据,既有静态的数据管理,也有沿时间变化的数据管理。此外,也可以在树上添加一些节点,实现动态模型化。

虽然对传统的IT人员有一些学习成本,但对于OT域人员,这和业务场景更匹配。为了实现低成本的存储,我们自研了一个列式文件格式叫Tsfile。它既有列式的存储形态,又有高压缩的编码结构,还有各种各样的分段聚合的语句和信息,帮助用户尽快做降采样、聚合查询、生成报表等。在文件的末尾,我们也有文件集的索引来帮助用户在海量的数据下快速查找数据。

当采样频率提升到毫秒级之后,要做可视化或者做不同应用,需要查询数据的采样频率是不一样的。因此我们给用户提供了实时降采样的能力,将一条序列降采样成数据密度更稀疏的序列,来减轻业务端或应用端的压力。我们可以把处理后的降采样或者其他结果,再重新写回数据库,从而将原始数据、加工后的数据、再一次加工后的数据分别生成出来,最终变成一些知识和决策。

对于质量不高的数据,可以通过简单的降采样,再把数据按时间对齐,并把每分钟里缺失的数据进行补全,来帮助用户拿到一个更整齐和更便于分析的数据。除了写入建模、写入查询以外,IoTDB提供了大量的分析函数,支持定制化分析,自行开发和创建函数以满足工业机理分析。目前,IoTDB已经陆续完成了75种函数。

不止于此,从数据进到IoTDB开始的采集、存储、查询和分析全生命周期,都提供了数据计算的能力。当一个数据采集过来要写入到数据库,就提供了触发器机制。用户对每个新写入的数据都可以去做预知、判断、告警,都可以对数据进行加工和修改,把多个数据计算a+b衍生出来c计算出来衍生变量。

当数据进入到数据库之后,我们也给用户提供了一个后台离线的计算模式,帮助用户把数据查出来,进行处理,之后重新写回数据库。在数据库中,它可能被叫做物化视图。通过定期执行的方式,在后台不繁忙的时候帮助用户把原始数据逐渐加工出来。用户实时查询的时候,通过UDF函数机制,也可以实时做一些计算。

当把IoTDB和spark、flink等等大数据生态集成之后,就可以做更多的大数据分析应用。整个过程中,既可以对每个采过来的数据值做计算,也可以按照时间窗口做计算,让用户自定义自己的计算逻辑,帮助用户更好地整理数据。

此外,IoTDB端边云协同的设计理念,希望打破原来端测产生数据之后,要在本地编码解编码,压缩之后传到云端,解码再解压,再把数据写入到数据库,数据库耗费CPU和内存对数据进行排序和键索引的过程。当端侧有了足够的计算能力,就可以把数据编码,上传到云端,云端可以直接落盘并分析使用了。这种模式下,云端CPU使用率大幅减小,网络带宽也会大幅降低。我们也和一些生态软件进行了搭配,用户可以很方便地拿我们的数据库去做数据可视化、数据交互式分析,以及用大数据spark等标准语言做时序数据的分析应用。

IoTDB继承了很多属于Apache的开源项目,以及部署Apache,覆盖从采集、处理、分析、应用的各阶段。

作为一个时序数据库,IoTDB更多是提供时序数据的建模查询、处理分析,和低成本存储的能力。在此之外,我们也逐渐围绕IoTDB衍生出向前向后的一些功能,帮助用户更好的去做数据的采集告警、基于规则引擎的计算来产生更复杂的告警、对数据进行组态可视化、对数据进行交互分析和大数据分析等。

应用案例

清华已推动IoTDB很多年,陆续得到开源用户和企业客户的大量使用,目前已服务几百家企业。包括一系列中字头的企业、工业龙头企业,以及国家的一些双跨平台。

目前用得最远的是在一颗卫星上,有一个小的盒子里面安装了IoTDB,在太空中去管理现场的实时数据。稍微低一些,是管理飞机的数据,中国商飞的大飞机C919试飞阶段的数据管理用的是IoTDB,成飞无人机的试飞数据等也是在用IoTDB。目前,IoTDB已经管理了几万亿个数据点,数据量达到十几个T。

在地面,我们跟大量的工厂、地铁车辆做了链接;在海上,我们和中船合作,管理船舶和水文变化数据。

IoTDB在国际上也有大量用户,和德国的企业合作去服务宝马、德铁等企业。和博世、西门子等企业的合作也在陆续展开。

首先讲讲国内的应用:

和中车合作,管理上海地铁所有列车的数据。之前是15台KairosDB+底层Cassandra,管理144列车的数据,每列车有3000个测点,采样频率是500毫秒采集一次。升级后,单台IoTDB就可以管理这种数据量级,并且能大幅提升上限容量。当系统完全切换成IoTDB,我们将它原来在CTV中三年的数据重新导入,过去用其他系统三年存储的200TB的数据,在IoTDB能被压缩到16TB,几乎降低了90%的存储成本。

和博世合作,博世的ctrlX AUTOMATION,图中右上角亮灯的小盒子,在工厂侧可以直接部署应用。一定程度上和国内的工控机有点像。但是因为和博世的其他设备打通得更好,所以它潜力极大。之前,盒子不具备管理历史数据的能力,我们把IoTDB安装在盒子内,现在它可以管理历史数据。上个月,此产品在德国博世的展会和SPS展上进行了发布。

和湖南中烟合作,两三年前,帮助管理集控车间和工厂的数据,监控制丝和卷包车间 260 个设备的状态,涉及90135个时间序列数据的采集,将多个工厂的数据汇总到公司级大数据平台,形成了车间、工厂、集团这样多层次的数据管理体系,管理各种制造过程中工艺参数数据,提升生产效率、降低损耗。

和大唐先一合作,在4个火电厂和60多个新能源发电企业替换掉open TSDB,对数据进行管理,原来需要一个集群才能搞定的事情,现在单个节点就能搞定,减少 95% 运维成本。

和国家电网合作,应用于成都世代积家充电场站、北京亦庄光伏场站等业务场景,把IoTDB放在电表箱内部,实现了充电场站实时状态监测,及本地负荷计算、谐波计算、终端故障预警等能力。

和长安汽车合作,帮助长安汽车把数据汇总到云端,建设了云平台,使得原来做一些故障数据查询的响应速度,从分钟级提升到秒级,带来更好的用户体验,从而去做更多的业务应用。

和太极合作,是一个火电厂的应用,使用 IoTDB 替换 Apache Druid, 构建发电机组的远程分析平台,管理了11个发电机组的数据,大幅降低了运维成本。

和中国气象局合作,把全国十万个地面气象观测站的实时数据进行存储。之前不方便查看单站数据,尤其不方便查看单站一段历史时间数据,因为气象预报员预报数据的时候,一定程度上会依赖于所谓的视觉残差。要快速查看数据在不同时刻的变化情况,在视觉上形成动画效果,这就要求数据库能非常高速的去突出每个时刻的数据变化情况,IoTDB恰好满足这样的场景。

和东方国信合作,打造东方国信Cloudiip平台,连续四五年入选国家十大双跨平台。底层的时序数据库是基于IoTDB,并且基于IoTDB发布了CirroData-TimeS 的衍生产品。

和用友合作,管理了工厂生产设备的数据。用友目前也在基于IoTDB打造对应的产品。还有一些和工业稍微离得远一些的应用场景,包括金融、DFS等场景。欢迎大家关注开源项目IoTDB。