浅谈时序数据库 Apache-IoTDB 源码解析之前言

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 

这一章主要想聊一聊:

  1. 为什么重复造轮子,从物联网行业的数据特点到 IoTDB 的发展过程
  2. 这个轮子造的怎么样,IoTDB 和竞品测试对比

时序数据

我个人理解时序数据是基于时间维度的同一个物体或概念的值构成的一个序列数据。在传统关系型数据库中,例如 MySQL,我们通常会放置一个自增的 Id 列作为主键标识,如下:

Id人名体温测量时间
1张三36.52020-02-06 9:00:00
2李四36.92020-02-06 9:00:00
3王五36.72020-02-06 9:00:00
4张三36.32020-02-06 9:30:00
5张三36.92020-02-06 11:00:00

上面的表结构就是一个时序数据,将表结构做个变形更容易理解:

时间戳人名体温
1580950800张三36.5
1580950800李四36.9
1580950800王五36.7
1580952600张三36.3
1580958000张三36.9

如果把时间作为一个唯一键对齐展示,能够更像时序数据一些,这也是 IoTDB 中查询结果的展示方式:

时间戳张三李四王五
158095080036.536.936.7
158095260036.3NULLNULL
158095800036.9NULLNULL

这里可能会存在疑问就是假如人数是逐渐增加的,那么是动态创建列呢?还是提前创建足够多的列?这个问题等后面文章有机会继续介绍

物联网

物联网的特点是都会存在一个或多个设备,他们以各种各样的形式组织到一起,用来观测或记录同一时间里相同环境所产生的数据。下面的介绍中,使用由简单到复杂的数据逐步介绍在物联网行业中,通用的一些问题和方向。

1.基本存储

假如我是一个公司,对外播报北京、天津、上海三地的温度数据,从而实现盈利。

时间戳北京天津上海
158095080020.522.921.7
158095260020.5NULL22.9
158095800020.521.722.9

2.保证数据质量

数据保证的质量是多方面的,一步一步介绍。

2.1 更多设备

首先可以看到上面数据是存在 NULL 值的,这个 NULL 值有可能是因为当时设备所在的区域停电了,所以并没有办法上报当时的情况,这样客户如果想获取1580952600 这个时间戳对应的天津的数据的时候,肯定是拿不到了,所以传统思维上,我们应该增加一个容灾设备,保证一个设备在坏掉、停电、人为损坏等等的情况的时候,依然能够有数据上报回来。

基于这样的思想,以上的表结构就会变成:

时间戳北京 1北京 2天津1天津2上海1上海2
158095080020.520.921.720.920.721.7
158095260021.521.0NULL21.721.721.7
158095800022.522.722.922.7NULLNULL

2.2 更高采样频率

这时候依然存在问题, 1580958000 这一刻两个设备都没有数据,有可能是放置设备的区域同时出现了断网或者断电,这种情况下,我们可以采用提高采集数据的频率或者补传数据来解决(补传暂不讨论)。

我们将每天数据分为3组,每组采样3次,间隔为1个小时,假如时间分布为:上午(7、8、9)、中午(12、13、14)、下午(18、19、20)。当增加了采样频率之后,即便某一刻出现了 NULL 数据,我们也可以采用临近时间做为补充。为了方便对应,下表数据中增加时间点列辅助查看。

时间点时间戳北京 1北京 2天津1天津2上海1上海2
7点158094360020.520.921.720.920.721.7
8点158094720021.521.0NULL21.721.721.7
9点158095080022.522.722.922.7NULLNULL
12点158096160020.520.921.720.920.721.7
13点158096520021.521.0NULL21.721.721.7
14点158096880022.522.722.922.7NULLNULL
18点158098320020.520.921.720.920.721.7
19点158098680021.521.0NULL21.721.721.7
20点158099040022.522.722.922.7NULLNULL

可以看到经过各种各样的需求之后,上传的数据是成倍增长的,不难想象如果这个温度数据希望精准的获取到每个县城的温度,那么中国有 2854 个县城 * 2 个温度设备 * 9 条数据 = 1 天产生的数据总量 = 51372 条,那么一个月就是 1541160 条。

数据实时性及总量

假如上面的数据我们继续提高频率到每1分钟每个设备上报一次,那么数据量就会成为 2854 * 2 * 60 * 24 = 246585600 条/天。

在这样的数据量下,实时插入实时做一些聚合计算,应该传统数据库就有些处理不过来了。

IoTDB 的前身

