乐趣区

关于数据库:TDengine和InfluxDB的性能对比报告

前言

性能是用户在抉择和应用时序数据库时十分关注的一个点。

为了精确体现 TDengine 的性能数据,咱们策动了《TDengine 和 InfluxDB 的性能比照》系列测试报告。

“一言不合上数据”,明天咱们就先来分享一下两款数据库写入性能的比照。

为了更加具备说服力,本次的测试是基于 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 的时序数据库榜单中稳居第一。

TDengine 是一款集成了音讯队列,数据库,流式计算等性能的物联网大数据平台。该产品不依赖任何开源或第三方软件,领有齐全自主知识产权,具备高性能、高牢靠、可伸缩、零治理、简略易学等技术特点。和 InfluxDB 相比,TDengine 是以后时序数据库畛域中一匹势头正劲的黑马。

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

一. 根底信息如下:

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

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

  二. 环境筹备

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

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

值得注意的是尽管下面服务端 CPU 显示为 32 核,然而云服务只分给 16 个 processor。

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

咱们只有依照如下形式操作便可复现本次测试后果:

1. 整体规划:

服务端机器须要装置 Influxdb 和 TDengine 服务端;客户端机器须要装置 TDengine 客户端(版本同为 2.0.18)和 go 语言环境,以及从 github 上下载性能测试脚本并运行。

2. 装置筹备:

1) TDengine 装置形式(蕴含客户端):

A. TDengine 安装包下载

B. TDengine 装置步骤

2) Influxdb 装置形式:

Influxdb 安装包下载以及装置步骤

3) go1. 装置形式:

wget https://studygolang.com/dl/golang/go1.16.linux-amd64.tar.gz

tar -C /usr/local -xzf go1.16.linux-amd64.tar.gz

增加环境变量 /etc/profile export PATH=$PATH:/usr/local/go/bin

source /etc/profile

部署完 TDengine、InfluxDB 与 Go 语言环境,确保两台服务器的数据库连贯失常应用失常(建库删库写入查问性能均需测试,建库之后立刻删除,如有问题立即排查,为确保权限问题不打搅环境测试,能够全程应用 root 用户)

此外,在测试中应该留神以下几点:

1)fsync 的设置要放弃同步,InfluxDB 默认是无延时的 fsync,须要批改 TDengine 的这两个参数:walLevel=2,fsync= 0 能力达到雷同的配置环境。后续的所有测试均是在这个设置条件下实现。

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

3. 从 github 取下代码:

su - root
mkdir /comparisons
cd /comparisons
git clone https://github.com/taosdata/timeseriesdatabase-comparisons

4. 编译筹备:

1)cd /comparisons/timeseriesdatabase-comparisons,而后删除外面的 go.mod 和 go.sum 文件
2)执行 go mod init github.com/taosdata/timeseriesdatabase-comparisons
3)执行如下命令装置依赖包:go get github.com/golang/protobuf/proto
go get github.com/google/flatbuffers/go
go get github.com/pelletier/go-toml
go get github.com/pkg/profile
go get github.com/valyala/fasthttp

最初看到新的 go.sum 和 go.mod 文件后,能够持续操作。

5. 编译阶段:

mkdir  /comparisons/timeseriesdatabase-comparisons/build/tsdbcompare/bin
咱们写入须要 3 个程序,别离是 bulk_data_gen、bulk_load_influx 以及 bulk_load_tdengine。下载失去代码后,别离进入相应目录执行编译等如下命令:cd /comparisons/timeseriesdatabase-comparisons/cmd/bulk_data_gen ;go build ;cp bulk_data_gen ../../build/tsdbcompare/bin
cd ../bulk_load_influx;go build ;cp bulk_load_influx ../../build/tsdbcompare/bin
cd ../bulk_load_tdengine;go build ; cp bulk_load_tdengine ../../build/tsdbcompare/bin

(留神:编译 bulk_load_tdengine 之前要记得装置 TDengine 客户端)

6. 批改脚本:

批改 /comparisons/timeseriesdatabase-comparisons/build/tsdbcompare/write_to_server.sh, 把 add=’tdvs’, 批改为您选用的数据库服务端 hostname。

而后批改如下四行命令,将原有目录替换为本人数据库的文件目录所在(通常 TDengine 为 /var/lib/taos,Influxdb 为 /var/lib/influxdb):

rm -rf /mnt/lib/taos/* -> rm -rf /var/lib/taos/
rm -rf /mnt/lib/influxdb/* ->rm -rf /var/lib/influxdb/*
TDDISK=`ssh root@$add "du -sh /mnt/lib/taos/vnode | cut -d' '-f 1" `-> TDDISK=`ssh root@$add "du -sh /var/lib/taos/vnode | cut -d' '-f 1" `
IFDISK=`ssh root@$add "du -sh /mnt/lib/influxdb/data | cut -d' '-f 1" `-> IFDISK=`ssh root@$add "du -sh /var/lib/influxdb/data | cut -d' '-f 1" `

登记掉:curl “http://$add:8086/query?q=drop%20database%20benchmark_db” -X POST 这一行后面的 #。

7. 运行脚本复现测试后果:

cd /comparisons/timeseriesdatabase-comparisons/build/tsdbcompare/

./loop_scale_to_server.sh

(留神:此脚本封装了数据的生成与写入过程,有趣味的读者能够自行浏览。如果遇到烦扰因素导致写入失败,能够手动传入参数再次执行失去测试后果。如 write_to_server.sh -b 5000 -w 100 -g 0 -s 100。具体参数含意能够通过“/comparison/timeseriesdatabase-comparisons/build/tsdbcompare/write_to_server.sh - h 得悉)

四. 理论测量数据

通过一番测试后,咱们制作了这样一张表格。通过它咱们能够分明地看到:不论是单线程还是多线程,不论是小批次还是大批次,TDengine 都始终稳稳放弃着 2 倍左右的速度劣势。

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

此外,InfluxDB 仅仅做了 100 台设施和 900 个监测点的测试。然而于咱们看来,理论利用场景中的设施数量和监测点数目肯定是远远超过这个数字的。于是咱们调整了脚本参数,从 100 个设施逐渐减少到 200,400,600,800,1000,通过将单方数据量的同比例放大,从而得出了更多接入设施状况下的写入比照后果。

(数据表格附在注释后。且因为所耗时间切实过长,所以 1000 台设施单线程写入 1 行的后果没有写入表格,不影响理论后果)后果是,在成倍地减少设施数后,TDengine 仍然放弃着稳稳地当先,并且将劣势持续扩充。

论断

以后的测试后果曾经比拟无力地阐明了前言中的两点论断:
1. 在 InfluxDB 公布的本人最优的条件下,TDengine 的写入速度是它的两倍。
2. 当设施数放大到 1000 的时候,TDengine 的写入速度是 InfluxDB 的 5.2 倍。

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

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

而思考到本次性能测试比照的接口类型并不统一,TDengine 采纳的是 cgo 接口而 InfluxDB 为 rest,性能上会有大量浮动,绝不会从根本上扭转后果,而后续其余接口以及场景的测试咱们也会陆续推出。

如果您对更多细节感兴趣,能够自行应用上文的测试代码自行操作复现,咱们将非常欢迎您贵重的倡议。

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

退出移动版