前言
TDengine Database開(kāi)源項(xiàng)目里已經(jīng)包含了性能對(duì)比測(cè)試的工具源代碼。https://github.com/taosdata/TDengine/tests/comparisonTest,并基于這個(gè)開(kāi)源的測(cè)試工具開(kāi)展了TDengine和InfluxDB對(duì)比測(cè)試,TDengine和OpenTSDB對(duì)比測(cè)試,TDengine和Cassandra對(duì)比測(cè)試等一系列性能對(duì)比測(cè)試。為了更客觀的對(duì)比TDengine和其他時(shí)序數(shù)據(jù)庫(kù)(Time-Series Database)的性能差異,本項(xiàng)目采用由InfluxDB團(tuán)隊(duì)開(kāi)源的性能對(duì)比測(cè)試工具來(lái)進(jìn)行對(duì)比測(cè)試,相同的數(shù)據(jù)產(chǎn)生器,相同的測(cè)試用例,相同的測(cè)試方法,以保證測(cè)試的客觀公平。
簡(jiǎn)介
本項(xiàng)目是基于InfluxDB發(fā)布的一個(gè)性能對(duì)比測(cè)試項(xiàng)目的基礎(chǔ)上開(kāi)發(fā)的。數(shù)據(jù)產(chǎn)生模塊可以模擬Devops場(chǎng)景下多臺(tái)服務(wù)器產(chǎn)生大量監(jiān)控?cái)?shù)據(jù)。數(shù)據(jù)寫(xiě)入程序可以根據(jù)不同的數(shù)據(jù)庫(kù)格式,將產(chǎn)生的模擬數(shù)據(jù)以不同的格式寫(xiě)入到不同數(shù)據(jù)庫(kù)里,以測(cè)試寫(xiě)入性能。查詢(xún)模塊以相同的查詢(xún)類(lèi)型產(chǎn)生相同的查詢(xún)?nèi)蝿?wù),以各數(shù)據(jù)庫(kù)自己的格式進(jìn)行查詢(xún),并統(tǒng)計(jì)查詢(xún)消耗的時(shí)間,來(lái)測(cè)試查詢(xún)性能。
為了讓測(cè)試過(guò)程更簡(jiǎn)單,本測(cè)試采用Docker容器方式來(lái)測(cè)試,所有被測(cè)的數(shù)據(jù)庫(kù)都以容器的方式,從Dockerhub拉取下來(lái),并設(shè)定固定的IP地址運(yùn)行,便于腳本執(zhí)行。容器鏡像都是公開(kāi)發(fā)布的,能保證測(cè)試的公平公正。
本測(cè)試項(xiàng)目目前支持以下時(shí)序數(shù)據(jù)庫(kù)的對(duì)比測(cè)試
- InfluxDB
- TDengine
本項(xiàng)目的Github鏈接:https://github.com/liu0x54/timeseriesdatabase-comparisons
前提條件
為了開(kāi)展測(cè)試,需要準(zhǔn)備以下條件
- 一臺(tái)Linux服務(wù)器,包含10GB的空閑硬盤(pán)空間,用于存儲(chǔ)產(chǎn)生的測(cè)試數(shù)據(jù)。因?yàn)闇y(cè)試模擬數(shù)據(jù)先生成并寫(xiě)入硬盤(pán)文件,由數(shù)據(jù)加載程序從文件中讀取一條條的數(shù)據(jù)寫(xiě)入語(yǔ)句,寫(xiě)入時(shí)序數(shù)據(jù)庫(kù)。這種方式能夠?qū)?shù)據(jù)產(chǎn)生過(guò)程中的性能差異排除。
- root權(quán)限。測(cè)試過(guò)程需要用root權(quán)限來(lái)安裝一個(gè)TDengine的客戶(hù)端驅(qū)動(dòng),用于TDengine數(shù)據(jù)加載程序的調(diào)用。TDengine數(shù)據(jù)寫(xiě)入采用Go語(yǔ)言調(diào)用C語(yǔ)言連接器的方式。
準(zhǔn)備測(cè)試
先從下載地址下載我們已經(jīng)制作好的測(cè)試工具包,解壓到本地。
tar -zxf tsdbcompare.tar.gz
解壓后的目錄結(jié)構(gòu)如下:

