前言
里已經包含了性能對比測試的工具源代碼。,并基于這個開源的測試工具開展了TDengine和InfluxDB對比測試,TDengine和OpenTSDB對比測試,TDengine和Cassandra對比測試等一系列性能對比測試。為了更客觀的對比TDengine和其他時序數據庫(Time-Series Database)的性能差異,本項目采用由InfluxDB團隊開源的性能對比測試工具來進行對比測試,相同的數據產生器,相同的測試用例,相同的測試方法,以保證測試的客觀公平。
簡介
本項目是基于InfluxDB發布的一個的基礎上開發的。數據產生模塊可以模擬Devops場景下多臺服務器產生大量監控數據。數據寫入程序可以根據不同的數據庫格式,將產生的模擬數據以不同的格式寫入到不同數據庫里,以測試寫入性能。查詢模塊以相同的查詢類型產生相同的查詢任務,以各數據庫自己的格式進行查詢,并統計查詢消耗的時間,來測試查詢性能。
為了讓測試過程更簡單,本測試采用Docker容器方式來測試,所有被測的數據庫都以容器的方式,從Dockerhub拉取下來,并設定固定的IP地址運行,便于腳本執行。容器鏡像都是公開發布的,能保證測試的公平公正。
本測試項目目前支持以下時序數據庫的對比測試
- InfluxDB
- TDengine
本項目的Github鏈接:
前提條件
為了開展測試,需要準備以下條件
- 一臺Linux服務器,包含10GB的空閑硬盤空間,用于存儲產生的測試數據。因為測試模擬數據先生成并寫入硬盤文件,由數據加載程序從文件中讀取一條條的數據寫入語句,寫入時序數據庫。這種方式能夠將數據產生過程中的性能差異排除。
- root權限。測試過程需要用root權限來安裝一個TDengine的客戶端驅動,用于TDengine數據加載程序的調用。TDengine數據寫入采用Go語言調用C語言連接器的方式。
準備測試
先從下載地址下載我們已經制作好的測試工具包,解壓到本地。
tar -zxf tsdbcompare.tar.gz
解壓后的目錄結構如下:

