vlambda博客
学习文章列表

近距离了解木兰开源社区项目——Apache IoTDB:支持云边端一体化的轻量级高性能时序数据库


木兰开源社区推广项目Apache IoTDB

Apache IoTDB 项目负责人

王建民,清华大学软件学院院长,主要研究领域为大数据管理、分析与过程数据管理。国家支撑计划制造业信息化科技工程专家组成员;国家863计划先进制造技术领域专家组成员;国家重大科技专项“核高基”基础软件方向实施专家组成员;中国计算机学会大数据专委会委员、数据库专委会委员。工业互联网联盟工业大数据特设组组长。

黄向东,清华大学软件学院助理研究员。主要研究领域为时序数据管理与分布式系统建模。

近距离了解木兰开源社区项目——Apache IoTDB:支持云边端一体化的轻量级高性能时序数据库

引  言

“乾道变化,各正性命”,很多情况下,事物的价值和内涵往往存在于变化中,人们对于事物的变化规律的探究也一直没有停歇。从远古时期人们记录天象变化、总结四季更替、到现代人们记录设备运行状态、个人活动记录、股票变化情况等等,记录这些观测对象的变化情况,并加以分析的需求,自古至今一直存在。这种需求伴随着物联网、工业互联网、智能运维等应用的蓬勃发展变得愈发重要。

物联网诞生于1999年,在其理念和技术的不断革新下,无处不在的设备和设施正在被越来越多的通过网络连接起来,并不断向云端发送实况数据。

近些年,工业4.0和工业互联网成为发展焦点。在这次工业革命中,工业生产和运维过程中机械设备产生的数据成为了新的核心资产。

随着Devops的兴起,运维人员开始追求对IT基础设施、各种服务的运行情况了如指掌的境界,从而开始大量采集对这些设施、进程、用户的监控数据。

上述这些场景中产生的数据,主要都是用来描述一个对象在时间维度上的变化的数据,这类数据就被称为时间序列数据。

时间序列数据其实离我们很近。例如,用苹果手机可以看到手机的电量变化情况,谷歌地图的“时间线”功能(用于记录个人的位置服务)记录的个人位置移动,安装了健康应用的每小时步数统计,佩戴的智能手表检测的心率变化都是时序数据;家里安装的温湿度传感器采集到的家里的温湿度变化,空气净化器采集的PM2.5变化,智能插线板显示的用电功率变化,都是时序数据;每天使用的各种网站服务记录的个人行为信息也是时序(文本)数据。

时间序列数据也可能离我们更远,但时刻影响着我们的衣食住行。机房的每台服务器的CPU、内存、网络带宽占用情况的实时变化,气象观测站观测的每刻气象情况变化,汽车、飞机行驶过程中采集的位置、速度、油耗等各种指标值,发电厂、光纤制造塔里的惰性气体含量变化都是时序数据。可见,时序数据无处不在。

近距离了解木兰开源社区项目——Apache IoTDB:支持云边端一体化的轻量级高性能时序数据库

时序数据的定义

研究时序数据的人很多。美国国家标准化委员会NIST将时序数据定义为一系列等时间间隔到达的某个变量的值。TKDE上对时序数据的定义则放松了等时间间隔的约束:一系列时间戳递增的数据点。事实上,通过研究实际场景,我们可以得到更确切的时间序列数据的定义。

以国家级气象观测站为例,全国有近6万个气象观测站,每个气象观测站有70种气象物理量需要采集。某市地铁每列列车拥有3200个指标需要测量,全市列车数达300列。服务器运维监控中,一台服务器需要同时监测IOPS、CPU、网络等十余项指标,而服务器中的重要进程还需要监测CPU占用率、存活时间等指标。这些例子中展现出两个概念:设备与度量指标。所谓度量指标(又被称为工况、测点)是指用户关心的能反映目标的某种状况的数据项,例如CPU利用率、温度、湿度等等。设备是指一个拥有一系列度量指标的实体,例如一台服务器、一个进程、一列车、一个气象观测站等等。一个设备的一个度量指标形成了一条时序数据的唯一标识。随着时间推移,这条时序数据会产生一系列(时间戳,值)的二元组数据点,构成了时间序列数据集。因此,我们定义一条时间序列是由一个时间序列标识(设备和度量指标),一系列时间戳和数据值对组成的无限集。一个时间序列数据库将管理百万甚至千万条这样的时间序列。

如图所示,在对汽车的状态监控中,汽车可以作为设备(国家、地区、车牌号组成了设备ID),而剩余油量、车速则是两个度量指标。因此该图中有4条时间序列(2个设备,2种度量指标),其中3个序列有2个点,一个序列没有数据。

