乐趣区

TDengine与InfluxDB对比测试

摘要:为帮助用户了解 TDengine 的指标,特将 TDengine 与 InfluxD 从数据库的读、写、查询、压缩比等方面进行了对比测试。从测试结果上看,TDengine 的性能远超 InfluxDB,写入性能约为 5 倍,读取性能约为 35 倍,聚合函数性能约为 140 倍,按标签分组查询性能约为 250 倍,按时间分组查询性能约为 12 倍。

测试环境

对比测试的测试程序和数据库服务在同一台 4 核 8GB 的 Dell 台式机上部署,台式机型号为 OptiPlex-3050,详细配置如下

OS: Ubuntu 16.04 x64
CPU: Intel(R) Core(TM) i3-7100 CPU @ 3.90GHz
Memory: 8GB
Disk: 1TB HDD

测试数据集及其生成方法

1. 测试数据生成方法

本次测试调研了两类比较热门的测试数据集

  • 纽约出租车运行数据,因该数据中抹去了单台车辆的信息,无法对其进行建模
  • faker 生成工具,因其只能生成字符串,并不适合物联网场景下处理的数据

所以,为使测试可轻易重复,单独编写了一个生成模拟数据的程序来进行本次测试。

测试数据生成程序模拟若干温湿度计生成的数据,其中温度为整数、湿度为浮点数,同时每个温度计包含设备 ID、设备分组、设备名称三个标签。为了尽可能真实地模拟温湿度计的生成数据,没有使用完全随机数,而是针对每个温度计确保生成的数据值呈正态分布。

测试数据的频率为 1 秒钟,数据集包含 10000 台设备,每台设备 10000 条记录。每条数据采集记录包含 1 个时间戳字段、2 个数据字段和 3 个标签字段。

2. 测试数据生成程序源码

采用 java 程序生成测试数据集,测试程序源代码可以到 https://github.com/taosdata/T… 下载,下载后执行如下语句

cd tests/comparisonTest/dataGenerator
javac com/taosdata/generator/DataGenerator.java 

3. 测试数据生成程序用法

相关参数如下

  • dataDir 生成的数据文件路径
  • numOfFiles 生成的数据文件数目
  • numOfDevices 测试数据集中的设备数目
  • rowsPerDevice 测试数据集中每台设备包含的记录条数

4. 生成测试数据

执行如下命令,会在~/testdata 目录下生成 100 个数据文件,每个文件包含 100 台设备的测试数据;合计 10000 台设备,每台设备 10000 条记录

mkdir ~/testdata
java com/taosdata/generator/DataGenerator -dataDir ~/testdata -numOfDevices 10000 -numOfFiles

TDengine 环境准备

TDengine 是一个开源的专为物联网、车联网、工业互联网、IT 运维等设计和优化的大数据平台。除核心的快 10 倍以上的时序数据库功能外,还提供缓存、数据订阅等功能,最大程度减少研发和运维的工作量。

1. 安装部署

  • 下载 tdengine-1.6.1.0.tar.gz,地址 https://www.taosdata.com/
  • 安装 TDengine,解压后运行 install.sh 进行安装
  • 启动 TDengine,运行 sudo systemctl start taosd
  • 测试是否安装成功,运行 TDengine 的 shell 命令行程序 taos,可以看到如下类似信息
Welcome to the TDengine shell, server version:1.6.1.0  client version:1.6.1.0
Copyright (c) 2017 by TAOS Data, Inc. All rights reserved.
taos> 

2. 数据建模

TDengine 为相同结构的设备创建一张超级表,而每个具体的设备则单独创建一张数据表。因此,超级表的数据字段为采集时间、温度、湿度等与时间序列相关的采集数据;标签字段为设备编号、设备分组编号、设备名称等设备本身固定的描述信息。

创建超级表的 SQL 语句为

create table devices(ts timestamp, temperature int, humidity float) tags(devid int, devname binary(16), devgroup int);

以设备 ID 作为表名(例如 device id 为 1,则表名为 dev1),使用自动建表语句,写入一条记录的语句为

insert into dev1 using devices tags(1,'d1',0) values(1545038786000,1,3.560000);

3. 测试程序源码

