时序数据库插入性能评测:MatrixDB是InfluxDB的78倍

30秒执行摘要:

  1. MatrixDB 在小规模、中规模和大规模场景下表现均优于其他时序数据库,多数场景有几十倍性能优势。

  2. MatrixDB 支持ACID,确保数据不错不重不丢;InfluxDB、TDengine不能确保数据不错不重不丢

  3. MatrixDB 在各种规模数据写入时,内存消耗小而且平稳;InfluxDB 占用内存较多;TDengine占用内存最多

  4. MatrixDB 支持冷热分级存储

一、背景

在物联网和实时数仓场景中,数据的高速写入能力至关重要,直接影响产品方案的可用性、可靠性和扩展性。以物联网为例,当面临千万甚至上亿设备、平均每个设备采集几十个到几百个指标时,每秒生成的数据将达到数十亿至数百亿。能否及时可靠的插入这种量级的数据,是评价一个时序数据库的核心要素和第一需求。据统计,物联网时序数据具有写多读少特征,其中95%甚至99%以上是数据写入操作,从这个意义上讲,怎么重视数据写入能力都不为过。

为了应对这种高通量数据写入需求,一些产品采用无事务或者弱事务的方式来提高写入速度,这样造成错误数据、重复数据或者丢失数据。MatrixDB通过MatrixGate组件,创新性的在保证事务严格一致性(ACID)的前提下,支持大吞吐量数据高速写入。同时,产品具有良好的线性扩展性,可以通过添加节点的方式,线性提升系统的写入速度,满足车联网、工业互联网、智能家居、智能城市等各种物联网场景的数据写入需求。

这篇博客将详细介绍在同样环境下MatrixDB、InfluxDB和TDengine三个产品的写入能力,方便用户选型。本文采用行/每秒衡量数据写入能力,有的文章使用数据点/秒,这两种方式可以互换,譬如一张表有时间列、设备ID列和5个指标列,那么插入一行数据就意味着插入5个数据点,如果一秒插入1000行,那么写入能力是每秒5000个数据点。

二、测试结论

根据不同的用户使用场景,我们定义了小规模、中规模和大规模三种不同的测试场景,数据采集间隔均为60秒。具体特征如下:

规模 说明
小规模 分别为10万、20万、50万、100万设备, 生成1列int型数据
中等规模 10万设备,分别生成10、50、100、400列int型数据
大规模 100万设备,分别生成100、200、400、800列int型数据

针对每种测试用例,分别使用三种产品各自推荐的快速写入方式取得最高值,测试结果如下(单位: 行/秒),其中小规模选择100万设备1列指标数据、中等规模选择10万设备400列指标数据、大规模选择100万设备800列指标数据:

MatrixDB InfluxDB TDengine
小规模 2779126 263974 2064622
中等规模 167507 2268 5853
大规模 93988 1202 2427

MatrixDB与两个产品的写入速度之比分别是:

MatrixDB vs TDengine MatrixDB vs InfluxDB
小规模 1.3 10.5
中等规模 28.6 73.8
大规模 38.7 78.2

综上,在三种场景下,写入性能从高到低分别是:MatrixDB > TDengine > InfluxDB

值得一提的是,三个产品的事务支持是不一样的,MatrixDB在单节点和集群多节点都支持完整严格的事务,包括原子性(A)、一致性(C)、隔离性(I)和持久性(D),InfluxDB和TDengine不支持事务。测试时,也注意到不同产品内存消耗不同,MatrixDB内存占用较小较平稳,InfluxDB内存占用较多,TDengine内存消耗最多并且与设备数正相关,例如在500万设备时,内存占用会超过80G。

三、测试环境和产品信息

MatrixDB、InfluxDB、TDengine均采用单机部署。 机器配置如下:

cpu核数 2物理核 32逻辑核
内存 256GB
CPU平台 Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz
储存大小 9.0TB(1.4 GB/秒写入,3.3 GB/秒读取)
linux发行版 CentOS Linux release 7.8.2003 (Core)
linux内核 3.10.0-1127.el7.x86_64