bin 目錄里是提前編譯好的可執(zhí)行文件,包括數(shù)據(jù)產(chǎn)生,數(shù)據(jù)加載,查詢(xún)產(chǎn)生和查詢(xún)加載。提前編譯好方便大家下載即可用;如果有興趣的同學(xué)也可以自己從源文件編譯。源文件位于cmd下面的各個(gè)子目錄里??梢宰孕芯幾g后替換bin目錄的文件。
config 目錄里是TDengine寫(xiě)入數(shù)據(jù)需要用到的schema配置文件,模擬數(shù)據(jù)產(chǎn)生的數(shù)據(jù)通過(guò)schema配置里的信息可以知道該往哪個(gè)表里存。
data 目錄是用來(lái)存儲(chǔ)測(cè)試過(guò)程中產(chǎn)生的數(shù)據(jù)文件。本測(cè)試采用先產(chǎn)生模擬數(shù)據(jù),并將模擬數(shù)據(jù)按各數(shù)據(jù)庫(kù)的寫(xiě)入格式寫(xiě)到文件里,再用加載程序從文件里讀取按格式寫(xiě)好的語(yǔ)句往各數(shù)據(jù)庫(kù)里加載的方式來(lái)開(kāi)展測(cè)試。這樣的方法,能夠?qū)⒃紨?shù)據(jù)轉(zhuǎn)換成不同的格式的過(guò)程帶來(lái)的差異進(jìn)行屏蔽,更純粹的對(duì)比數(shù)據(jù)庫(kù)的寫(xiě)入性能。
prepare.sh 是用來(lái)準(zhǔn)備測(cè)試環(huán)境的腳本,包含三部分,1.安裝docker程序,2.安裝TDengine的客戶(hù)端,3.拉取InfluxDB和TDengine的Docker鏡像。
#!/bin/bash
set -x
#install docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
#install tdengine client
tar -zxf TDengine-client-1.6.4.5.tar.gz
cd TDengine-client-1.6.4.5
./install_client.sh
cd ..
#pull influxdb and tdengine docker images
docker pull influxdb
docker pull tdengine/tdengine:v1.6.4.5.c
如果目標(biāo)系統(tǒng)上已經(jīng)安裝了docker程序,就不用執(zhí)行這個(gè)prepare.sh腳本了,可以直接按腳本里的第二、三部分去安裝TDengine Client和拉取對(duì)應(yīng)的Docker鏡像。
在上面的步驟都執(zhí)行完成,并確認(rèn)成功后,可以開(kāi)展測(cè)試工作了。
注意事項(xiàng):
1.如果系統(tǒng)里已經(jīng)安裝了其他版本的TDengine,請(qǐng)先卸載TDengine,否則會(huì)因?yàn)榭蛻?hù)端和服務(wù)端版本不一致導(dǎo)致測(cè)試數(shù)據(jù)加載程序連接TDengine失敗。
2.要確認(rèn)TDengine-client-1.6.4.5.tar.gz安裝成功,因?yàn)楸敬螠y(cè)試的加載和查詢(xún)程序都是用的這個(gè)版本的client端lib庫(kù)進(jìn)行編譯的,如果版本不匹配,會(huì)導(dǎo)致連接TDengine失敗
3.啟動(dòng)前請(qǐng)先將系統(tǒng)里運(yùn)行的InfluxDB、TDengine停止下來(lái),釋放出這倆個(gè)數(shù)據(jù)庫(kù)占用的端口,否則Docker container加載的時(shí)候會(huì)因?yàn)槎丝诒徽加昧藢?dǎo)致加載失敗,從而無(wú)法完成測(cè)試。
開(kāi)展測(cè)試
在整個(gè)測(cè)試過(guò)程中,建議另開(kāi)一個(gè)終端,運(yùn)行top,查看系統(tǒng)的CPU和內(nèi)存占用情況。
寫(xiě)入測(cè)試
本測(cè)試包提供了一個(gè)run.sh腳本,自動(dòng)執(zhí)行將docker容器按指定IP地址運(yùn)行起來(lái),然后產(chǎn)生數(shù)據(jù),寫(xiě)入數(shù)據(jù)文件,并寫(xiě)入時(shí)序數(shù)據(jù)庫(kù)。 數(shù)據(jù)產(chǎn)生和寫(xiě)入由以下兩條命令完成
#產(chǎn)生模擬數(shù)據(jù)并寫(xiě)入數(shù)據(jù)文件
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.dat
bin/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秒一條數(shù)據(jù)的產(chǎn)生頻率,模擬10臺(tái)設(shè)備,以devops場(chǎng)景產(chǎn)生24小時(shí)的數(shù)據(jù),并寫(xiě)入influx.dat文件。 Devops模型下,一臺(tái)服務(wù)器會(huì)產(chǎn)生9類(lèi)數(shù)據(jù),分別是cpu,disk,mem,等,因此總共會(huì)產(chǎn)生7776000條數(shù)據(jù)記錄。 數(shù)據(jù)文件完成后,就開(kāi)始數(shù)據(jù)寫(xiě)入測(cè)試:
#數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)
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
上面命令的含義是以每批次寫(xiě)入5000/300條記錄,分20個(gè)線(xiàn)程,將數(shù)據(jù)文件讀取出來(lái)后寫(xiě)入influxDB/TDengine中
查詢(xún)測(cè)試
在完成寫(xiě)入后,就開(kāi)始查詢(xún)測(cè)試。 查詢(xún)測(cè)試設(shè)定了四個(gè)查詢(xún)用例的語(yǔ)句,每個(gè)查詢(xún)語(yǔ)句都執(zhí)行1000遍,然后統(tǒng)計(jì)總的查詢(xún)用時(shí):
測(cè)試用例1,
查詢(xún)所有數(shù)據(jù)中,用8個(gè)hostname標(biāo)簽進(jìn)行匹配,匹配出這8個(gè)hostname對(duì)應(yīng)的模擬服務(wù)器CPU數(shù)據(jù)中的usage_user這個(gè)監(jiān)控?cái)?shù)據(jù)的最大值。
#TDengine
bin/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
#InfluxDB
bin/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
測(cè)試用例2,
查詢(xún)所有數(shù)據(jù)中,用8個(gè)hostname標(biāo)簽進(jìn)行匹配,匹配出這8個(gè)hostname對(duì)應(yīng)的模擬服務(wù)器CPU數(shù)據(jù)中的usage_user這個(gè)監(jiān)控?cái)?shù)據(jù),以1小時(shí)為粒度,查詢(xún)每1小時(shí)的最大值。
#TDengine
bin/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
#InfluxDB
bin/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
測(cè)試用例3,
隨機(jī)查詢(xún)12個(gè)小時(shí)的數(shù)據(jù),用8個(gè)hostname標(biāo)簽進(jìn)行匹配,匹配出這8個(gè)hostname對(duì)應(yīng)的模擬服務(wù)器CPU數(shù)據(jù)中的usage_user這個(gè)監(jiān)控?cái)?shù)據(jù),以10分鐘為粒度,查詢(xún)每10分鐘的最大值。
#TDengine
bin/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
#InfluxDB
bin/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
測(cè)試用例4,
隨機(jī)查詢(xún)1個(gè)小時(shí)的數(shù)據(jù),用8個(gè)hostname標(biāo)簽進(jìn)行匹配,匹配出這8個(gè)hostname對(duì)應(yīng)的模擬服務(wù)器CPU數(shù)據(jù)中的usage_user這個(gè)監(jiān)控?cái)?shù)據(jù),以1分鐘為粒度,查詢(xún)每1分鐘的最大值。
#TDengine
bin/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
#InfluxDB
bin/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
查詢(xún)過(guò)程結(jié)束后,將測(cè)試結(jié)果以以下格式打印出來(lái)