本文采用 TDengine 的原生 C 语言接口,编写数据写入及查询程序,后续的其他文章会提供基于 JDBCDriver 的测试程序。

测试程序源代码及查询 SQL 语句可以到 https://github.com/taosdata/T… 下载,下载后执行如下语句

cd tdengine
make

会在当前目录下生成可执行文件./tdengineTest

4. 测试程序用法

TDengine 的测试程序用法与 InfluxDB 的用法相同,写入相关参数

  • writeClients 并发写入的客户端链接数目,默认为 1
  • rowsPerRequest 一次请求中的记录条数,默认为 100,范围 1 -1000
  • dataDir 读取的数据文件路径,来自于测试数据生成程序
  • numOfFiles 从数据文件路径中读取的文件个数

例如

./tdengineTest -dataDir ./data -numOfFiles 10 -writeClients 2 -rowsPerRequest 100

查询相关参数

sql 将要执行的 SQL 语句列表所在的文件路径,以逗号区分每个 SQL 语句
例如

./tdengineTest -sql ./sqlCmd.txt

写入性能对比

数据库的一个写入请求可以包含一条或多条记录,一次请求里包含的记录条数越多,写入性能就会相应提升。在以下测试中,使用 R / R 表示 Records/Request,即一次请求中的记录条数。同时,一个数据库可以支持多个客户端连接,连接数增加,系统总的写入通吐量也会相应增加。因此测试中,对于每一个数据库,都会测试一个客户端和多个客户端连接的情况。

1.TDengine 的写入性能

TDengine 按照每次请求包含 1,100,500,1000,2000 条记录各进行测试,同时也测试了不同客户端连接数的情况。测试步骤如下所示,您可以修改示例中的参数,完成多次不同的测试。

1. 清空上次测试数据
运行 TDengine 的 shell 命令行程序 taos,执行删除测试数据库语句
Welcome to the TDengine shell, server version:1.6.1.0  client version:1.6.1.0
Copyright (c) 2017 by TAOS Data, Inc. All rights reserved.
taos>drop database db;
2. 测试执行
开启 5 个客户端读取~/testdata 目录中的 100 个数据文件,每个请求写入 1000 条数据,可以参考如下命令
./tdengineTest -dataDir ~/testdata -numOfFiles 100 -writeClients 5 -rowsPerRequest 1000

写入吞吐量如下,单位为记录数 / 秒

R/R 1 client 2 clients 3 clients 4 clients 5 clients 6 clients 7 clients
1 26824 43699 55137 62869 64529 68647 72277
100 415800 734484 895522 976085 1087902 1171074 1192199
500 479846 882612 1083032 1195100 1269196 1364256 1417004
1000 500751 914494 1121914 1239157 1367989 1418104 1476560
2000 512820 1055520 1174164 1306904 1426635 1458434 1477208

图 1 TDengine 的写入吞吐量

2.InfluxDB 的写入性能

InfluxDB 按照每次请求包含 1,100,1000,10000,20000,50000,100000 条记录各进行测试,同时也测试了不同客户端连接数的情况。测试步骤如下所示,您可以修改示例中的参数,完成多次不同的测试。

1. 清空上次测试数据
运行 InfluxDB 的 shell 命令行程序 influx,可以看到如下类似信息
Connected to http://localhost:8086 version 1.7.7
InfluxDB shell version: 1.7.7
> drop database db;
2. 测试执行
开启 5 个客户端读取~/testdata 目录中的 100 个数据文件,每个请求写入 10000 条数据,可以参考如下命令
./influxdbTest -dataDir ~/testdata -numOfFiles 100 -writeClients 5 -rowsPerRequest 10000

写入吞吐量如下,单位为记录数 / 秒

R/R 1 client 2 clients 3 clients 4 clients 5 clients 6 clients 7 clients
1 31 43 55 67 80 92 106
100 3024 4325 5709 6819 8013 9204 10173
1000 21940 30659 40825 50622 60567 70311 77174
10000 88686 155154 209377 234124 245141 257454 261542
20000 96277 179492 234413 255805 263160 268466 271249
50000 125187 200552 243861 264780 271101 270364 273820
100000 130108 197202 240059 254973 265922 272275 270859


图 2 InfluxDB 的写入吞吐量

