目录
背景
第一部分 部署压测工具vegeta
第二部分 部署TDengine数据库
第三部分 TDengine数据库RESTful接口介绍
第四部分 压力测试
第五部分 压力测试结果
参考文献及资料
背景
最近涛思数据团队开源了自己的时序数据库,关注度较高。按照官方介绍,性能较为强悍,所以使用压测工具对该数据库进行了性能压测。压测使用的工具Vegeta 是一个用 Go 语言编写的多功能的 HTTP 负载测试工具。Vegeta 提供了命令行工具和一个开发库。
第一部分 部署压测工具vegeta
1.1 部署
从github上下载vegeta安装介质:
1 | wget https://github.com/tsenart/vegeta/releases/download/cli%2Fv12.5.1/vegeta-12.5.1-linux-amd64.tar.gz |
该工具开箱即用,解压tar包:
1 | tar -zxvf vegeta-12.5.1-linux-amd64.tar.gz |
1.2 简单测试使用
我们使用vegeta测试一下下面的压力场景(对百度主页发起每秒100次(-rate=100)的请求,持续10秒(-duration=10s)),测试结果重定向到文件(result/results.bin):
1 | echo "GET https://www.baidu.com" |./vegeta attack -duration=10s -rate=100 >result/results.bin |
查看一下测试结果:
1 | root@deeplearning:/data/vegeta# ./vegeta report result/results.bin |
另外可以生成html文件报告(可视化):
1 | root@deeplearning:/data/vegeta# ./vegeta plot result/results.bin > result/plot.html |
第二部分 部署TDengine数据库
2.1 制作docker镜像
由于墙的原因我们在VPS上打包镜像,然后本机拉取部署。
为了保证测试环境的隔离性,我们制作docker镜像,使用docker环境进行测试。首先拉取ubuntu的基础镜像:
1 | docker run -t -i ubuntu:16.04 /bin/bash |
通过TDengine源码安装。在这过程有大量操作系统工具未安装,需要使用atp-get安装部署。
2.1.1 第一步 clone项目
1 | git clone https://github.com/taosdata/TDengine.git |
2.1.2 第二步 编译
1 | mkdir build && cd build |
2.1.3 第三步 安装
1 | make install |
2.2 生成镜像
打包成镜像,推送到Docker Hub:
1 | root@vultr:~# docker commit a35c43242a8e rongxiang1986/tdengine |
2.3 拉取镜像部署
拉取镜像:
1 | root@deeplearning:/data/TDengine/TDengine# docker pull rongxiang1986/tdengine:1.0 |
启动一个docker容器:
1 | root@deeplearning:/data/TDengine/TDengine# docker run -t -i --name tdengine -d -p 6020:6020 rongxiang1986/tdengine:1.0 /bin/bash |
查看正在运行的容器:
1 | root@deeplearning:/data/TDengine/TDengine# docker ps |
进入容器:
1 | root@deeplearning:/data/TDengine/TDengine# docker attach bec2e166c29f |
最后启动数据库服务,下面是启动回显信息:
1 | root@bec2e166c29f:~/TDengine/TDengine/build# ./build/bin/taosd -c test/cfg & |
上面回显service init success说明服务service启动成功。
2.4 镜像使用说明
TDengine项目地址:https://github.com/taosdata/TDengine。使用ubuntu16.04作为基础镜像,部署安装TDengine。拉取镜像后,启动容器后:
启动服务:To start the TDengine server, run the command below in terminal:
1
/root/TDengine/TDengine/build# ./build/bin/taosd -c test/cfg
启动客户端:In another terminal, use the TDengine shell to connect the server:
1
/root/TDengine/TDengine/build#./build/bin/taos -c test/cfg
第三部分 TDengine数据库RESTful接口介绍
按照官方给的例子我们新建案例数据库和表,并且新增数据记录。首先进入shell交互:
1 | root@a35c43242a8e:~/TDengine/TDengine/build# ./build/bin/taos -c test/cfg |
创建案例数据:
1 | create database db; |
退出shell交互后,我们使用Restfull接口与数据库交互。
注意:目前RESTfull接口认证方式使用Http Basic Authorization请求格式,token使用base64(username:password),即base64(root:taosdata)=cm9vdDp0YW9zZGF0YQ==
可以在在线网站上:https://www.base64encode.org/ encode一下。
1 | root@a35c43242a8e:~/TDengine/TDengine/build# curl -H 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' -d 'select * from db.t' localhost:6020/rest/sql |
返回结果是一个JSON格式串,规范化一下:
1 | { |
第四部分 对RESTful接口压力测试
最后我们使用vegeta对restful接口进行压力测试:
4.1 查询压测
使用目标文件的内容进行压力测试。
首先创建target.txt文件以及数据文件data.json,内容如下:
1 | root@bec2e166c29f:~/TDengine/vegeta/TDengineTest# cat target.txt |
1 | root@bec2e166c29f:~/TDengine/vegeta/TDengineTest# cat data.json |
最后使用下面的命令开始压测(每秒15000次请求,持续5分钟):
1 | root@bec2e166c29f:~/TDengine/vegeta/TDengineTest#../vegeta attack -rate 15000 -targets target.txt -duration 5m > out.dat |
4.2 写入压测
首先创建writetarget.txt和数据文件:writedata.json,内容如下:
1 | root@bec2e166c29f:~/TDengine/vegeta/TDengineTest# cat writetarget.txt |
1 | root@bec2e166c29f:~/TDengine/vegeta/TDengineTest# cat writedata.json |
这里写入语句使用时间函数NOW,保证写入时间无重复。
最后使用命令开始压测(每秒30000次请求,持续1分钟):
1 | root@bec2e166c29f:~/TDengine/vegeta/TDengineTest# ../vegeta attack -rate 30000 -targets writetarget.txt -duration 1m > writeout.dat |
第五部分 压力测试结果
由于机器环境的差异,只是做了尝试性测试,不代表产品的实际性能。
官方测试报告参考:https://www.taosdata.com/downloads/TDengine_Testing_Report_cn.pdf
5.1 查询
对于查询性能我们每秒15000的请求结果如下:
1 | root@bec2e166c29f:~/TDengine/vegeta/TDengineTest# ../vegeta report out15000.dat |
当提高到每秒20000次时,数据库出现响应失败,成功率只有38.78%:
1 | root@bec2e166c29f:~/TDengine/vegeta/TDengineTest# ../vegeta report out20000.dat |
5.2 写入
对于写入测试。对于查询性能我们每秒30000的请求结果如下:
1 | root@bec2e166c29f:~/TDengine/vegeta/TDengineTest# ../vegeta report writeout30000.dat |
当提高到每秒50000次时,数据库性能开始恶化,成功率只有55.73%:
1 | root@bec2e166c29f:~/TDengine/vegeta/TDengineTest# ../vegeta report writeout50000.dat |
结论:单机环境下同等场景(都是压测RESTfull接口)下,TDengine可以抗住每秒15000次的读请求和每秒30000次写请求。influxdb只能抗住每秒6000次持续读、写。按照官网介绍如果写入是批量形式会更快。
参考文献和材料
1、推荐一款高性能 HTTP 负载测试工具 Vegeta 链接:https://www.hi-linux.com/posts/4650.html
2、TDengine官网 链接:https://www.taosdata.com/cn/
3、比Hadoop快至少10倍的物联网大数据平台,我把它开源了 链接:https://weibo.com/ttarticle/p/show?id=2309404394278649462890