TDengine能比Hadoop快10倍?
之前对国产的时序大数据存储引擎 TDengine 感兴趣,因为号称比Hadoop快十倍,一直很好奇怎么实现的,所以最近抽空看了下白皮书和设计文档。
如果用一句话总结,就是 TDengine 是为特定的工业物联网领域而生,为时序数据做了针对性的优化也有一些限制,所以能比 Hadoop 快。而 Hadoop 运用于工业物联网的时序数据的场景下,也是有点不合时宜。因为它是为了Map Reduce而生,想解决的是一次写入、多次读取,需要高数据吞吐的场景。
要想理解一个产品的设计,首先要理解它所面对的场景,比如TDengine面对的是工业物联网。
工业物联网大数据的特点
工业物联网中,采集的数据都是传感器等采集设备汇报的数值型数据,比如温度、电流、电压,经纬度等。这些数据有如下特点:
- 数据高度结构化,数据Schema是实现能确定的。不像互联网,存储的是图片、语音、视频等非结构化数据。
- 数据极少有更新或删除操作。采集的目的是记录,后续会进行分析。这个跟互联网公司的系统监控数据类似,不会有更新老数据或者删除某一条数据的场景。
- 无需传统数据库的事务处理。不需要保证几个操作要么完成,要么失败,比如需要从A转账给B。
- 写多读少,写入数据都带时间戳。反之写少读多的场景类似 Hadoop/GFS。GFS论文里提到了,一份爬虫拉取的TB级别的网页数据,会被很多业务线消费。
- 写入流量平稳。根据设备数量和采集频次,可以预测。比如有100个设备,每30s采集一次数据,那写入最高是3000次每秒。不会像互联网的To C 流量,会受营销的影响。
- 用户关注的是一段时间的趋势,而不是某一特定时间点的值。用户会在时序数据上进行一些聚合运算,比如求最近10分钟内某个速度传感器上的平均速度。
- 数据使用特点是最近的数据最常使用。比如展示最近的10条数据,或者最近的10分钟里的最大值。
- 数据的查询分析一定是基于时间段和空间区域;因为产生的数据都是时序数据。
- 产生的数据量很大。比如有1万台设备,每个设备每30s上传一次数据,那一天产生2800万条数据。
TDengine 的设计取舍
关系型数据库模型
上文说了采集的数据都是结构化数据,为了降低上手门槛,采用传统的关系型数据库模型管理数据。用户先创建库、表,然后才能插入或查询数据。它底层采用结构化存储,而不需要像 NoSQL这类Schemeless的key-value存储。
一个数据采集点一张表
比如是智能电表采集数据,那有多少设备,就需要建多少张表。所以每个表只有一个写入者,好处是:
- 一张表的写入操作不会并发,不需要加锁。
- 写入者写入的数据是时序且单调增加的,所以可以使用追加方式写入内存,相当于顺序写入,效率自然高。类似 GFS 论文里提到的,这样就不需要HDD硬盘做随机寻址然后写入的操作了。
- 一个表(一个采集点)的数据在硬盘上以固定大小的块为单位连续存储。所以按时间戳读取的速度会非常快,读取都是顺序读取,对计算机缓存友好。
写入高效,原因:
- 每个采集点独占表,所以无并发写入,所以不需要加锁
- 跟 Kafka 类似,先写入内存,再定期写入硬盘
读取高效,原因:
- 数据分块存储,读取最多两次磁盘就能拿到指定时间段数据
- 都是顺序读取磁盘
总的来说,TDengine是通过vnode以及时间两个维度,对大数据进行切分,便于并行高效的管理,实现水平扩展。
留一个小问题,既然 TDegnine 是为时序数据库而生,那它是否可以用来代替 Prometheus 呢?