3.TDengin 和 InfluxDB 的最佳性能对比
基于以上的测试数据,将 TDengine 和 InfluxDB 测试出的最佳写入速度进行对比,结果如下

R/R 1 client 2 clients 3 clients 4 clients 5 clients 6 clients 7 clients
TDengine 512820 1055520 1174164 1306904 1426635 1458434 1477208
InfluxDB 130108 200552 243861 264780 271101 272275 273820


图 3 TDengine 和 InfluxDB 的最佳写入性能对比

从图 3 可以看出,TDengine 的写入速度约为百万条记录 / 秒的量级,而 InfluxDB 的写入速度约为十万条记录 / 秒的量级。因此可以得出结论,在同等数据集和硬件环境下,TDengine 的写入速度远高于 InfluxDB,约为 5 倍。

需要指出的是,InfluxDB 的单条插入性能很低,因此必须采用 Kafka 或其他消息队列软件,成批写入,这样增加了系统开发和维护的复杂度与运营成本。

读取性能对比

本测试做了简单的遍历查询,就是将写入的数据全部读出。因为 InfluxDB 的 GO 客户端在解析 JSON 返回结果时的限制,故每次查询仅取出 100 万条记录。在测试数据准备时,已经按照 devgroup 标签将设备拆分成 100 个分组,本次测试随机选取其中 10 个分组进行查询。

1.TDengine 的测试方法

测试 SQL 语句存储在 tdengine/q1.txt 中,测试 SQL 语句参考
select * from db.devices where devgroup=0;
执行方法如下
./tdengineTest -sql ./q1.txt

2.InfluxDB 的测试方法

测试 SQL 语句存储在 influxdb/q1.txt 中,测试 SQL 语句参考
select * from devices where devgroup='0';
执行方法如下
./influxDBTest -sql ./q1.txt

如下所示,横轴为设备分组编号,测试结果的单位为秒

分组 0 分组 10 分组 20 分组 30 分组 40 分组 50 分组 60 分组 70 分组 80 分组 90
TDengine 0.235 0.212 0.208 0.218 0.209 0.210 0.209 0.209 0.216 0.208
InfluxDB 7.56 7.21 7.64 7.28 7.64 7.52 7.52 7.52 7.32 7.42


图 4 TDengine 和 InfluxDB 的读取性能对比

从图 4 中可以看出,TDengine 的 100 万条的读取速度稳定在 0.21 秒,吞吐量约为 500 万条记录 / 秒,InfluxDB 的 100 万条的读取速度稳定在 7.5 秒,吞吐量约为 13 万条记录 / 秒。所以从测试结果来看,TDengine 的查询吞吐量远高于 InfluxDB。

聚合函数性能对比

本单元的测试包含 COUNT,AVERAGE,SUM,MAX,MIN,SPREAD 这六个 TDEngine 和 InfluxDB 共有的聚合函数。所有测试函数都会搭配筛选条件(WHERE)来选取设备的十分之一、十分之二、十分之三、直到全部设备。

1.TDengine 的聚合函数性能

测试 SQL 语句存储在 tdengine/q2.txt 中,测试 SQL 语句参考

select count(*) from db.devices where devgroup<10;

执行方法如下

./tdengineTest -sql ./q2.txt

如下所示,横轴为查询设备占总设备的百分比,测试结果的单位为秒

10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
count 0.018 0.026 0.016 0.018 0.017 0.024 0.024 0.027 0.030 0.033
avg 0.007 0.014 0.015 0.020 0.024 0.038 0.044 0.050 0.057 0.060
sum 0.006 0.010 0.019 0.018 0.031 0.036 0.034 0.037 0.043 0.046
max 0.007 0.013 0.015 0.020 0.025 0.030 0.035 0.039 0.045 0.049
min 0.006 0.010 0.016 0.024 0.032 0.039 0.045 0.041 0.043 0.049
spread 0.007 0.010 0.015 0.019 0.033 0.038 0.046 0.052 0.059 0.066


图 5 TDengine 聚合函数性能

2.InfluxDB 的聚合函数性能