软件版本

数据库类型 版本
MatrixDB MatrixDB 3.3.0-community
InfluxDB InfluxDB 1.8.3
TDengine taos 2.0.16.0

参数调整

库名 参数
MatrixDB max_wal_size=150GB
wal_buffers=256MB
shared_buffers=5G
InfluxDB cache-max-memory-size=10GB
max-values-per-tag = 0
TDengine numOfCommitThreads 4

四、数据生成

数据通过tsbs_generate_data工具生成。tsbs_generate_data是开源时序数据测评基准tsbs中的数据生成工具。MatrixDB团队扩充了该工具以支持大规模设备场景,通过参数--use-case="massiveiot"来使用,可以在百度网盘https://pan.baidu.com/s/1BFYcQR3DzqVLiy8ymXu9eg (提取码:8cba)下载该工具。

tsbs_generate_data 命令常用参数说明如下:

--format="MatrixDB"         //指定数据格式名称,使用MatrixDB,表示生成大规模iot数据
--use-case="massiveiot"     //生成的场景,填massiveiot
--scale="100000"            //规模参数,相当于设备数
--log-interval=60s          //生成数据的频率,默认是60秒
--column-data-type=simple   //列类型,simple表示简单类型
--point-type=int            //表示数据是int类型
--columns-per-row=1         //列数
--timestamp-start           //开始时间,默认是 "2016-01-01T00:00:00Z"
-timestamp-end              //结束时间,默认是 "2016-01-02T00:00:00Z"

详细的数据生成方法和命令,请参考文末链接时序数据库写入性能测试过程

小规模文件大小

文件名 设备数 列数 容量 行数
cpu_1_10w.csv 10万 1 4.9 G 144,000,000
cpu_1_20w.csv 20万 1 10 G 288,000,000
cpu_1_50w.csv 50万 1 26 G 720,000,000
cpu_1_100w.csv 100万 1 51 G 1,440,000,000

中等规模文件大小

文件名 设备数 列数 容量 行数
cpu_10_10w.csv 10万 10 18 G 144,000,000
cpu_50_10w.csv 10万 50 75 G 144,000,000
cpu_100_10w.csv 10万 100 146 G 144,000,000
cpu_400_10w.csv 10万 400 400 G 144,000,000

大规模文件大小

如果全量生成的话,估算数据容量如下

文件名 设备数 列数 容量 行数
cpu_100_100w.csv 100万 100 1460 GB 144,000,000
cpu_200_100w.csv 100万 200 2920 GB 144,000,000
cpu_400_100w.csv 100万 400 4000 GB 144,000,000
cpu_800_100w.csv 100万 800 8000 GB 144,000,000

由于InfluxDB/TDEngine在列数超过100列时较慢,为避免写入时间过长,测试中采取限定时间范围方法:

100万设备,100列,限定采集2小时数据

100万设备,200列,限定采集1小时数据

100万设备,400列,限定采集30分钟数据

100万设备,800列,限定采集15分钟数据

限定时间范围后,实际数据大小如下:

文件名 设备数 列数 容量 行数
cpu_100_100w.csv 100万 100 122 G 120,000,000
cpu_200_100w.csv 100万 200 120 G 60,000,000
cpu_400_100w.csv 100万 400 119 G 30,000,000
cpu_800_100w.csv 100万 800 119 G 15,000,000

五、数据写入

每种产品使用的写入方式如下:

产品名称 写入方式 说明
MatrixDB mxgate mxgate写入csv格式数据
InfluxDB tsbs_load_influx 因为tsbs_load_influx不支持直接写入csv格式数据,故从MatrixDB按InfluxDB行协议导出数据,通过tsbs_load_influx写入到InfluxDB
TDengine taosdemox TDengine是taosdemox生成数据,同时,写入TDengine

5.1 小规模数据写入对比

值越大代表写入性能越好