結(jié)果分析
通過(guò)本測(cè)試包產(chǎn)生的數(shù)據(jù)和相關(guān)的寫(xiě)入、查詢(xún)用例測(cè)試可以看出,TDengine在性能上相比InfluxDB有較大的優(yōu)勢(shì)。

細(xì)致分析下來(lái)可以有以下結(jié)論:
- 寫(xiě)入性能:相同數(shù)據(jù)源InfluxDB寫(xiě)入用時(shí)約是TDengine的4倍
- 全部數(shù)據(jù)聚合計(jì)算查詢(xún):InfluxDB查詢(xún)用時(shí)約為T(mén)Dengine的80倍
- 全部數(shù)據(jù)聚合計(jì)算查詢(xún)以小時(shí)為顆粒聚合結(jié)果:InfluxDB查詢(xún)用時(shí)約為T(mén)Dengine的10倍
- 隨機(jī)選取12小時(shí)的數(shù)據(jù)聚合計(jì)算查詢(xún)以10分鐘為顆粒聚合結(jié)果:InfluxDB用時(shí)約為T(mén)Dengine的6倍
- 隨機(jī)選取1小時(shí)的數(shù)據(jù)聚合計(jì)算查詢(xún)以1分鐘為顆粒聚合結(jié)果:InfluxDB用時(shí)約為T(mén)Dengine的2.5倍
通過(guò)top命令的觀察,我們可以看到,測(cè)試用例執(zhí)行時(shí),InfluxDB的CPU占用率基本達(dá)到滿(mǎn)負(fù)荷,以4核CPU的服務(wù)器為例,經(jīng)常達(dá)到390%以上;而TDengine的CPU占用率則低很多。



互聯(lián)網(wǎng).png)



-1.png)




.png)


證.png)


伙伴.png)
伙伴.png)
伙伴.png)