测试 SQL 语句存储在 influxdb/q2.txt 中。因为 InfluxDB 的标签仅能为字符串,所以测试 SQL 语句的筛选条件为正则表达式,如下的 SQL 语句选取第 10-19 个 group 中的数据,例如

select count(*) from devices where devgroup=~/[1-1][0-9]/;

执行方法如下

./influxdbTest -sql ./q2.txt

如下所示,横轴为查询设备占总设备的百分比,测试结果的单位为秒

10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
count 1.06 2.14 3.28 4.15 5.26 6.19 7.01 8.09 9.06 9.92
mean 0.99 2.05 2.77 3.68 4.51 5.35 6.14 6.95 7.70 8.44
sum 1.02 2.04 2.89 3.75 4.64 5.50 6.38 7.18 7.94 8.72
max 1.01 1.99 2.85 3.77 4.69 5.52 6.35 7.17 7.95 8.80
min 1.03 2.02 2.95 3.81 4.64 5.48 6.33 7.18 8.01 8.72
spread 7.38 16.92 27.44 38.25 49.86 60.68 71.61 82.50 94.68 105.26


图 6 InfluxDB 聚合函数性能

3. 聚合函数性能对比

count average sum max min spread
TDengine 0.033 0.06 0.046 0.049 0.049 0.066
InfluxDB 9.92 8.44 8.72 8.8 8.72 105.26


图 7 聚合函数性能对比

从图 7 可以看出,TDengine 的聚合函数查询时间在 100 毫秒以内,而 InfluxDb 的查询时间在 10 秒左右。因此可以得出结论,在同等数据集和硬件环境下,TDengine 聚合函数的查询速度远远高于 InfluxDB,超过 100 倍。

按标签分组查询性能对比

本测试做了按标签分组函数的性能测试,测试函数会搭配筛选条件(WHERE)来选取设备的十分之一、十分之二、十分之三、直到全部设备。

1.TDengine 的测试方法

测试 SQL 语句存储在 tdengine/q3.txt 中,例如

select count(temperature), sum(temperature), avg(temperature) from db.devices where devgroup<10 group by devgroup;

执行方法如下

./tdengineTest -sql ./q3.txt

2.InfluxDB 的测试方法

测试 SQL 语句存储在 influxdb/q3.txt 中,例如

select count(temperature), sum(temperature), mean(temperature) from devices where devgroup=~/[1-1][0-9]/ group by devgroup;

执行方法如下

./influxdbTest -sql ./q3.txt

如下所示,横轴为查询设备占总设备的百分比,测试结果的单位为秒

10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
TDengine 0.030 0.028 0.031 0.041 0.069 0.066 0.077 0.091 0.102 0.123
InfluxDB 3.19 6.37 9.60 12.95 15.93 19.16 22.05 25.20 28.06 31.52


图 8 TDengine 和 InfluxDB 的按标签分组查询性能对比

从测试结果来看,TDengine 的分组聚合查询速度远高于 InfluxDB,约为 300 倍。

按时间分组查询性能对比

本测试做了按时间分组函数的性能测试,测试函数会搭配筛选条件(WHERE)来选取设备的十分之一、十分之二、十分之三、直到全部设备。

1.TDengine 的测试方法

测试 SQL 语句存储在 tdengine/q4.txt 中,例如

select count(temperature), sum(temperature), avg(temperature) from db.devices where devgroup<10 interval(1m);

执行方法如下

./tdengineTest -sql ./q4.txt

2.InfluxDB 的测试方法

测试 SQL 语句存储在 influxdb/q4.txt 中,例如

select count(temperature), sum(temperature), mean(temperature) from devices where devgroup=~/[1-1][0-9]/ group by time(1m);

执行方法如下

./influxdbTest -sql ./q4.txt

如下所示,横轴为查询设备占总设备的百分比,测试结果的单位为秒

10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
TDengine 0.237 0.472 0.653 0.902 1.134 1.422 1.753 1.784 2.085 2.549
InfluxDB 3.26 6.50 9.59 12.85 16.07 19.02 22.32 25.44 28.29 31.44


图 9 TDengine 和 InfluxDB 的按时间分组查询性能对比

压缩比对比

1. 原始数据的磁盘占用
本次测试共生成 100 个测试数据文件,存储在~/testdata 目录下,使用 du 命令查看~/testdata 目录的文件大小