bin 目錄里是提前編譯好的可執行文件,包括數據產生,數據加載,查詢產生和查詢加載。提前編譯好方便大家下載即可用;如果有興趣的同學也可以自己從源文件編譯。源文件位于cmd下面的各個子目錄里。可以自行編譯后替換bin目錄的文件。
config 目錄里是TDengine寫入數據需要用到的schema配置文件,模擬數據產生的數據通過schema配置里的信息可以知道該往哪個表里存。
data 目錄是用來存儲測試過程中產生的數據文件。本測試采用先產生模擬數據,并將模擬數據按各數據庫的寫入格式寫到文件里,再用加載程序從文件里讀取按格式寫好的語句往各數據庫里加載的方式來開展測試。這樣的方法,能夠將原始數據轉換成不同的格式的過程帶來的差異進行屏蔽,更純粹的對比數據庫的寫入性能。
prepare.sh 是用來準備測試環境的腳本,包含三部分,1.安裝docker程序,2.安裝TDengine的客戶端,3.拉取InfluxDB和TDengine的Docker鏡像。
#!/bin/bash
set -x
#install docker
curl -fsSL //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
如果目標系統上已經安裝了docker程序,就不用執行這個prepare.sh腳本了,可以直接按腳本里的第二、三部分去安裝TDengine Client和拉取對應的Docker鏡像。
在上面的步驟都執行完成,并確認成功后,可以開展測試工作了。
注意事項:
1.如果系統里已經安裝了其他版本的TDengine,請先卸載TDengine,否則會因為客戶端和服務端版本不一致導致測試數據加載程序連接TDengine失敗。
2.要確認TDengine-client-1.6.4.5.tar.gz安裝成功,因為本次測試的加載和查詢程序都是用的這個版本的client端lib庫進行編譯的,如果版本不匹配,會導致連接TDengine失敗
3.啟動前請先將系統里運行的InfluxDB、TDengine停止下來,釋放出這倆個數據庫占用的端口,否則Docker container加載的時候會因為端口被占用了導致加載失敗,從而無法完成測試。
開展測試
在整個測試過程中,建議另開一個終端,運行top,查看系統的CPU和內存占用情況。
寫入測試
本測試包提供了一個run.sh腳本,自動執行將docker容器按指定IP地址運行起來,然后產生數據,寫入數據文件,并寫入時序數據庫。 數據產生和寫入由以下兩條命令完成
#產生模擬數據并寫入數據文件
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秒一條數據的產生頻率,模擬10臺設備,以devops場景產生24小時的數據,并寫入influx.dat文件。 Devops模型下,一臺服務器會產生9類數據,分別是cpu,disk,mem,等,因此總共會產生7776000條數據記錄。 數據文件完成后,就開始數據寫入測試:
#數據寫入數據庫
cat data/influx.dat |bin/bulk_load_influx --batch-size=5000 --workers=20 --urls="//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
上面命令的含義是以每批次寫入5000/300條記錄,分20個線程,將數據文件讀取出來后寫入influxDB/TDengine中
查詢測試
在完成寫入后,就開始查詢測試。 查詢測試設定了四個查詢用例的語句,每個查詢語句都執行1000遍,然后統計總的查詢用時:
測試用例1,
查詢所有數據中,用8個hostname標簽進行匹配,匹配出這8個hostname對應的模擬服務器CPU數據中的usage_user這個監控數據的最大值。
#TDengine
bin/bulk_query_gen -seed 123 -format tdengine -query-type 8-host-all -scale-var 10 -queries 1000 | bin/query_benchmarker_tdengine -urls="//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="//172.15.1.5:8086" -workers 50 -print-interval 0
測試用例2,
查詢所有數據中,用8個hostname標簽進行匹配,匹配出這8個hostname對應的模擬服務器CPU數據中的usage_user這個監控數據,以1小時為粒度,查詢每1小時的最大值。
#TDengine
bin/bulk_query_gen -seed 123 -format tdengine -query-type 8-host-allbyhr -scale-var 10 -queries 1000 | bin/query_benchmarker_tdengine -urls="//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="//172.15.1.5:8086" -workers 50 -print-interval 0
測試用例3,
隨機查詢12個小時的數據,用8個hostname標簽進行匹配,匹配出這8個hostname對應的模擬服務器CPU數據中的usage_user這個監控數據,以10分鐘為粒度,查詢每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="//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="//172.15.1.5:8086" -workers 50 -print-interval 0
測試用例4,
隨機查詢1個小時的數據,用8個hostname標簽進行匹配,匹配出這8個hostname對應的模擬服務器CPU數據中的usage_user這個監控數據,以1分鐘為粒度,查詢每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="//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="//172.15.1.5:8086" -workers 50 -print-interval 0
查詢過程結束后,將測試結果以以下格式打印出來

結果分析
通過本測試包產生的數據和相關的寫入、查詢用例測試可以看出,TDengine在性能上相比InfluxDB有較大的優勢。

細致分析下來可以有以下結論:
- 寫入性能:相同數據源InfluxDB寫入用時約是TDengine的4倍
- 全部數據聚合計算查詢:InfluxDB查詢用時約為TDengine的80倍
- 全部數據聚合計算查詢以小時為顆粒聚合結果:InfluxDB查詢用時約為TDengine的10倍
- 隨機選取12小時的數據聚合計算查詢以10分鐘為顆粒聚合結果:InfluxDB用時約為TDengine的6倍
- 隨機選取1小時的數據聚合計算查詢以1分鐘為顆粒聚合結果:InfluxDB用時約為TDengine的2.5倍
通過top命令的觀察,我們可以看到,測試用例執行時,InfluxDB的CPU占用率基本達到滿負荷,以4核CPU的服務器為例,經常達到390%以上;而TDengine的CPU占用率則低很多。



