近距离了解木兰开源社区项目——Apache IoTDB:支持云边端一体化的轻量级高性能时序数据库

近距离了解木兰开源社区项目——Apache IoTDB:支持云边端一体化的轻量级高性能时序数据库

时序数据的管理需求

工业中的时间序列数据具有超高通量的特点。由于工业设备的数量可能非常庞大,同时每一个设备上都会有着上百种传感器同时采集数据,并且这些设备很多都是 7*24 小时不间断地运行,因此其采集的时间序列数据是源源不断的。以我国某企业制造的风机组管理为例。当前其拥有近3万台风机,其中 多数风机可以采集时序数据并向数据中心回传。以每个风机上约 100 种测点(传感器)为例,总时间序列数量可达数百万条。以其 SCADA 系统中的 7 秒时间间隔采集数据 为例,一天将产生 271.5 亿个数据点。又以某市地铁应用为例,单列车拥有 3200 个测点,当前采集频率为 500 毫秒/次,共有 180 列车,其每秒的吞吐量达 118 万点每秒。未来的采集间隔将缩短至 200 毫秒,列车数量将增至 300 列,则每秒吞吐量将达 492 万点每秒。可见,必须首先解决数据的存储效率问题,才能有效管理工业场景中的时序数据,从而进一步利用其价值。更甚至,由于这些数据是昂贵的设备在真实生产环境中产生的,其数据价值远高于模拟仿真数据,随意删除这些数据将给日后的数据分析带来巨大的损失,因此全时全量的存储是必需的。

在此基础上,工业中的时间序列数据还具有低质乱序传输的特点。在一些实 际应用场景中,时间序列数据存在乱序的问题。例如:在物联网与工业传感网中, 因为基础设施或者网络的不稳定,数据的采集和回传会出现中断,在这类情况下数据会出现一定范围的乱序;还有一些比较严重的情况,数据在进入存储系统之前需要经过 kafka等流式处理系统的处理,同一条时间序列数据可能会被 kafka 的多个 partition 消费,从而导致数据在写入存储系统的时候出现乱序。此外,由于 PLC 与 DTU 模块的衔接或网络等问题,一些数据点会在回传前或者回传过程中丢 失,造成数据缺失等质量低下问题。

此外,工业中的时间序列数据具有高质全序查询的特点。时序数据虽然在写 入过程中存在乱序现象,但用户在查询过程中,大多都是要求按照时间维度顺序读取数据。此外,工业互联网中设备的每个传感器会产生一条甚至多条时间序列数据,这些时序数据最有效的存储方式是采用列式存储。然而,实际应用中需要对一个设备的多个度量指标数据,或多个设备的数据同时进行分析,这就要求必须将多条列式存储的时序数据进行连接查询(即按时间戳对齐查询)。该查询的性能对数据分析的效率起到了决定性作用。

近距离了解木兰开源社区项目——Apache IoTDB:支持云边端一体化的轻量级高性能时序数据库

时序数据的分割也是面向时间序列数据的一种典型查询应用。由于某些设备往往是在怠速和带负荷工作两种状态之间频繁切换,而怠速状态下的数据也有可能会被持续采集。这时候若将整条时序数据看做一体,则会对平均值、趋势等分析造成影响,因此将一条时序拆分成若干子序列,是时序数据特有的高级查询。

近距离了解木兰开源社区项目——Apache IoTDB:支持云边端一体化的轻量级高性能时序数据库

最后,工业应用不仅对时间序列数据的管理提出了高要求,还对时间序列数 据的分析效率提出了需求。由于工业时序数据具有体量大的特点,在分析时将数据从 OLTP 型数据库中经过数据重组织、进而 ETL 到支持 OLAP 的系统或者大数 据计算平台上是一个费时费力的过程。因此,如何实现系统的查询分析一体化,也是亟待解决的问题之一。

现在有很多种数据库可以用于管理时序数据,包括关系数据库和NoSQL数据库和时序数据库,但是他们都存在或多或少的问题。以关系数据库为例,其 schema是有限制的:比如MySQL InnoDB中单表的列数上限为1017列,PostGreSQL的列数上限是1400多列。然而,一个设备可能拥有上千个测点甚至上万个测点,一张关系表的列数是不够的。此外,在关系数据库中若单表的行数超过千万量级,性能往往会大幅下滑。因此就需要DBA进行复杂和精细的水平垂直分库分表。带来了使用上的不便。此外,关系数据库的写入性能也远远达不到时序数据的要求。对于以键值为代表的NoSQL数据库而言,其高速的写入性能在一定程度上解决了关系数据库的性能问题,灵活的schema也解决了关系数据库的表行、列数量的限制,但是其能够支持的查询往往没有关系数据库丰富。前文提到的时序数据时间维度的查询、值查询、多序列聚合、多序列时间对齐等查询都存在较大的挑战。TimescaleDB、OpenTSDB、KairosDB等基于关系数据库或NoSQL数据库的系统在一定程度上解决了上述的问题,但难以根本上解决,例如TimescaleDB随着导入时间的增加其导入速度速率会不断地下降。KairosDB在压缩、查询和写入性能上表现都不够突出。一些原生的时序数据库如InfluxDB针对时间序列数据进行了专属的文件结构优化和专属查询优化,然而在一些工业场景下仍然存储无法存储全量数据、性能不足的问题。

