摘要:为帮助用户了解 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 |