cd ~/testdata
du -m .

如下图所示

图 10 原始数据的磁盘占用情况

2. 查看 TDengine 的磁盘占用

TDengine 的磁盘文件默认位置在目录 /var/lib/taos/data 下,在查看磁盘文件大小时,首先将 TDengine 的服务停止

sudo systemctl stop taosd

然后,调用 du 命令,查看 /var/lib/taos/data 目录下文件的大小

cd /var/lib/taos/data
du -h .


图 11 TDengine 的磁盘占用情况

3. 查看 InfluxDB 的磁盘占用

InfluxDB 的磁盘文件默认位置在目录 /var/lib/influxdb/data/db 下,在查看磁盘文件大小时,首先将 InfluxDB 的服务停止

sudo systemctl stop influxDb

目录 /var/lib/taos/data 为用户 influxdb 所有,请确保当前用户有查看该目录的权限。本测试中,数据存储在 autogen/84 目录下,调用 du 命令,查看该目录下文件的大小。

cd /var/lib/influxdb/data/db/autogen/84
du -h .


图 12 InfluxDB 的磁盘占用情况

4. 磁盘占用情况对比

生成的测试数据文件占用的磁盘大小为 3941MB,InfluxDB 磁盘占用 855MB,TDengine 磁盘占用 459MB。在相对比较随机数据集的情况下,TDengine 的压缩比约为 InfluxDB 压缩比的 1.86 倍。

在物联网场景下,大多数采集数据的变化范围都比较小。由于 TDengine 采用列式存储,因此可以预期,TDengine 在真实场景的压缩比表现会更好。

功能对比

TDengine 与 InfluxDB 都能用于时序数据的处理,两者在数据库层面上功能接近。但 TDengine 还具备消息队列、缓存、消息订阅等大数据平台所需要的功能。使用 InfluxDB,还需要集成 Kafka, Redis 或其他类似软件。具体对比如下:

功能支持 TDengine InfluxDB
SQL 语法支持 支持 支持
Schema 需要定义 无需定义
私有化部署支持 支持 支持
水平扩展能力 支持 支持
系统连接管理 支持 支持
查询任务管理 支持 支持
数据导入工具 支持 支持
数据导出工具 支持 支持
Web 管理工具 支持 支持
多介质分级存储 支持 支持
Telegraf 数据采集 支持 支持
Grafana 数据可视化 支持 支持
RESTFul 支持 支持
C/C++ 支持 不支持
JDBC/ODBC 支持 不支持
GO 支持 支持
Python 支持 支持
数据库参数配置 支持 支持
配置副本数 支持 支持
数据时效 支持 支持
数据分区 支持 支持
连续查询 支持 支持
数据订阅 支持 不支持
缓存 支持 不支持
微秒级精度 支持 支持
聚合函数支持 支持 支持
数据降采样 支持 支持
数据分页 支持 支持
数据插值 支持 支持
历史数据修改 不支持 支持
历史数据的标签修改 支持 不支持
时间线删除 支持 支持
数据清空 支持 支持
Matlab 接口 支持 无官方支持
R 接口 支持
安装包大小 1.5M 48M

总结

此次测试,从数据库的读、写、查询、压缩比等方面对 TDengine 和 InfluxDB 进行了对比测试。测试用数据集、测试程序源码、执行的 SQL 语句都可以从 https://github.com/taosdata/T… 下载,测试具备可重复性。

从测试结果上看,TDengine 的性能远超 InfluxDB,写入性能约为 5 倍,读取性能约为 35 倍,聚合函数性能约为 140 倍,按标签分组查询性能约为 250 倍,按时间分组查询性能约为 12 倍,压缩比约为 1.8 倍,具体见下表

TDengine InfluxDB
写入吞吐量 1477208 记录数 / 秒 273820 记录数 / 秒
100 万条记录读取时间 0.21 秒 7.5 秒
1 亿条记录取平均值时间 0.06 秒 8.44 秒
1 亿条记录按标签分组取均值时间 0.123 秒 31.52 秒
1 亿条记录按时间分组取均值时间 2.549 秒 31.44 秒
1 亿条记录的磁盘占用空间 459MB 855MB
退出移动版