综上,我们认为时序数据库应该具有以下功能。

近距离了解木兰开源社区项目——Apache IoTDB:支持云边端一体化的轻量级高性能时序数据库

近距离了解木兰开源社区项目——Apache IoTDB:支持云边端一体化的轻量级高性能时序数据库

Apache IoTDB时序数据库

为了解决以上问题,满足工业领域时序数据的存储、查询特点,清华大学软件学院从零设计并实现了高效轻量的物联网时序数据库 IoTDB。在研发过程中,突破多项核心技术,提出时间序列存储格式、针对时间序列数据改进的LSM引擎、海量数据范围的新型聚合索引、设计双层元数据组的分布式架构。2018年11月,经国际顶级开源基金会Apache评估和认可,IoTDB成功进入Apache孵化器,成为中国高校目前唯一主导的Apache项目。现已有来自德国、澳大利亚、美国、印度等国外以及阿里、联想、华为、四维图新的开发者。

IoTDB具有以下特点:

(1)开放的架构:IoTDB 架构图如下所示,采用存储和查询分离的架构,将底层存储开放给上层应用,一份数据既支持实时查询,也支持大数据分析,避免了数据迁移代价。
(2)新型文件存储格式:底层存储采用针对时间序列优化的文件格式 TsFile,采用灵活的元数据管理和写入控制,支持各时间序列独立写入,采用时间序列原生的列式存储与序列编码、压缩方式。
(3)高速数据写入:IoTDB 提供数千万点每秒的写入吞吐,同时具有低延迟。支持单节点每秒数千万点的写入速度,可处理乱序、重复数据,有效管理万亿数据点。
(4)高效的索引结构:如聚合索引PISA支持高效的聚合查询、多分辨率数据查询。KV-index支持复杂的子序列匹配等高级查询。
(5)与大数据系统充分集成,支持MapReduce、Spark、Grafana、Zeppelin、Flink、RocketMQ、Kafka、Pulsar等。

 

近距离了解木兰开源社区项目——Apache IoTDB:支持云边端一体化的轻量级高性能时序数据库

近距离了解木兰开源社区项目——Apache IoTDB:支持云边端一体化的轻量级高性能时序数据库

Committer情况

IoTDB社区的发起人来自于清华大学,由清华大学软件学院王建民教授立项,黄向东等前后三十余名博士生、硕士生一直参与其中进行的初期开发。这些开发者们毕业后继续在清华大学、微软、头条等企业仍然保持着对项目的贡献。

在德国和欧洲地区,在工业4.0的热潮下,IoTDB社区吸引了Julian等许多欧洲开源人士的关注。目前,在PLC4X、Karaf等社区开源贡献者的帮助下,IoTDB已经与这些项目进行了集成,并正在与StreamPipes、Prometheus等项目展开集成。

在国内,阿里等大型IT企业对时序数据库的关注也来越高,IoTDB社区目前与Flink、RocketMQ社区紧密合作,大量这些社区的开发者们同时也是IoTDB社区的贡献者。

国内的主要工业互联网企业,如海尔、联想、东方国信、深信服等,也都纷纷参与到了IoTDB的贡献中。

近距离了解木兰开源社区项目——Apache IoTDB:支持云边端一体化的轻量级高性能时序数据库

更多木兰开源社区项目详情,请点击“阅读原文”

近距离了解木兰开源社区项目——Apache IoTDB:支持云边端一体化的轻量级高性能时序数据库
木兰开源社区 (https://mulanos.cn/)是2018年国家重点研发计划“云计算和大数据开源社区生态系统”项目重点成果,由中国电子技术标准化研究院牵头,联合北京大学、国防科大、联想、腾讯云,以及开源中国、北航、中科院软件所、西南大学、华为、阿里云、浪潮、新华三、中电标协、中科院东莞育成中心、湖南酷得共16家单位共同承担。木兰开源社区立足中国,面向国际,联合汇聚国内开源生态圈相关方,共同打造国内开源生态,推动本土开源项目孵化,在推动培育开源贡献文化的同时,与国内外各开源社区融合发展。