TDengine VS InfluxDB ,写入性能大 PK !

前言

大家好。为了更好地展现 TDengine 的性能与竞争力,我们涛思数据精心策划了《 TDengine 和 InfluxDB 的性能对比》系列测试报告。该系列报告的主要测试点为:

  1. 数据写入性能
  2. 查询响应速度
  3. 磁盘的数据压缩能力

众所周知,以上测试目标都是用户使用分布式数据库所关注的重中之重。所以,“一言不合上数据”,我们决定对大家给出关于 TDengine 更直观的呈现。今天,我们就先来分享一下两款数据库写入性能的对比。

为了更加具有说服力,本次的测试是基于 InfluxDB 此前与 Graphite 的性能对比中使用过的场景和数据集的。(https://www.influxdata.com/blog/influxdb-outperforms-graphite-in-time-series-data-metrics-benchmark/

经过多方准备与反复测试后,我们得出的结论是:

1.在 InfluxDB 发布的自己最优的条件下, TDengine 的写入速度是它的 2 倍。

2.当设备数放大到 1000 的时候, TDengine 的写入速度是 InfluxDB 的 5.2 倍。

此外,除了给出测试结果,我们还有一个小目标——那就是按照文中的步骤和配置,所有阅读本文的开发人员或者架构师都可以复现出同样的过程与结果。我们认为,只有通过这样得来的测试报告才是最有价值的测试报告。

正文

InfluxDB 是一个用 Go 语言编写的开源时序数据库。其核心是一个自定义构建的存储引擎,它针对时间序列数据进行了优化,是目前最为流行的时间序列数据库,在 DB-Engines 的时序数据库榜单中稳居第一。

InfluxDB Logo

TDengine 是一款高性能、分布式、支持 SQL 的时序数据库。该产品不依赖任何开源或第三方软件,拥有完全自主知识产权,具有高性能、高可靠、可伸缩、零管理、简单易学等技术特点。和 InfluxDB 相比, TDengine 是当前时序数据库领域中一匹势头正劲的黑马。

TDengine Logo

接下来,我们正式进入测试环节。

一、 基础信息如下:

TDengineInfluxDB
简介TDengine 是一款高性能、分布式、支持 SQL 的时序数据库被设计用来做时间序列、事件和指标数据管理的一款时序数据库
官网https://www.taosdata.com/ https://www.influxdata.com
开发语言CGo
测试版本2.0.18.01.8.4
下载方式涛思官网InfluxData
写入方式cgo(go1.16)rest

本次测试使用的数据集是为 DevOps 监控指标案例建模的数据集。在这个场景中,一组服务器需要定期报告系统和应用程序的指标,具体实现是:每 10 秒在一台服务器上的 9 个子系统(CPU 、内存、磁盘、磁盘I/O、内核、网络、 Redis 、 PostgreSQL 和 Nginx)上采样 100 个值。为了更好的完成关键指标的对比,在与Graphite的该次对比中,InfluxDB选择了一个周期为24小时,设备为 100 台的设定。因此,本次的 TDengine 和 InfluxDB 对比测试也是重新使用了这个相对适中的部署。

重要参数如下图,在上文链接中均可见:

测试使用的数据集

二、 环境准备

为了方便大家复现,我们所有的测试都是在运行 Ubuntu 20.10 的两台 Azure 虚拟机上进行的,配置如下:

  1. 标准 E16as_v4 ©AMD EPYC 7452(32-Core Processor 2345.608 MHz,16vCPU, 128GB RAM, 5000 IOPS SSD 1024GB) 用于数据库服务端。
  2. 标准 F8s_v2 instance type ©Intel(R) Xeon(R) Platinum 8272CL (2.60GHz ,8vCPU,16 GB RAM)用于数据库客户端。

值得注意的是虽然上面服务端 CPU 显示为 32 核,但是云服务只分给 16 个 processor 。

三、具体测试方法与步骤:

我们只要按照如下方式操作便可复现本次测试结果:

1. 安装准备

部署完 TDengine 、 InfluxDB 与 Go 语言环境,确保两台服务器的数据库也连接正常使用正常(建库删库写入查询功能均需测试,建库之后立即删除,如有问题立刻排查)

此外,在测试中应该注意以下几点( TDengine 的默认配置文件为 /etc/taos/taos.cfg ):

1)fsync 的设置要保持同步,InfluxDB 默认是无延时的 fsync ,需要修改 TDengine 的这两个参数:walLevel=2 ,fsync=0才能达到相同的配置环境。后续的一切测试均是在这个设置条件下完成。

2)TDengine 的客户端要把 maxSQLLength 开到最大 1048576 。