某公司在实际业务中,20 万设备保存了 3 年的数据,TB级别的数据使得 Oracle 被拖的根本吃不消。关键的问题点还不仅仅是存量数据大,新增数据依然以非常快的速度在增长。后来公司联系到了 IoTDB 的第一批开发者,但是当时的方案还是基于 Cassandra 来做设计,当时规划了 5 台机器的集群,性能刚满足,但随着时间推移设备总量在增加,业务系统的查询请求量在增加。Cassandra 在经过大量的努力之后,最后发现如果再改可能就需要大面积的重构 Cassandra 数据的代码了,最终决定重新设计一个存储方式,来解决物联网场景下的时序数据高效写入、低延迟读取、高压缩比持久化。

PS: 以上都是黄向东 (IoTDB PPMC) ,在 meetup 中讲到的,我只是在脑中存留了一部分,具体的细节大家可以到 IoTDB 社区交流。

性能对比

测试工具使用的是由清华大学大数据实验室开发的iotdb-benchmark

1.写入性能对比

数据集2客户端存储组设备变量batchsizeLOOP数据量写入速度(point/s)硬盘数据大小
IoTDB10101010100010000001E+1124750321.9338306092
InfluxDB10101010100010000001E+11 304682932
TimescaleDB10101010100010000001E+11737689.221610219064
数据集1客户端存储组设备变量batchsizeLOOP数据量写入速度(point/s)硬盘数据大小
IoTDB1010101010001000001000000000020706345.153599732
InfluxDB101010101000100000100000000001729907.8130546560
TimescaleDB10101010100010000010000000000715857161026468
KairosDB1010101010000100001000000000024924.9776263380

上面一组数据可以看出写入性能高于同款数据库10倍有余,单机写入速度高达到每秒2千万。且硬盘占用是最小的,这在数据比较大的线上业务中,可能每个月会差出来 1 到 2 块硬盘。

2. 查询性能对比

原始数据查询

 客户端存储组设备序列-数据量变量查询点数LOOP速度(point/s)AVGMIN
IoTDB1010101.00E+091100000010012942984.85740.27457.04
InfluxDB1010101.00E+09110000001001779606.455914666.39
TimescaleDB1010101.00E+09110000001003781467.522345.691193.78

聚合数据查询

 客户端存储组设备序列-数据量变量LOOP范围速度(point/s)AVGMIN
IoTDB-11010101.00E+0911000.000149.7527.8718.03
IoTDB-21010101.00E+0911000.00149.7549.1419.87
IoTDB-31010101.00E+0911000.0149.7648.6922.32
IoTDB-41010101.00E+0911000.148.6899.1425.56
IoTDB-51010101.00E+091100114595.6145.54
InfluxDB-11010101.00E+0911000.0001234.3240.2821.63
InfluxDB-21010101.00E+0911000.00128.88341.9238.1
InfluxDB-31010101.00E+0911000.013.073226.872664.86
TimescaleDB-11010101.00E+0911000.000142.39220.57120.5
TimescaleDB-21010101.00E+0911000.0015.81502.9754.15
TimescaleDB-31010101.00E+0911000.011.029711.557148.69

3. 对比图

硬盘占用及速度对比

查询响应延迟对比

整体来看 IoTDB 无论在写入、原始数据查询还是聚合查询,都几乎是10倍的性能于竞品数据库,而且硬盘占用又小于同款数据库10倍,那么 IoTDB 是怎样完成如此高的压缩比、如此恐怖的写入速度、如此高效的查询呢?欢迎继续关注。。。

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读/书籍书单大全:

(点击右侧 即可打开个人博客内有干货):技术干货小栈
=====>>①【Java大牛带你入门到进阶之路】<<====
=====>>②【算法数据结构+acm大牛带你入门到进阶之路】<<===
=====>>③【数据库大牛带你入门到进阶之路】<<=====
=====>>④【Web前端大牛带你入门到进阶之路】<<====
=====>>⑤【机器学习和python大牛带你入门到进阶之路】<<====
=====>>⑥【架构师大牛带你入门到进阶之路】<<=====
=====>>⑦【C++大牛带你入门到进阶之路】<<====
=====>>⑧【ios大牛带你入门到进阶之路】<<====
=====>>⑨【Web安全大牛带你入门到进阶之路】<<=====
=====>>⑩【Linux和操作系统大牛带你入门到进阶之路】<<=====

天下没有不劳而获的果实,望各位年轻的朋友,想学技术的朋友,在决心扎入技术道路的路上披荆斩棘,把书弄懂了,再去敲代码,把原理弄懂了,再去实践,将会带给你的人生,你的工作,你的未来一个美梦。

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页