5.1.1 MatrixDB与InfluxDB写入速度对比

列数 设备数 MatrixDB/InfluxDB
1 10万 11.6
1 20万 11.1
1 50万 11.5
1 100万 10.5
  • MatrixDB写入速度最高是InfluxDB的11.6倍

5.1.2 MatrixDB与TDengine写入速度对比

列数 设备数 MatrixDB/TDengine
1 10万 2
1 20万 1.7
1 50万 1.5
1 100万 1.3
  • MatrixDB写入速度最高是TDengine的2倍

5.2 中等规模数据写入性能数据

值越大代表写入性能越好

5.2.1 MatrixDB与InfluxDB写入速度对比

设备数 列数 MatrixDB /InfluxDB
10万 10 16.6
10万 50 41.7
10万 100 68.1
10万 400 73.8
  • MatrixDB 写入速度最高是InfluxDB的73.8倍

备注

如果InfluxDB全量写入,按400列的2268.06行每秒的写入速度计算,14.4亿行,需要费时1058分钟,而MatrixDB 只需要14分钟,相比之下InfluxDB写入速度太慢。故InfluxDB 10列、50列,只写入1千万行,InfluxDB 100列,只写入100万行,400列,只写入10万行。

5.2.2 MatrixDB与TDengine写入速度对比

设备数 列数 MatrixDB/TDengine
10万 10 5.6
10万 50 9.5
10万 100 11.9
10万 400 28.6
  • MatrixDB的写入速度最高是TDengine的28.6倍

备注

按TDengine 100列全量写入需要262分钟计算,400列估算需要1050分钟,而MatrixDB 最快仅需要14分钟。10万设备数400列,相比之下写入速度太慢、费时太久,故设置1000个设备,然后推导出10万设备所需时间。

5.3 大规模数据写入性能数据

值越大代表写入性能越好

5.3.1 MatrixDB与InfluxDB写入对比

设备数 列数 MatrixDB/InfluxDB
100万 100 79.4
100万 200 84.8
100万 400 83.2
100万 800 78.2
  • MatrixDB写入csv的速度最高是InfluxDB的84.8倍

备注

如果InfluxDB全量写入,按10万设备量400列2268.06行每秒的写入速度计算,14.4亿行,需要费时1058分钟,100万设备量估算需要花费10580分钟,耗时太久。为避免InfluxDB写入费时太长,InfluxDB 100万设备数、100列和200列,只写入100万行,400、800列只写入10万行,然后同比推导出结果数据。

5.3.2 MatrixDB与TDengine写入速度对比

设备数 列数 MatrixDB/TDengine
100万 100 9.2
100万 200 13.7
100万 400 23.4
100万 800 38.7
  • MatrixDB的写入速度最高是TDengine的38.7倍

备注

TDengine按10万设备数、100列全量写入需要262分钟计算,400列估算需要1050分钟,而MatrixDB 400列最快仅需要14分钟,100万设备数,相比之下写入速度太慢、避免写入费时太久,故TDengine 100、200、400、800列,设置的是1000个设备,然后同比推导出结果数据。

六、关于MatrixDB

四维纵横(https://ymatrix.cn) 是全球超融合时空数据库开创者,专为物联网、车联网、工业互联网和智慧城市提供一站式数据平台。

MatrixDB为首款PB级超融合时空数据库,基于自主研发的多项专利技术,MatrixDB可以同时完美支持传统的关系型数据和物联网海量时空数据的快速采集、高效存储、实时分析以及深度学习(ML+AI),为万物互联的智能时代提供坚实、简洁的智能数据核心基础设施。MatrixDB为公司自主研发的国产数据库,公司拥有该产品的全部知识产权。

公司创始团队均来自于Oracle、IBM、Teradata、Greenplum等国际一线数据库企业,拥有数百人年的数据库内核开发积累,是国内拥有全球顶级数据库内核开发经验,并能驾驭数据库内核各模块的团队。

附录