3)客户端服务器要安装 TDengine 的客户端。(注意:bulk_load_tdengine 编译需要依赖 TDengine 客户端)

2. 从 GitHub 取下代码,在客户端服务器执行:

git clone https://github.com/taosdata/timeseriesdatabase-comparisons

3. 准备编译环境,生成写入程序,timeseriesdatabase-comparisons 的根目录为工作目录:

cd timeseriesdatabase-comparisons/build/tsdbcompare/
./compilation.sh

4. 切换到 build/tsdbcompare 目录下,运行脚本复现测试结果

cd timeseriesdatabase-comparisons/build/tsdbcompare/  && ./loop_scale_to_server.sh -a "test217"

# 本次测试的服务端 hostname 是"test217"
# loop_scale_to_server.sh 调用 write_to_server.sh 来完成所有测试过程
# ./writ_to_server.sh -h 可以查看对应参数,loop_scale_to_server.sh和前者参数一致

生成数据参数(总记录数=(t-e)*24*3600/ i * s)
i : 数据间隔,默认 10s
s : 样本数量,默认 100
t : 数据起始时间,默认 '2018-01-01T00:00:00Z'
e : 数据终止时间,默认 '2018-01-02T00:00:00Z'
g : 是否生成数据,默认 1(1:生成数据,0:不生成数据)
T : TDengine 的默认数据目录路径,默认为 "/var/lib/taos"
I : InfluxDB 默认数据目录路径,默认为 "/var/lib/influxdb"
  
写入参数
b : batchsize(默认 5000)
w :  workers(默认 16)
n :  TDengine写入方式(false: cgo, true: rest, 默认 false)
a :  TDengine 和 InfluxDB 的 hostname 或者 ip 地址,默认为127.0.0.1
  
如果希望自定义更多参数值,可以查看 write_to_server.sh 脚本代码

注意:如果遇到干扰因素导致写入失败,可以手动传入参数再次执行得到测试结果。如 write_to_server.sh  -a “test217” -T “/var/lib/taos/” -I “/var/lib/influxdb/” -t ‘2018-01-01T00:00:00Z’ -e ‘2018-01-02T00:00:00Z’  )

四、实际测量数据

经过一番测试后,我们制作了这样一张表格。通过它我们可以清楚地看到:不论是单线程还是多线程,不论是小批次还是大批次, TDengine 都一直稳稳保持着2倍左右的速度优势。

其中 5000 batch,16 wokers 的场景下( InfluxDB 与 Graphite 的对比报告中的测试项), InfluxDB耗时 35.04 秒,而 TDengine 耗时仅 17.92 秒。

测量结果表格(100台设备)

此外,InfluxDB 仅仅做了 100 台设备和 900 个监测点的测试。但是于我们看来,实际应用场景中的设备数量和监测点数目一定是远远超过这个数字的。于是我们调整了脚本参数,从 100 个设备逐步增加到 200,400,600,800,1000,通过将双方数据量的同比例放大,从而得出了更多接入设备情况下的写入对比结果。

(数据表格附在正文后。且由于所耗时间实在过长,所以 1000 台设备单线程写入 1 行的结果没有写入表格,不影响实际结果)结果是,在成倍地增加设备数后,TDengine 依然保持着稳稳地领先,并且将优势继续扩大。

五、结论


当前的测试结果已经比较有力地说明了前言中的两点结论:

1.在 InfluxDB 发布的自己最优的条件下,TDengine 的写入速度是它的 2 倍。

2.当设备数放大到 1000 的时候, TDengine 的写入速度是 InfluxDB 的 5.2 倍。

由于 5.2 倍又恰好是本次测试双方的性能差距最高点,因此我们毫不犹豫地决定使用该测试条件(5000batch size,16workers)作出两张以设备台数为横轴的折线图,因为这将极具代表性。(图一代表双方写入相同数据量的所耗秒数,图二代表双方每秒写入的行数。)

写入耗时对比
每秒写入行数对比

这两张图充分说明了一点:设备数越多,数据量越大, TDengine 的优势就越明显,正如成语有云——韩信将兵,多多益善。

而考虑到本次性能测试对比的接口类型并不一致, TDengine 采用的是 cgo 接口而 InfluxDB 为 REST ,性能上会有少量浮动,绝不会从根本上改变结果,而后续其他接口以及场景的测试我们也会陆续推出。

如果您对更多细节感兴趣,可以自行使用上文的测试代码自行操作复现,我们将十分欢迎您宝贵的建议。

最后附上测试数据全记录:

100台设备
200台设备
400台设备
600 台设备
800台设备
1000台设备