TDengine Database开源项目里已经包含了性能对比测试的工具源代码。https://github.com/taosdata/TDengine/tests/comparisonTest,并基于这个开源的测试工具开展了TDengine和InfluxDB对比测试,TDengine和OpenTSDB对比测试,TDengine和Cassandra对比测试等一系列性能对比测试。为了更客观的对比TDengine和其他时序数据库(Time-Series Database)的性能差异,本项目采用由InfluxDB团队开源的性能对比测试工具来进行对比测试,相同的数据产生器,相同的测试用例,相同的测试方法,以保证测试的客观公平。
本项目是基于InfluxDB发布的一个性能对比测试项目的基础上开发的。数据产生模块可以模拟Devops场景下多台服务器产生大量监控数据。数据写入程序可以根据不同的数据库格式,将产生的模拟数据以不同的格式写入到不同数据库里,以测试写入性能。查询模块以相同的查询类型产生相同的查询任务,以各数据库自己的格式进行查询,并统计查询消耗的时间,来测试查询性能。
为了让测试过程更简单,本测试采用Docker容器方式来测试,所有被测的数据库都以容器的方式,从Dockerhub拉取下来,并设定固定的IP地址运行,便于脚本执行。容器镜像都是公开发布的,能保证测试的公平公正。
本测试项目目前支持以下时序数据库的对比测试
本项目的Github链接:https://github.com/liu0x54/timeseriesdatabase-comparisons
为了开展测试,需要准备以下条件
先从下载地址下载我们已经制作好的测试工具包,解压到本地。
tar -zxf tsdbcompare.tar.gz
解压后的目录结构如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RD9pmftw-1687780419671)(https://tdengine.com/wp-content/uploads/2020/01/image2020-1-10_14-31-34.png)]
bin
目录里是提前编译好的可执行文件,包括数据产生,数据加载,查询产生和查询加载。提前编译好方便大家下载即可用;如果有兴趣的同学也可以自己从源文件编译。源文件位于cmd
下面的各个子目录里。可以自行编译后替换bin目录的文件。
config
目录里是TDengine写入数据需要用到的schema配置文件,模拟数据产生的数据通过schema配置里的信息可以知道该往哪个表里存。
data
目录是用来存储测试过程中产生的数据文件。本测试采用先产生模拟数据,并将模拟数据按各数据库的写入格式写到文件里,再用加载程序从文件里读取按格式写好的语句往各数据库里加载的方式来开展测试。这样的方法,能够将原始数据转换成不同的格式的过程带来的差异进行屏蔽,更纯粹的对比数据库的写入性能。
prepare.sh
是用来准备测试环境的脚本,包含三部分,1.安装docker程序,2.安装TDengine的客户端,3.拉取InfluxDB和TDengine的Docker镜像。
#!/bin/bashset -x#install dockercurl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.sh#install tdengine clienttar -zxf TDengine-client-1.6.4.5.tar.gzcd TDengine-client-1.6.4.5./install_client.shcd ..#pull influxdb and tdengine docker imagesdocker pull influxdbdocker pull tdengine/tdengine:v1.6.4.5.c
如果目标系统上已经安装了docker程序,就不用执行这个prepare.sh
脚本了,可以直接按脚本里的第二、三部分去安装TDengine Client和拉取对应的Docker镜像。
在上面的步骤都执行完成,并确认成功后,可以开展测试工作了。
注意事项:
1.如果系统里已经安装了其他版本的TDengine,请先卸载TDengine,否则会因为客户端和服务端版本不一致导致测试数据加载程序连接TDengine失败。
2.要确认TDengine-client-1.6.4.5.tar.gz安装成功,因为本次测试的加载和查询程序都是用的这个版本的client端lib库进行编译的,如果版本不匹配,会导致连接TDengine失败
3.启动前请先将系统里运行的InfluxDB、TDengine停止下来,释放出这俩个数据库占用的端口,否则Docker container加载的时候会因为端口被占用了导致加载失败,从而无法完成测试。
在整个测试过程中,建议另开一个终端,运行top,查看系统的CPU和内存占用情况。
本测试包提供了一个run.sh
脚本,自动执行将docker容器按指定IP地址运行起来,然后产生数据,写入数据文件,并写入时序数据库。 数据产生和写入由以下两条命令完成
#产生模拟数据并写入数据文件bin/bulk_data_gen -seed 123 -format influx-bulk -sampling-interval 1s -scale-var 10 -use-case devops -timestamp-start "2018-01-01T00:00:00Z" -timestamp-end "2018-01-02T00:00:00Z" >data/influx.datbin/bulk_data_gen -seed 123 -format tdengine -sampling-interval 1s -tdschema-file config/TDengineSchema.toml -scale-var 10 -use-case devops -timestamp-start "2018-01-01T00:00:00Z" -timestamp-end "2018-01-02T00:00:00Z" > data/tdengine.dat
解释一下以上的命令:按influxDB/TDengine的格式,以1秒一条数据的产生频率,模拟10台设备,以devops场景产生24小时的数据,并写入influx.dat文件。 Devops模型下,一台服务器会产生9类数据,分别是cpu,disk,mem,等,因此总共会产生7776000条数据记录。 数据文件完成后,就开始数据写入测试:
#数据写入数据库cat data/influx.dat |bin/bulk_load_influx --batch-size=5000 --workers=20 --urls="http://172.15.1.5:8086"cat data/tdengine.dat |bin/bulk_load_tdengine --url 172.15.1.6:0 --batch-size 300 -do-load -report-tags n1 -workers 20 -fileout=false
上面命令的含义是以每批次写入5000/300条记录,分20个线程,将数据文件读取出来后写入influxDB/TDengine中
在完成写入后,就开始查询测试。 查询测试设定了四个查询用例的语句,每个查询语句都执行1000遍,然后统计总的查询用时:
测试用例1,
查询所有数据中,用8个hostname标签进行匹配,匹配出这8个hostname对应的模拟服务器CPU数据中的usage_user这个监控数据的最大值。
#TDenginebin/bulk_query_gen -seed 123 -format tdengine -query-type 8-host-all -scale-var 10 -queries 1000 | bin/query_benchmarker_tdengine -urls="http://172.15.1.6:6020" -workers 50 -print-interval 0#InfluxDBbin/bulk_query_gen -seed 123 -format influx-http -query-type 8-host-all -scale-var 10 -queries 1000 | bin/query_benchmarker_influxdb -urls="http://172.15.1.5:8086" -workers 50 -print-interval 0
测试用例2,
查询所有数据中,用8个hostname标签进行匹配,匹配出这8个hostname对应的模拟服务器CPU数据中的usage_user这个监控数据,以1小时为粒度,查询每1小时的最大值。
#TDenginebin/bulk_query_gen -seed 123 -format tdengine -query-type 8-host-allbyhr -scale-var 10 -queries 1000 | bin/query_benchmarker_tdengine -urls="http://172.15.1.6:6020" -workers 50 -print-interval 0#InfluxDBbin/bulk_query_gen -seed 123 -format influx-http -query-type 8-host-allbyhr -scale-var 10 -queries 1000 | bin/query_benchmarker_influxdb -urls="http://172.15.1.5:8086" -workers 50 -print-interval 0
测试用例3,
随机查询12个小时的数据,用8个hostname标签进行匹配,匹配出这8个hostname对应的模拟服务器CPU数据中的usage_user这个监控数据,以10分钟为粒度,查询每10分钟的最大值。
#TDenginebin/bulk_query_gen -seed 123 -format tdengine -query-type 8-host-12-hr -scale-var 10 -queries 1000 | bin/query_benchmarker_tdengine -urls="http://172.15.1.6:6020" -workers 50 -print-interval 0#InfluxDBbin/bulk_query_gen -seed 123 -format influx-http -query-type 8-host-12-hr -scale-var 10 -queries 1000 | bin/query_benchmarker_influxdb -urls="http://172.15.1.5:8086" -workers 50 -print-interval 0
测试用例4,
随机查询1个小时的数据,用8个hostname标签进行匹配,匹配出这8个hostname对应的模拟服务器CPU数据中的usage_user这个监控数据,以1分钟为粒度,查询每1分钟的最大值。
#TDenginebin/bulk_query_gen -seed 123 -format tdengine -query-type 8-host-1-hr -scale-var 10 -queries 1000 | bin/query_benchmarker_tdengine -urls="http://172.15.1.6:6020" -workers 50 -print-interval 0#InfluxDBbin/bulk_query_gen -seed 123 -format influx-http -query-type 8-host-1-hr -scale-var 10 -queries 1000 | bin/query_benchmarker_influxdb -urls="http://172.15.1.5:8086" -workers 50 -print-interval 0
查询过程结束后,将测试结果以以下格式打印出来
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mXU2ptPO-1687780425527)(null)]
通过本测试包产生的数据和相关的写入、查询用例测试可以看出,TDengine在性能上相比InfluxDB有较大的优势。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IIfQO2wl-1687780423661)(null)]
细致分析下来可以有以下结论:
通过top命令的观察,我们可以看到,测试用例执行时,InfluxDB的CPU占用率基本达到满负荷,以4核CPU的服务器为例,经常达到390%以上;而TDengine的CPU占用率则低很多。
**摘要:**为帮助用户了解TDengine Database的指标,此次测试,从数据库的读、写、查询、压缩比等方面对TDengine和OpenTSDB进行了对比测试。从测试结果上看,TDengine的性能远超OpenTSDB,写入性能约为25倍,读取性能约为32倍,聚合函数性能约为1000倍,按标签分组查询性能约为1000倍,按时间分组查询性能约为40倍,压缩比约为5倍。
对比测试的测试程序和数据库服务在同一台4核8GB的Dell台式机上部署,台式机型号为OptiPlex-3050,详细配置如下
OS: Ubuntu 16.04 x64CPU: Intel(R) Core(TM) i3-7100 CPU @ 3.90GHzMemory: 8GBDisk: 1TB HDD
本次测试调研了两类比较热门的测试数据集:
所以,为了使得测试可轻易重复,自己写了一个生成模拟数据的程序来进行本次测试。
测试数据生成程序模拟若干温湿度计生成的数据,其中温度为整数、湿度为浮点数,同时每个温度计包含设备ID、设备分组、设备名称三个标签。为了尽可能真实地模拟温湿度计的生成数据,没有使用完全随机数,而是针对每个温度计确保生成的数据值呈正态分布。
测试数据的频率为1秒钟,数据集包含10000台设备,每台设备10000条记录。每条数据采集记录包含3个标签字段,2个数据字段,1个时间戳字段。
采用java程序生成测试数据集,测试程序源代码行数较多,因此您可以到 https://github.com/taosdata/TDengine/tree/2.6/tests/comparisonTest/dataGenerator 下载,执行如下语句
cd tests/comparisonTest/dataGeneratorjavac com/taosdata/generator/DataGenerator.java
相关参数如下
执行如下命令,会在~/testdata目录下生成100个数据文件,每个文件包含100台设备的测试数据;合计10000台设备,每台设备10000条记录
mkdir ~/testdatajava com/taosdata/generator/DataGenerator -dataDir ~/testdata -numOfDevices 10000 -numOfFiles 100 -rowsPerDevice 10000
TDengine是一个开源的专为物联网、车联网、工业互联网、IT运维等设计和优化的大数据平台。除核心的快10倍以上的时序数据库(Time-Series Database)功能外,还提供缓存、数据订阅、流式计算等功能,最大程度减少研发和运维的工作量。
Welcome to the TDengine shell, server version:1.6.1.0 client version:1.6.1.0Copyright (c) 2017 by TAOS Data, Inc. All rights reserved.taos>
TDengine Database为相同结构的设备创建一张超级表(STable),而每个具体的设备则单独创建一张数据表。因此,超级表的数据字段为采集时间、温度、湿度等与时间序列相关的采集数据;标签字段为设备编号、设备分组编号、设备名称等设备本身固定的描述信息。
创建超级表的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);
本文采用TDengine的原生C语言接口,编写数据写入及查询程序,后续的其他文章会提供基于JDBCDriver的测试程序。 测试程序源代码行数较多,因此您可以到 https://github.com/taosdata/TDengine/tree/2.6/tests/comparisonTest/tdengine 下载,执行如下语句
cd tdenginemake
会在当前目录下生成可执行文件./tdengineTest
TDengine的测试程序用法与OpenTSDB的用法相同,写入相关参数
例如
./tdengineTest -dataDir ./data -numOfFiles 10 -writeClients 2 -rowsPerRequest 100
查询相关参数
例如
./tdengineTest -sql ./sqlCmd.txt
OpenTSDB是基于HBase的分布式的,可扩展的时间序列数据库。
从https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/stable/ 下载 hbase-1.4.10-bin.tar.gz
tar xzvf hbase-1.4.10-bin.tar.gzcd hbase-1.4.10/bin./start_hbase.sh
git clone git://github.com/OpenTSDB/opentsdb.gitcd opentsdb./build.sh
如果是第一次运行OpenTSDB,还需要先创建一些必要的HBase表。
env COMPRESSION=NONE HBASE_HOME=${HBASE_HOME}/hbase-version ${OpenTSDB_download_path}/src/create_table.sh
sudo service opentsdb start
OpenTSDB可以通过http://hostIp:4242打开交互式网页
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOgVGyga-1687780424801)(null)]图0 OpenTSDB交互式网页
打开OpenTSDB配置文件
cd /etc/opentsdbvim opentsdb.conf
修改某些参数的默认值
tsd.core.auto_create_metrics = true tsd.http.request.enable_chunked = true tsd.http.request.max_chunk = 30000
因为本次测试采用http 接口,如果出现“java.net.NoRouteToHostException: Cannot assign requested address (Address not available)” 这种错误,还可执行如下命令
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
创建一个名为devices的measurement,所有设备都属于该measurement,不同设备通过标签进行区分。每台设备包含三个标签,分别为设备编号、设备分组编号、设备名称。每条记录只能包含一个metric,因此需要对温度(整型)和 湿度(浮点)分别写入一条记录。每条记录包含设备的三个标签,一个metric的名字和值,以及时间戳。
本文采用OpenTSDB的原生语言java,编写数据写入及查询程序。因为OpenTSDB并未提供官方java 接口,本次测试选择调用他们的http接口。测试程序源代码行数较多,因此您可以到 https://github.com/taosdata/TDengine/tree/2.6/tests/comparisonTest/opentsdb 下载。
写入相关参数
例如
cd opentsdb/opentsdbtest/src/targetjava -jar opentsdbtest-1.0-SNAPSHOT-jar-with-dependencies.jar -dataDir ~/testdata -numOfFiles 100 -writeClients 2 -rowsPerRequest 30
查询相关参数
java -jar opentsdbtest-1.0-SNAPSHOT-jar-with-dependencies.jar -sql sqlchoice
数据库的一个写入请求可以包含一条或多条记录,一次请求里包含的记录条数越多,写入性能就会相应提升。在以下测试中,使用R/R表示Records/Request ,即一次请求中的记录条数。同时,一个数据库可以支持多个客户端链接,链接数增加,系统总的写入通吐量也会相应增加。因此测试中,对于每一个数据库,都会测试一个客户端和多个客户端连接的情况。
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.0Copyright (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的写入吞吐量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3EMCi5Es-1687780419679)(https://tdengine.com/wp-content/uploads/2019/08/w1-2-1024x446.png)]图1 TDengine的写入吞吐量
OpenTSDB按照每次请求包含1,10,30,50,80条记录各进行测试,同时也测试了不同客户端连接数的情况。测试步骤如下所示,您可以修改示例中的参数,完成多次不同的测试。
1.清空上次测试数据运行HBase的shell命令行程序./hbase shell,可以看到如下类似信息HBase ShellUse "help" to get list of supported commands.Use "exit" to quit this interactive shell.Version 1.4.10, r76ab087819fe82ccf6f531096e18ad1bed079651, Wed Jun 5 16:48:11 PDT 2019hbase(main):001:0> disable 'tsdb'; disable 'tsdb-meta'; disable 'tsdb-tree'; disable 'tsdb-uid';hbase(main):002:0> drop 'tsdb'; drop 'tsdb-meta'; drop 'tsdb-tree'; drop 'tsdb-uid';hbase(main):003:0> quit然后再为OpenTSDB建表env COMPRESSION=NONE HBASE_HOME=${HBASE_HOME}/hbase-version ${OpenTSDB_download_path}/src/create_table.sh
2.测试执行
开启5个客户端读取~/testdata目录中的100个数据文件,每个请求写入30条数据,可以参考如下命令
java -jar opentsdbtest-1.0-SNAPSHOT-jar-with-dependencies.jar -dataDir ~/testdata -numOfFiles 100 -writeClients 5 -rowsPerRequest 30
写入吞吐量如下,单位为记录数/秒
R/R | 1 client | 2 clients | 3 clients | 4 clients | 5 clients | 6 clients | 7 clients |
---|---|---|---|---|---|---|---|
1 | 2370 | 2474 | 2572 | 2710 | 2497 | 2436 | 2371 |
10 | 18393 | 22828 | 22656 | 22924 | 22507 | 23200 | 23099 |
30 | 37463 | 45649 | 45735 | 46342 | 46795 | 46675 | 44908 |
50 | 45255 | 53222 | 50503 | 54475 | 54543 | 54283 | 54970 |
80 | 48794 | 56386 | 54564 | 56999 | 57198 | 57318 | 57272 |
表2 OpenTSDB的写入吞吐量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VS6EUUXv-1687780424047)(null)]图2 OpenTSDB的写入吞吐量
基于以上的测试数据,将TDengine和OpenTSDB测试出的最佳写入速度进行对比,结果如下
R/R | 1 client | 2 clients | 3 clients | 4 clients | 5 clients | 6 clients | 7 clients |
---|---|---|---|---|---|---|---|
TDengine | 512820 | 1055520 | 1174164 | 1306904 | 1426635 | 1458434 | 1477208 |
OpenTSDB | 48794 | 56386 | 54564 | 56999 | 57198 | 57318 | 57272 |
表3 TDengine和OpenTSDB的最佳写入性能对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YNODkMCO-1687780423775)(null)]图3 TDengine和OpenTSDB的最佳写入性能对比
从图3可以看出,TDengine的写入速度约为百万条记录/秒的量级,而OpenTSDB的写入速度约为六万条记录/秒的量级。因此可以得出结论,在同等数据集和硬件环境下,TDengine的写入速度远高于OpenTSDB,约为25倍。
本测试做了简单的遍历查询,就是将写入的数据全部读出。每次查询仅取出100万条记录,在测试数据准备时,已经按照devgroup字段将数据拆分成100个分组,本次测试随机选取其中10个分组进行查询。
\1. TDengine的测试方法
测试SQL语句存储在tdengine/q1.txt中,测试SQL语句参考select * from db.devices where devgroup=0;执行方法如下./tdengineTest -sql ./q1.txt
2.OpenTSDB的测试方法
OpenTSDB的查询语句为json语句,已写在代码里,测试时只需选择执行哪项查询即可。
测试SQL的选项(sqlchoice)为q1执行方法如下java -jar opentsdbtest-1.0-SNAPSHOT-jar-with-dependencies.jar -sql q1
读取速度如下,单位为秒
Latency | G-0 | G-10 | G-20 | G-30 | G-40 | G-50 | G-60 | G-70 | G-80 | G-90 |
---|---|---|---|---|---|---|---|---|---|---|
TDengine | 0.235 | 0.212 | 0.208 | 0.218 | 0.209 | 0.210 | 0.209 | 0.209 | 0.216 | 0.208 |
OpenTSDB | 6.69 | 5.92 | 6.58 | 6.65 | 7.29 | 7.51 | 5.98 | 6.20 | 7.03 | 6.57 |
表4 TDengine和OpenTSDB的读取性能对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CBSuI0hm-1687780423930)(null)]
从图表中可以看出,TDengine的100万条的读取速度稳定在0.21秒,吞吐量约为500万条记录/秒,OpenTSDB的100万条的读取速度稳定在6.7秒,吞吐量约为15万条记录/秒。所以从测试结果来看,TDengine的查询吞吐量远高于OpenTSDB, 约为OpenTSDB的16倍。
本单元的测试包含COUNT,AVERAGE,SUM,MAX,MIN,SPREAD这六个TDEngine和OpenTSDB共有的聚合函数。所有测试函数都会搭配筛选条件(WHERE)来选取设备的十分之一、十分之二、十分之三、直到全部设备。
测试SQL语句存储在tdengine/q2.txt中,测试SQL语句参考
select count(*) from db.devices where devgroup<10;
执行方法如下
./tdengineTest -sql ./q2.txt
查询速度如下表,单位为秒
Latency | 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 |
表5 TDengine聚合函数性能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v5ND4YzE-1687780425082)(null)]图5 TDengine聚合函数性能
OpenTSDB的查询语句为json语句,已写在代码里,测试时只需选择执行哪项查询即可。
测试SQL的选项(sqlchoice)为q2
执行方法如下
java -jar opentsdbtest-1.0-SNAPSHOT-jar-with-dependencies.jar -sql q2
查询速度如下表,单位为秒
Latency | 10% | 20% | 30% | 40% | 50% | 60% | 70% | 80% | 90% | 100% |
---|---|---|---|---|---|---|---|---|---|---|
count | 67.82 | 67.3 | 66.87 | 67.17 | 66.67 | 67.23 | 67.17 | 66.88 | 67.1 | 66.72 |
mean | 66.62 | 67.3 | 67.21 | 67.1 | 67.07 | 66.76 | 67.31 | 67.00 | 66.52 | 66.99 |
sum | 67.12 | 66.79 | 67.68 | 66.90 | 67.41 | 66.59 | 66.95 | 67.1 | 66.74 | 66.59 |
max | 66.55 | 67.13 | 66.93 | 67.12 | 66.96 | 67.15 | 66.91 | 66.73 | 67.1 | 67.29 |
min | 66.82 | 67.03 | 66.66 | 66.5 | 66.82 | 66.64 | 67.36 | 67.04 | 66.51 | 66.67 |
表6 OpenTSDB聚合函数性能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ovimdy2O-1687780424967)(null)]图6 OpenTSDB聚合函数性能
基于以上的测试数据,将TDengine和OpenTSDB在1亿条记录数据集的测试结果进行对比
>
Latency | count | average | sum | max | min |
---|---|---|---|---|---|
TDengine | 0.033 | 0.06 | 0.046 | 0.049 | 0.049 |
OpenTSDB | 66.72 | 66.99 | 66.59 | 67.29 | 66.67 |
表7 聚合函数性能对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kN9jFc8e-1687780426083)(null)]图7 聚合函数性能对比
从图7可以看出,TDengine的聚合函数查询时间在100毫秒以内,而OpenTSDB的查询时间在66秒左右。因此可以得出结论,在同等数据集和硬件环境下,TDengine的聚合速度远远高于OpenTSDB,超过1000倍。
本测试做了按标签分组函数的性能测试,测试函数会搭配筛选条件(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. OpenTSDB的测试方法
测试SQL的选项(sqlchoice)为q3
执行方法如下
java -jar opentsdbtest-1.0-SNAPSHOT-jar-with-dependencies.jar -sql q3
读取速度如下,单位为秒
Latency | 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 |
OpenTSDB | 125.91 | 127.39 | 126.79 | 126.42 | 125.73 | 126.85 | 127.77 | 126.99 | 127.16 | 126.41 |
表8 TDengine和OpenTSDB的按标签分组查询性能对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w5MVCENf-1687780423543)(null)]图8 TDengine和OpenTSDB的按标签分组查询性能对比
从测试结果来看,TDengine的分组聚合查询速度远高于OpenTSDB,约为1000倍。
本测试做了按时间分组函数的性能测试,测试函数会搭配筛选条件(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. OpenTSDB的测试方法
测试SQL的选项(sqlchoice)为q4
执行方法如下
java -jar opentsdbtest-1.0-SNAPSHOT-jar-with-dependencies.jar -sql q4
读取速度如下,单位为秒
Latency | 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 |
OpenTSDB | 82.53 | 83.04 | 83.93 | 82.74 | 82.96 | 82.75 | 82.14 | 82.37 | 83.29 | 82.46 |
表9 TDengine和OpenTSDB的按时间分组查询性能对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2WHftWRg-1687780426369)(null)]图9 TDengine和OpenTSDB的按时间分组查询性能对比
从测试结果来看,TDengine的按时间分组聚合查询速度远高于OpenTSDB,约为40倍。
本次测试共生成100个测试数据文件,存储在/testdata目录下,使用du命令查看/testdata目录的文件大小
cd ~/testdatadu -h .
如下图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z6oyFVne-1687780424163)(null)]图10 原始数据的磁盘占用情况
TDengine的磁盘文件默认位置在目录/var/lib/taos/data下,在查看磁盘文件大小时,首先将TDengine的服务停止
sudo systemctl stop taosd
然后,调用du命令,查看/var/lib/taos/data目录下文件的大小
cd /var/lib/taos/datadu -h .
如下图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K03LeIOV-1687780424350)(null)]图11 TDengine的磁盘占用情况
OpenTSDB的磁盘文件默认位置在目录/var/lib/hbase/data/下,在查看磁盘文件大小时,首先将OpenTSDB的服务停止
sudo service opentsdb stop
调用du命令,查看该目录下文件的大小。
cd /var/lib/hbase/data/du -sh
如下图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UJtToEw9-1687780419703)(https://tdengine.com/wp-content/uploads/2019/08/s2-2.png)]图12 OpenTSDB的磁盘占用情况
生成的测试数据文件占用的磁盘大小为3941MB,OpenTSDB磁盘占用2.3GB,TDengine磁盘占用459MB。在相对比较随机数据集的情况下,TDengine的压缩比约为OpenTSDB压缩比的5倍。
在物联网场景下,大多数采集数据的变化范围都比较小。由于TDengine采用列式存储,因此可以预期,TDengine在真实场景的压缩比表现会更好。
TDengine与OpenTSDB都是用与处理时序数据的存储引擎,其功能比较接近,各有特色。
功能支持 | TDengine | OpenTSDB |
---|---|---|
SQL语法支持 | 支持 | 不支持 |
私有化部署支持 | 支持 | 支持 |
水平扩展能力 | 支持 | 支持 |
系统连接管理 | 支持 | 支持 |
查询任务管理 | 支持 | 支持 |
数据导入工具 | 支持 | 支持 |
数据导出工具 | 支持 | 支持 |
Web管理工具 | 支持 | 支持 |
多介质分级存储 | 支持 | 支持 |
Telegraf数据采集 | 支持 | 支持 |
Grafana数据可视化 | 支持 | 支持 |
RESTFul | 支持 | 支持 |
C/C++ | 支持 | 不支持 |
JDBC/ODBC | 支持 | 不支持 |
GO | 支持 | 不支持 |
Python | 支持 | 不支持 |
数据库参数配置 | 支持 | 支持 |
配置副本数 | 支持 | 支持 |
数据时效 | 支持 | 支持 |
数据分区 | 支持 | 支持 |
流式计算 | 支持 | 不支持 |
微秒级精度 | 支持 | 支持 |
聚合函数支持 | 支持 | 支持 |
数据降采样 | 支持 | 支持 |
数据分页 | 支持 | 支持 |
数据插值 | 支持 | 支持 |
历史数据修改 | 不支持 | 支持 |
历史数据的标签修改 | 支持 | 支持 |
时间线删除 | 支持 | 支持 |
数据清空 | 支持 | 支持 |
表10 TDengine与OpenTSDB的功能对比
此次测试,从数据库的读、写、查询、压缩比等方面对TDengine和OpenTSDB进行了对比测试。测试用数据集、测试程序源码、执行的SQL语句都可以从 https://github.com/taosdata/TDengine/tree/2.6/tests/comparisonTest 下载,测试具备可重复性。
从测试结果上看,TDengine的性能远超OpenTSDB,写入性能约为25倍,读取性能约为32倍,聚合函数性能约为1000倍,按标签分组查询性能约为1000倍,按时间分组查询性能约为40倍,压缩比约为5倍,具体见下表。
TDengine | OpenTSDB | |
---|---|---|
写入吞吐量 | 1477208 记录数/秒 | 57272 记录数/秒 |
100万条记录读取时间 | 0.21秒 | 6.57秒 |
1亿条记录取平均值时间 | 0.06秒 | 66.99秒 |
1亿条记录按标签分组取均值时间 | 0.123 | 126.41秒 |
1亿条记录按时间分组取均值时间 | 2.549秒 | 82.46秒 |
表11 TDengine与OpenTSDB的性能对比汇总
**摘要:**为帮助用户了解TDengine Database的指标,特将TDengine与Cassandra从数据库的读、写、查询、压缩比等方面进行了对比测试。从测试结果上看,TDengine的性能远超Cassandra,写入性能约为20倍,读取性能约为17倍,聚合函数性能约为4000倍,按标签分组查询性能约为2500倍,按时间分组查询性能约为119倍。
对比测试的测试程序和数据库服务在同一台4核8GB的Dell台式机上部署,台式机型号为OptiPlex-3050,详细配置如下
OS: Ubuntu 16.04 x64CPU: Intel(R) Core(TM) i3-7100 CPU @ 3.90GHzMemory: 8GBDisk: 1TB HDD
本次测试调研了两类比较热门的测试数据集:
所以,为了使得测试可轻易重复,自己写了一个生成模拟数据的程序来进行本次测试。
测试数据生成程序模拟若干温湿度计生成的数据,其中温度为整数、湿度为浮点数,同时每个温度计包含设备ID、设备分组、设备名称三个标签。为了尽可能真实地模拟温湿度计的生成数据,没有使用完全随机数,而是针对每个温度计确保生成的数据值呈正态分布。
测试数据的频率为1秒钟,数据集包含10000台设备,每台设备10000条记录。每条数据采集记录包含3个标签字段,2个数据字段,1个时间戳字段。
采用java程序生成测试数据集,测试程序源代码行数较多,因此您可以到https://github.com/taosdata/tests/tree/master/comparisonTest/dataGenerator 下载,执行如下语句
cd tests/comparisonTest/dataGeneratorjavac com/taosdata/generator/DataGenerator.java
相关参数如下
执行如下命令,会在~/testdata目录下生成100个数据文件,每个文件包含100台设备的测试数据;合计10000台设备,每台设备10000条记录
mkdir ~/testdatajava com/taosdata/generator/DataGenerator -dataDir ~/testdata -numOfDevices 10000 -numOfFiles 100 -rowsPerDevice 10000
TDengine是一个开源的专为物联网、车联网、工业互联网、IT运维等设计和优化的大数据平台。除核心的快10倍以上的时序数据库(Time-Series Database)功能外,还提供缓存、数据订阅、流式计算等功能,最大程度减少研发和运维的工作量
Welcome to the TDengine shell, server version:1.6.1.0 client version:1.6.1.0Copyright (c) 2017 by TAOS Data, Inc. All rights reserved.
taos>
TDengine Database为相同结构的设备创建一张超级表(STable),而每个具体的设备则单独创建一张数据表。因此,超级表的数据字段为采集时间、温度、湿度等与时间序列相关的采集数据;标签字段为设备编号、设备分组编号、设备名称等设备本身固定的描述信息。 创建超级表的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);
本文采用TDengine的原生C语言接口,编写数据写入及查询程序,后续的其他文章会提供基于JDBCDriver的测试程序。
测试程序源代码行数较多,因此您可以到https://github.com/taosdata/tests/tree/master/comparisonTest/tdengine 下载,执行如下语句
cd tdengine
make
会在当前目录下生成可执行文件./tdengineTest
TDengine的测试程序用法与Cassandra的用法相同,写入相关参数
例如
./tdengineTest -dataDir ./data -numOfFiles 10 -writeClients 2 -rowsPerRequest 100
查询相关参数
例如
./tdengineTest -sql ./sqlCmd.txt
Apache Cassandra是一个高度可扩展的高性能分布式数据库,用于处理大量商用服务器上的大量数据,提供高可用性,无单点故障。这是一种NoSQL类型的数据库。
echo "deb http://www.apache.org/dist/cassandra/debian 311x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
curl https://www.apache.org/dist/cassandra/KEYS | sudo apt-key add -
sudo apt-get update
sudo apt-get install cassandra
sudo service cassandra start
Connected to Test Cluster at 127.0.0.1:9042.[cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]Use HELP for help.
cqlsh>
创建一个名为Cassandra.test的measurement,所有设备都属于该measurement。每条记录包含六个数据字段,分别为时间戳(毫秒),温度(整型),湿度(浮点),设备编号(整型)、设备分组编号(整型)、设备名称(字符型)。主键为(设备分组编号、设备编号、设备名称,时间戳)。因为Cassandra的where语句里只对主键进行搜索,所以在后面查询时需要进行筛选的列一定要放进主键里。同时,因为Cassandra里group by语句只能对主键且按照主键的顺序进行聚合,所以这里将后面聚合查询用到的设备分组编号放在主键的第一位。
本文采用Cassandra的原生Java语言接口,编写数据写入及查询程序,测试程序源代码行数较多,因此您可以到https://github.com/taosdata/tests/tree/master/comparisonTest/cassandra 下载。
安装Cassandra Java 客户端。本次测试使用DataStax提供的客户端,具体可见https://github.com/datastax/java-driver。 DataStax使用maven管理源码,在Cassandra/Cassandratest/pom.xml 里DataStax客户端已经被添加入maven的库里。
测试准备
由于Cassandra建表写入查询速度比较慢,在本次测试中很容易出现timeout错误,测试无法进行下去。因此测试前一定需要修改Cassandra服务端和客户端的timeout的默认值。
写入相关参数
例如
cd cassandra/cassandratest/target
java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -datadir ./data -numofFiles 100 -rowsperrequest 2000 -writeclients 4 -conf cassandra/application.conf
查询相关参数
例如
cd cassandra/cassandratest/target
java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -sql cassandra/sqlCmd.txt -conf cassandra/application.conf
数据库的一个写入请求可以包含一条或多条记录,一次请求里包含的记录条数越多,写入性能就会相应提升。在以下测试中,使用R/R表示Records/Request ,即一次请求中的记录条数。同时,一个数据库可以支持多个客户端链接,链接数增加,系统总的写入通吐量也会相应增加。因此测试中,对于每一个数据库,都会测试一个客户端和多个客户端连接的情况。
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.0Copyright (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的写入吞吐量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FEe64EYY-1687780426240)(null)]图1 TDengine的写入吞吐量
Cassandra按照每次请求包含1,10,50, 100,500,1000条记录各进行测试,同时也测试了不同客户端连接数的情况。测试步骤如下所示,您可以修改示例中的参数,完成多次不同的测试。
1.清空上次测试数据运行Cassandra的shell命令行程序cqlsh,可以看到如下类似信息Connected to Test Cluster at 127.0.0.1:9042.[cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]Use HELP for help.cqlsh> drop database Cassandra;
2.测试执行开启5个客户端读取~/testdata目录中的100个数据文件,每个请求写入1000条数据,可以参考如下命令java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -dataDir ~/testdata -numOfFiles 100 -writeClients 5 -rowsPerRequest 1000 -conf cassandra/application.conf
写入吞吐量如下,单位为记录数/秒
R/R | 1 client | 2 clients | 3 clients | 4 clients | 5 clients | 6 clients | 7 clients |
---|---|---|---|---|---|---|---|
1 | 3515 | 4925 | 5529 | 5991 | 6331 | 6380 | 6597 |
10 | 35998 | 35542 | 35124 | 34135 | 35077 | 35886 | 36102 |
50 | 31743 | 49423 | 51626 | 55752 | 57282 | 56815 | 55831 |
100 | 38328 | 50387 | 54519 | 56940 | 57853 | 59335 | 61708 |
500 | 30417 | 36264 | 38078 | 39066 | 39459 | 39758 | 39918 |
1000 | 21555 | 25293 | 26224 | 26559 | 26765 | 26511 | 26693 |
表2 Cassandra的写入吞吐量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w2bUCRMB-1687780426482)(null)]图2 Cassandra的写入吞吐量
基于以上的测试数据,将TDengine和Cassandra测试出的最佳写入速度进行对比,结果如下
R/R | 1 client | 2 clients | 3 clients | 4 clients | 5 clients | 6 clients | 7 clients |
---|---|---|---|---|---|---|---|
TDengine | 512820 | 1055520 | 1174164 | 1306904 | 1426635 | 1458434 | 1477208 |
Cassandra | 38328 | 50387 | 54519 | 56940 | 57835 | 59335 | 61708 |
表3 TDengine和Cassandra的最佳写入性能对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WwbfpgXO-1687780425312)(null)]图3. TDengine和Cassandra的最佳写入性能对比
从图3可以看出,TDengine的写入速度约为百万条记录/秒的量级,而Cassandra的写入速度约为1~10万条记录/秒的量级。因此可以得出结论,在同等数据集和硬件环境下,TDengine的写入速度远高于Cassandra,约为20倍。
本测试做了简单的遍历查询,就是将写入的数据全部读出。
\1. TDengine的测试方法
测试SQL语句存储在tdengine/q1.txt中,测试SQL语句参考select * from db.devices where devgroup=0;
执行方法如下
./tdengineTest -sql ./q1.txt
2.Cassandra的测试方法
测试SQL语句存储在Cassandra/q1.txt中,测试SQL语句参考select * from devices where devgroup=0;
执行方法如下
java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -conf cassandra/application.conf -sql cassandra/q1.txt
读取速度如下,单位为秒
Latency | G-0 | G-10 | G-20 | G-30 | G-40 | G-50 | G-60 | G-70 | G-80 | G-90 |
---|---|---|---|---|---|---|---|---|---|---|
TDengine | 0.235 | 0.212 | 0.208 | 0.218 | 0.209 | 0.210 | 0.209 | 0.209 | 0.216 | 0.208 |
Cassandra | 3.92 | 3.68 | 3.65 | 3.61 | 3.69 | 3.57 | 3.55 | 3.59 | 3.66 | 3.64 |
表4 TDengine和Cassandra的读取性能对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aaJKdzNK-1687780424466)(null)]图4 TDengine和Cassandra的读取性能对比
从图表中可以看出,TDengine的100万条的读取速度稳定在0.21秒,吞吐量约为500万条记录/秒,Cassandra的100万条的读取速度大约在3.6秒,吞吐量约为30万条记录/秒。所以从测试结果来看,TDengine的查询吞吐量高于Cassandra,约为Cassandra的17倍。
本单元的测试包含COUNT,AVERAGE,SUM,MAX,MIN这五个TDEngine和Cassandra共有的聚合函数。所有测试函数都会搭配筛选条件(WHERE)来选取设备的十分之一、十分之二、十分之三、直到全部设备。
测试SQL语句存储在tdengine/q2.txt中,测试SQL语句参考select count(*) from db.devices where devgroup<10;
执行方法如下./tdengineTest -sql ./q2.txt
查询速度如下表,单位为秒
Latency | 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聚合函数性能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P5mkbNIQ-1687780426574)(null)]图5 TDengine聚合函数性能
测试SQL语句存储在Cassandra/q2.txt中。
select count(*) from devices where devgroup<10;
执行方法如下
Java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -sql cassandra/q2.txt -conf cassandra/application.conf
查询速度如下表,单位为秒
Latency | 10% | 20% | 30% | 40% | 50% | 60% | 70% | 80% | 90% | 100% |
---|---|---|---|---|---|---|---|---|---|---|
count | 33.79 | 67.23 | 87.64 | 105.82 | 131.52 | 160.88 | 188.70 | 213.85 | 240.39 | 264.49 |
mean | 28.88 | 57.83 | 87.16 | 114.87 | 145.30 | 173.32 | 204.11 | 235.33 | 261.29 | 290.97 |
sum | 29.35 | 58.19 | 86.24 | 115.56 | 145.73 | 173.81 | 203.94 | 234.15 | 260.41 | 292.51 |
max | 28.94 | 57.85 | 85.60 | 115.02 | 145.62 | 175.08 | 202.53 | 232.61 | 260.37 | 288.46 |
min | 29.58 | 58.26 | 87.27 | 117.22 | 144.01 | 174.20 | 201.88 | 235.98 | 263.69 | 290.27 |
表6 Cassandra聚合函数性能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JuqBEJGu-1687780424680)(null)]图6 Cassandra聚合函数性能
基于以上的测试数据,将TDengine和Cassandra在1亿条记录数据集的测试结果进行对比
Latency | count | average | sum | max | min |
---|---|---|---|---|---|
TDengine | 0.033 | 0.06 | 0.046 | 0.049 | 0.049 |
Cassandra | 264.49 | 290.97 | 291.51 | 288.46 | 290.27 |
表7 聚合函数性能对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ijuvlTvx-1687780425698)(null)]图7 聚合函数性能对比
从图7可以看出,TDengine的聚合函数查询时间在100毫秒以内,而Cassandra的查询时间在200~300秒左右。因此可以得出结论,在同等数据集和硬件环境下,TDengine的聚合查询速度远远高于Cassandra,超过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. Cassandra的测试方法 测试SQL语句存储在Cassandra/q3.txt中,例如
select count(temperature), sum(temperature), avg(temperature) from db.devices where devgroup<10 group by devgroup;
执行方法如下
java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -sql cassandra/q3.txt -conf cassandra/application.conf
读取速度如下,单位为秒
Latency | 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 |
Cassandra | 31.40 | 62.21 | 92.12 | 122.01 | 154.95 | 185.03 | 217.46 | 249.59 | 281.86 | 308.89 |
表8 TDengine和Cassandra的按标签分组查询性能对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dIof2CZv-1687780426678)(null)]图8 TDengine和Cassandra的按标签分组查询性能对比
从测试结果来看,TDengine的分组聚合查询速度远高于Cassandra,约为3000倍。
本测试做了按时间分组函数的性能测试,测试函数会搭配筛选条件(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. Cassandra的测试方法 因为前面提到的Cassandra 在where和group by 语句里的限制,在测试之前,需要重新写入数据,在原表中加入“minute”这一列,同时将它放入主键的第一位。执行下面命令再写入一次数据
java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -datadir ~/testdata -numofFiles 100 -rowsperrequest 2000 -writeclients 4 -conf cassandra/application.conf -timetest
测试SQL语句存储在Cassandra/q4.txt中,例如
select count(temperature), sum(temperature), mean(temperature) from devices where devgroup<10 group by minute;
执行方法如下
java -jar cassandratest-1.0-SNAPSHOT-jar-with-dependencies.jar -sql cassandra/q4.txt -conf cassandra/application.conf
读取速度如下,单位为秒
Latency | 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 |
Cassandra | 131.35 | 153.87 | 169.40 | 188.86 | 203.47 | 227.61 | 250.41 | 274.53 | 294.87 | 303.51 |
表9 TDengine和Cassandra的按时间分组查询性能对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kb7NT99Y-1687780425179)(null)]图9 TDengine和Cassandra的按时间分组查询性能对比
从测试结果来看,TDengine的按时间分组聚合查询速度远高于Cassandra,约为100倍。
本次测试共生成100个测试数据文件,存储在/testdata目录下,使用du命令查看/testdata目录的文件大小
cd ~/testdata
du -h .
如下图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tzS9y7hl-1687780425424)(null)]图10 原始数据的磁盘占用情况
TDengine的磁盘文件默认位置在目录/var/lib/taos/data下,在查看磁盘文件大小时,首先将TDengine的服务停止
sudo systemctl stop taosd
然后,调用du命令,查看/var/lib/taos/data目录下文件的大小
cd /var/lib/taos/datadu -h .
如下图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PVxlcWbM-1687780424580)(null)]图11 TDengine的磁盘占用情况
Cassandra的磁盘文件默认位置在目录/var/lib/Cassandra/data/keyspace_name下,在查看磁盘文件大小时,首先将Cassandra的服务停止
sudo service Cassandra stop
本测试中,数据存储在/var/lib/Cassandra/data/Cassandra目录下,调用du命令,查看该目录下文件的大小。
cd /var/lib/Cassandra/data/Cassandra
du -sh .
如下图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X0s7LRCX-1687780425992)(null)]图12 Cassandra的磁盘占用情况
生成的测试数据文件占用的磁盘大小为3941MB,Cassandra磁盘占用12GB,TDengine磁盘占用459MB。在相对比较随机数据集的情况下,TDengine的压缩比约为Cassandra压缩比的26.7倍。
在物联网场景下,大多数采集数据的变化范围都比较小。由于TDengine采用列式存储,因此可以预期,TDengine在真实场景的压缩比表现会更好。
TDengine与Cassandra都是用与处理时序数据的存储引擎,其功能比较接近,各有特色。
功能支持 | TDengine | Cassandra |
---|---|---|
SQL语法支持 | 支持 | 不支持 |
查询中的计算支持* | 支持 | 不支持 |
非主键分组 | 支持 | 不支持 |
私有化部署支持 | 支持 | 支持 |
水平扩展能力 | 支持 | 支持 |
系统连接管理 | 支持 | 支持 |
查询任务管理 | 支持 | 支持 |
数据导入工具 | 支持 | 支持 |
数据导出工具 | 支持 | 支持 |
Web管理工具 | 支持 | 支持 |
多介质分级存储 | 支持 | 支持 |
Telegraf数据采集 | 支持 | 支持 |
Grafana数据可视化 | 支持 | 支持 |
RESTFul | 支持 | 支持 |
C/C++ | 支持 | 不支持 |
JDBC/ODBC | 支持 | 不支持 |
GO | 支持 | 支持 |
Python | 支持 | 支持 |
数据库参数配置 | 支持 | 支持 |
配置副本数 | 支持 | 支持 |
数据时效 | 支持 | 支持 |
数据分区 | 支持 | 支持 |
流式计算 | 支持 | 不支持 |
数据订阅 | 支持 | 不支持 |
微秒级精度 | 支持 | 支持 |
聚合函数支持 | 支持 | 支持 |
数据降采样 | 支持 | 支持 |
数据分页 | 支持 | 支持 |
数据插值 | 支持 | 支持 |
历史数据修改 | 不支持 | 支持 |
时间线删除 | 支持 | 支持 |
数据清空 | 支持 | 支持 |
表10 TDengine与Cassandra的功能对比
*note: Cassandra的select语句中不支持数学运算,如有需要,可以使用用户自定义函数。具体参见https://Cassandra.apache.org/doc/latest/cql/index.html
此次测试,从数据库的读、写、查询、压缩比等方面对TDengine和Cassandra进行了对比测试。测试用数据集、测试程序源码、执行的SQL语句都可以从https://github.com/taosdata/tests/tree/master/comparisonTest/ 下载,测试具备可重复性。
从测试结果上看,TDengine Database的性能远超Cassandra,写入性能约为20倍,读取性能约为17倍,聚合函数性能约为4000倍,按标签分组查询性能约为2500倍,按时间分组查询性能约为119倍,具体见下表。
TDengine | Cassandra | |
---|---|---|
写入吞吐量 | 1477208 记录数/秒 | 记录数61708/秒 |
100万条记录读取时间 | 0.21秒 | 3.64秒 |
1亿条记录取平均值时间 | 0.06秒 | 264.49秒 |
1亿条记录按标签分组取均值时间 | 0.123 | 308.39秒 |
1亿条记录按时间分组取均值时间 | 2.549秒 | 303.51秒 |
表11 TDengine与Cassandra的性能对比汇总
参考: https://www.taosdata.com/engineering/1105.html
https://www.taosdata.com/engineering/621.html
https://www.taosdata.com/engineering/573.html
https://www.taosdata.com/engineering/3248.html
https://www.taosdata.com/engineering/5969.html
https://docs.taosdata.com/intro/