基于 TDengine 3.0 TSBS 基准测试报告,此前我们已经输出了系列文——为什么选择 TSBS 作为测试平台、写入性能对比、查询性能对比,分别就 TSBS 及测试环境、写入性能及开销、查询性能及开销进行了相关解读。在本篇文章中,我们将为想要验证本报告测试结果的小伙伴,分享进行报告测试复现的详细步骤。
数据建模
在 TSBS 框架中, TimescaleDB 和 InfluxDB 会自动创建相应的数据模型并生成对应格式的数据。本文不再赘述其具体的数据建模方式,只介绍 TDengine 的数据建模策略。
TDengine 一个重要的创新是其独特的数据模型——为每个设备创建独立的数据表(子表),并通过超级表(Super Table)在逻辑上和语义上对同一采集类型的设备进行统一管理。针对 DevOps 场景的数据内容,我们为每个设备 (这里是 CPU)创建了一个表,用以存储该表的时序数据。我们在 TDengine 中使用 hostname 作为子表的名称(因为hostname 可以作为每个设备的标识 ID),并使用如下的语句创建名为 CPU 的超级表,包含 10 个测量值和 10 个标签。
create stable cpu (ts timestamp,usage_user bigint,usage_system bigint,usage_idle bigint,usage_nice bigint,usage_iowait bigint,usage_irq bigint,usage_softirq bigint,usage_steal bigint,usage_guest bigint,usage_guest_nice bigint)
tags (hostname varchar(30), region varchar(30),datacenter varchar(30),rack varchar(30),os varchar(30),arch varchar(30),team varchar(30),service varchar(30),service_version varchar(30),service_environment varchar(30))
然后 ,我们使用如下语句创建名为 host_0 的子表:
create table host_0 using cpu (hostname,region,datacenter,rack,os,arch,team,service,service_version,service_environment)
tags ('host_0','eu-central-1','eu-central-1a','6','Ubuntu15.10','x86','SF','19','1','test')
上述语句创建了一个子表。由此可知,对于 100 个设备(CPU)的场景 一,我们将会建立 100 个子表。对于 4000 个设备的场景二,系统中将会建立 4000 个子表用以存储各自对应的数据 。
软件版本和配置
本报告仅仅比较 TDengine ( Time Series Database )、InfluxDB 与 TimeScaleDB, 下面对使用的版本和配置做出说明。
TDengine
我们直接采用 TDengine Ver3.0,从 GitHub 克隆 TDengine 代码编译版本作为性能对比的版本。
gitinfo: c90e2aa791ceb62542f6ecffe7bd715165f181e8
在服务器上编译安装运行。
cmake .. -DDISABLE_ASSERT=true -DSIMD_SUPPORT=true -DCMAKE_BUILD_TYPE=Release -DBUILD_TOOLS=false
make -j && make install
在 TDengine 的配置文件中设置了四个涉及查询的配置参数。
numOfVnodeFetchThreads 4
queryRspPolicy 1
compressMsgSize 128000
SIMD-builtins 1
参数设置解读:
- numOfVnodeFetchThreads 设置了 Vnode 的 Fetch 线程数量为 4 个,
- queryRspPolicy 用来打开 query response 快速返回机制
- compressMsgSize 的作用是自动压缩 TDengine 在传输层上大于 128,000 bytes 的消息
- 如果 CPU 支持,SIMD-builtins 可以启用内置的 FMA/AVX/AVX2 硬件加速
如上所述,TDengine 建库默认创建 6 个 vnodes,即创建的表会按照表名随机分配到 6 个虚拟节点(virtual node, VNode) 中。打开 LRU 缓存,设置为 last_row 缓存模式。对于场景一和场景二,stt_trigger 设置为 1,此时 TDengine 会准备一个 Sorted Time-series Table (STT) 文件,当单表写入量小于 minimum rows 时,数据会直接保存在 STT 文件中,当 STT 文件中无法容纳新数据时,系统就会将 STT 中的数据整理后再写入到数据文件中。对于其他的场景(场景三、四、五),stt_trigger 设置为 8,即允许最多生成 8 个 STT 文件。针对表较多的场景,需要适度增加 STT 的值,以此来获得更好的写入性能。
TimescaleDB
为确保结果具有可比性,我们选用 TimescaleDB 版本 version 2.6.0。为获得较好的性能,TimescaleDB 需要针对不同的场景设置不同的 Chunk 参数,不同场景下参数的设置如下表所示。
上述参数的设置,充分参考了《TimescaleDB vs. InfluxDB》(如下链接) 中推荐的配置参数设置,以确保能够最大化写入性能指标。
TimescaleDB vs. InfluxDB: Purpose Built Differently for Time-Series Data. https://www.timescale.com/blog/timescaledb-vs-influxdb-for-time-series-data-timescale-influx-sql-nosql-36489299877/
InfluxDB
我们选择了 InfluxDB version 1.8.10。这里没有使用 InfluxDB 最新的 2.x 版本是因为 TSBS 没有对其进行适配,所以选用了 InfluxDB 能够运行 TSBS 框架的最新版本。同样,我们采用《TimescaleDB vs. InfluxDB》中推荐的方式配置 InfluxDB,将缓冲区配置为 80G,以便 1000W 设备写入时能够顺利进行,同时开启 Time Series Index(TSI)。配置系统在系统插入数据完成 30s 后开始数据压缩。
cache-max-memory-size = "80g"
max-values-per-tag = 0
index-version = "tsi1"
compact-full-write-cold-duration = "30s"
测试步骤
硬件准备
为达到与 TimescaleDB vs. InfluxDB 对比报告中的环境高度接近,我们使用亚马逊 AWS 的 EC2 提供的 r4.8xlarge 类型实例作为基础运行平台,包括 1 台服务器、1 台客户端共两个节点构成的环境。客户端与服务器硬件配置完全相同,客户端与服务器使用 10 Gbps 网络连接。配置简表如下:
服务器环境准备
为运行测试脚本,服务器 OS 需要是 ubuntu20 以上的系统。AWS EC2 的服务器系统信息如下:
- OS: Linux tv5931 5.15.0-1028-aws #32~20.04.1-Ubuntu SMP Mon Jan 9 18:02:08 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
- Gcc:gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04)
- 基础环境,版本信息为:Go1.16.9 , python3.8 , pip20.0.2 (无需手动安装,测试脚本将自动安装)
- 编译依赖:gcc , cmake, build-essential, git, libssl-dev (无需手动安装,测试脚本将自动安装)
开始前请做两个配置:
- client 和 server 配置 ssh 访问免密,以便脚本可不暴露密码,可参考文档:免密配置(https://blog.csdn.net/qq_38154295/article/details/121582534)。
- 保证 client 和 server 之间所有端口开放。
获取测试脚本
为便于重复测试,隐藏繁琐的下载、安装、配置、启动、汇总结果等细节,整个 TSBS 的测试过程被封装成一个测试脚本。重复本测试报告,需要先下载该测试脚本,脚本暂支持 ubuntu20 以上的系统。以下操作要求具有 root 权限。
- 在客户端机器,进入测试目录拉取代码,默认进入 /usr/local/src/ 目录:
cd /usr/local/src/ && apt install git && git clone https://github.com/taosdata/tsbs.git && cd tsbs/scripts/tsdbComp
2. 修改配置文件 test.ini 中服务端和客户端的 IP 地址(这里配置 AWS 的私网地址即可)和 hostname,如果服务器未配置免密,还需要配置服务器端的 root 密码:
clientIP="192.168.0.203" #client ip
clientHost="trd03" #client hostname
serverIP="192.168.0.204" #server ip
serverHost="trd04" #server hostname
serverPass="taosdata123" #server root password
一键执行对比测试
执行以下命令:
nohup bash tsdbComparison.sh > test.log &
测试脚本将自动安装 TDengine、InfluxDB、TimeScaleDB 等软件,并自动运行各种对比测试项。在目前的硬件配置下,整个测试跑完需要大约一天半的时间。测试结束后,将自动生成 CSV 格式的对比测试报告,并存放在客户端的 /data2 目录。
写在最后
阅读完毕,你一定更加深入地了解了 TDengine 的数据建模、三大数据库测试版本和配置,以及如何运用测试脚本进行一键复现。如果有小伙伴想要验证 TDengine 的报告结果,欢迎按照上述步骤进行操作,检验测试结果,有任何问题都欢迎大家和我们及时沟通。现在添加小T vx:tdengine1,可以邀请你加入 TDengine 用户交流群,和更多志同道合的开发者一起聊技术、聊实战。