TDengine與InfluxDB對比測試

摘要:爲幫助用戶瞭解TDengine的指標,特將TDengine與InfluxD從數據庫的讀、寫、查詢、壓縮比等方面進行了對比測試。從測試結果上看,TDengine的性能遠超InfluxDB,寫入性能約爲5倍,讀取性能約爲35倍,聚合函數性能約爲140倍,按標籤分組查詢性能約爲250倍,按時間分組查詢性能約爲12倍。

測試環境

對比測試的測試程序和數據庫服務在同一臺4核8GB的Dell臺式機上部署,臺式機型號爲OptiPlex-3050,詳細配置如下

OS: Ubuntu 16.04 x64
CPU: Intel(R) Core(TM) i3-7100 CPU @ 3.90GHz
Memory: 8GB
Disk: 1TB HDD

測試數據集及其生成方法

1.測試數據生成方法

本次測試調研了兩類比較熱門的測試數據集

  • 紐約出租車運行數據,因該數據中抹去了單臺車輛的信息,無法對其進行建模
  • faker生成工具,因其只能生成字符串,並不適合物聯網場景下處理的數據

所以,爲使測試可輕易重複,單獨編寫了一個生成模擬數據的程序來進行本次測試。

測試數據生成程序模擬若干溫溼度計生成的數據,其中溫度爲整數、溼度爲浮點數,同時每個溫度計包含設備ID、設備分組、設備名稱三個標籤。爲了儘可能真實地模擬溫溼度計的生成數據,沒有使用完全隨機數,而是針對每個溫度計確保生成的數據值呈正態分佈。

測試數據的頻率爲1秒鐘,數據集包含10000臺設備,每臺設備10000條記錄。每條數據採集記錄包含1個時間戳字段、2個數據字段和3個標籤字段。

2.測試數據生成程序源碼

採用java程序生成測試數據集,測試程序源代碼可以到https://github.com/taosdata/T... 下載,下載後執行如下語句

cd tests/comparisonTest/dataGenerator
javac com/taosdata/generator/DataGenerator.java 

3.測試數據生成程序用法

相關參數如下

  • dataDir 生成的數據文件路徑
  • numOfFiles 生成的數據文件數目
  • numOfDevices 測試數據集中的設備數目
  • rowsPerDevice 測試數據集中每臺設備包含的記錄條數

4.生成測試數據

執行如下命令,會在~/testdata目錄下生成100個數據文件,每個文件包含100臺設備的測試數據;合計10000臺設備,每臺設備10000條記錄

mkdir ~/testdata
java com/taosdata/generator/DataGenerator -dataDir ~/testdata -numOfDevices 10000 -numOfFiles

TDengine環境準備

TDengine是一個開源的專爲物聯網、車聯網、工業互聯網、IT運維等設計和優化的大數據平臺。除核心的快10倍以上的時序數據庫功能外,還提供緩存、數據訂閱等功能,最大程度減少研發和運維的工作量。

1.安裝部署

  • 下載tdengine-1.6.1.0.tar.gz,地址https://www.taosdata.com/
  • 安裝TDengine,解壓後運行install.sh進行安裝
  • 啓動TDengine,運行sudo systemctl start taosd
  • 測試是否安裝成功,運行TDengine的shell命令行程序taos,可以看到如下類似信息
Welcome to the TDengine shell, server version:1.6.1.0  client version:1.6.1.0
Copyright (c) 2017 by TAOS Data, Inc. All rights reserved.
taos> 

2.數據建模

TDengine爲相同結構的設備創建一張超級表,而每個具體的設備則單獨創建一張數據表。因此,超級表的數據字段爲採集時間、溫度、溼度等與時間序列相關的採集數據;標籤字段爲設備編號、設備分組編號、設備名稱等設備本身固定的描述信息。

創建超級表的SQL語句爲

create table devices(ts timestamp, temperature int, humidity float) tags(devid int, devname binary(16), devgroup int);

以設備ID作爲表名(例如device id爲1,則表名爲dev1),使用自動建表語句,寫入一條記錄的語句爲

insert into dev1 using devices tags(1,'d1',0) values(1545038786000,1,3.560000);

3.測試程序源碼

本文采用TDengine的原生C語言接口,編寫數據寫入及查詢程序,後續的其他文章會提供基於JDBCDriver的測試程序。

測試程序源代碼及查詢SQL語句可以到https://github.com/taosdata/T... 下載,下載後執行如下語句

cd tdengine
make

會在當前目錄下生成可執行文件./tdengineTest

4.測試程序用法

TDengine的測試程序用法與InfluxDB的用法相同,寫入相關參數

  • writeClients 併發寫入的客戶端鏈接數目,默認爲1
  • rowsPerRequest 一次請求中的記錄條數,默認爲100,範圍1-1000
  • dataDir 讀取的數據文件路徑,來自於測試數據生成程序
  • numOfFiles 從數據文件路徑中讀取的文件個數

例如

./tdengineTest -dataDir ./data -numOfFiles 10 -writeClients 2 -rowsPerRequest 100

查詢相關參數

sql 將要執行的SQL語句列表所在的文件路徑,以逗號區分每個SQL語句
例如

./tdengineTest -sql ./sqlCmd.txt

寫入性能對比

數據庫的一個寫入請求可以包含一條或多條記錄,一次請求裏包含的記錄條數越多,寫入性能就會相應提升。在以下測試中,使用R/R表示Records/Request ,即一次請求中的記錄條數。同時,一個數據庫可以支持多個客戶端連接,連接數增加,系統總的寫入通吐量也會相應增加。因此測試中,對於每一個數據庫,都會測試一個客戶端和多個客戶端連接的情況。

1.TDengine的寫入性能

TDengine按照每次請求包含1,100,500,1000,2000條記錄各進行測試,同時也測試了不同客戶端連接數的情況。測試步驟如下所示,您可以修改示例中的參數,完成多次不同的測試。

1.清空上次測試數據
運行TDengine的shell命令行程序taos,執行刪除測試數據庫語句
Welcome to the TDengine shell, server version:1.6.1.0  client version:1.6.1.0
Copyright (c) 2017 by TAOS Data, Inc. All rights reserved.
taos>drop database db;
2.測試執行
開啓5個客戶端讀取~/testdata目錄中的100個數據文件,每個請求寫入1000條數據,可以參考如下命令
./tdengineTest -dataDir ~/testdata -numOfFiles 100 -writeClients 5 -rowsPerRequest 1000

寫入吞吐量如下,單位爲記錄數/秒

R/R 1 client 2 clients 3 clients 4 clients 5 clients 6 clients 7 clients
1 26824 43699 55137 62869 64529 68647 72277
100 415800 734484 895522 976085 1087902 1171074 1192199
500 479846 882612 1083032 1195100 1269196 1364256 1417004
1000 500751 914494 1121914 1239157 1367989 1418104 1476560
2000 512820 1055520 1174164 1306904 1426635 1458434 1477208

圖片描述

圖1 TDengine的寫入吞吐量

2.InfluxDB的寫入性能

InfluxDB按照每次請求包含1,100,1000,10000,20000,50000,100000條記錄各進行測試,同時也測試了不同客戶端連接數的情況。測試步驟如下所示,您可以修改示例中的參數,完成多次不同的測試。

1.清空上次測試數據
運行InfluxDB的shell命令行程序influx,可以看到如下類似信息
Connected to http://localhost:8086 version 1.7.7
InfluxDB shell version: 1.7.7
> drop database db;
2.測試執行
開啓5個客戶端讀取~/testdata目錄中的100個數據文件,每個請求寫入10000條數據,可以參考如下命令
./influxdbTest -dataDir ~/testdata -numOfFiles 100 -writeClients 5 -rowsPerRequest 10000

寫入吞吐量如下,單位爲記錄數/秒

R/R 1 client 2 clients 3 clients 4 clients 5 clients 6 clients 7 clients
1 31 43 55 67 80 92 106
100 3024 4325 5709 6819 8013 9204 10173
1000 21940 30659 40825 50622 60567 70311 77174
10000 88686 155154 209377 234124 245141 257454 261542
20000 96277 179492 234413 255805 263160 268466 271249
50000 125187 200552 243861 264780 271101 270364 273820
100000 130108 197202 240059 254973 265922 272275 270859

圖2 InfluxDB的寫入吞吐量
圖2 InfluxDB的寫入吞吐量

3.TDengin和InfluxDB的最佳性能對比
基於以上的測試數據,將TDengine和InfluxDB測試出的最佳寫入速度進行對比,結果如下

R/R 1 client 2 clients 3 clients 4 clients 5 clients 6 clients 7 clients
TDengine 512820 1055520 1174164 1306904 1426635 1458434 1477208
InfluxDB 130108 200552 243861 264780 271101 272275 273820

圖3 TDengine和InfluxDB的最佳寫入性能對比
圖3 TDengine和InfluxDB的最佳寫入性能對比

從圖3可以看出,TDengine的寫入速度約爲百萬條記錄/秒的量級,而InfluxDB的寫入速度約爲十萬條記錄/秒的量級。因此可以得出結論,在同等數據集和硬件環境下,TDengine的寫入速度遠高於InfluxDB,約爲5倍。

需要指出的是,InfluxDB的單條插入性能很低,因此必須採用Kafka或其他消息隊列軟件,成批寫入,這樣增加了系統開發和維護的複雜度與運營成本。

讀取性能對比

本測試做了簡單的遍歷查詢,就是將寫入的數據全部讀出。因爲InfluxDB的GO客戶端在解析JSON返回結果時的限制,故每次查詢僅取出100萬條記錄。在測試數據準備時,已經按照devgroup標籤將設備拆分成100個分組,本次測試隨機選取其中10個分組進行查詢。

1.TDengine的測試方法

測試SQL語句存儲在tdengine/q1.txt中,測試SQL語句參考
select * from db.devices where devgroup=0;
執行方法如下
./tdengineTest -sql ./q1.txt

2.InfluxDB的測試方法

測試SQL語句存儲在influxdb/q1.txt中,測試SQL語句參考
select * from devices where devgroup='0';
執行方法如下
./influxDBTest -sql ./q1.txt

如下所示,橫軸爲設備分組編號,測試結果的單位爲秒

- 分組0 分組10 分組20 分組30 分組40 分組50 分組60 分組70 分組80 分組90
TDengine 0.235 0.212 0.208 0.218 0.209 0.210 0.209 0.209 0.216 0.208
InfluxDB 7.56 7.21 7.64 7.28 7.64 7.52 7.52 7.52 7.32 7.42

圖4 TDengine和InfluxDB的讀取性能對比
圖4 TDengine和InfluxDB的讀取性能對比

從圖4中可以看出,TDengine的100萬條的讀取速度穩定在0.21秒,吞吐量約爲500萬條記錄/秒,InfluxDB的100萬條的讀取速度穩定在7.5秒,吞吐量約爲13萬條記錄/秒。所以從測試結果來看,TDengine的查詢吞吐量遠高於InfluxDB。

聚合函數性能對比

本單元的測試包含COUNT,AVERAGE,SUM,MAX,MIN,SPREAD這六個TDEngine和InfluxDB共有的聚合函數。所有測試函數都會搭配篩選條件(WHERE)來選取設備的十分之一、十分之二、十分之三、直到全部設備。

1.TDengine的聚合函數性能

測試SQL語句存儲在tdengine/q2.txt中,測試SQL語句參考

select count(*) from db.devices where devgroup<10;

執行方法如下

./tdengineTest -sql ./q2.txt

如下所示,橫軸爲查詢設備佔總設備的百分比,測試結果的單位爲秒

- 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
count 0.018 0.026 0.016 0.018 0.017 0.024 0.024 0.027 0.030 0.033
avg 0.007 0.014 0.015 0.020 0.024 0.038 0.044 0.050 0.057 0.060
sum 0.006 0.010 0.019 0.018 0.031 0.036 0.034 0.037 0.043 0.046
max 0.007 0.013 0.015 0.020 0.025 0.030 0.035 0.039 0.045 0.049
min 0.006 0.010 0.016 0.024 0.032 0.039 0.045 0.041 0.043 0.049
spread 0.007 0.010 0.015 0.019 0.033 0.038 0.046 0.052 0.059 0.066

圖5 TDengine聚合函數性能
圖5 TDengine聚合函數性能

2.InfluxDB的聚合函數性能

測試SQL語句存儲在influxdb/q2.txt中。因爲InfluxDB的標籤僅能爲字符串,所以測試SQL語句的篩選條件爲正則表達式,如下的SQL語句選取第10-19個group中的數據,例如

select count(*) from devices where devgroup=~/[1-1][0-9]/;

執行方法如下

./influxdbTest -sql ./q2.txt

如下所示,橫軸爲查詢設備佔總設備的百分比,測試結果的單位爲秒

- 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
count 1.06 2.14 3.28 4.15 5.26 6.19 7.01 8.09 9.06 9.92
mean 0.99 2.05 2.77 3.68 4.51 5.35 6.14 6.95 7.70 8.44
sum 1.02 2.04 2.89 3.75 4.64 5.50 6.38 7.18 7.94 8.72
max 1.01 1.99 2.85 3.77 4.69 5.52 6.35 7.17 7.95 8.80
min 1.03 2.02 2.95 3.81 4.64 5.48 6.33 7.18 8.01 8.72
spread 7.38 16.92 27.44 38.25 49.86 60.68 71.61 82.50 94.68 105.26

圖6 InfluxDB聚合函數性能
圖6 InfluxDB聚合函數性能

3.聚合函數性能對比

- count average sum max min spread
TDengine 0.033 0.06 0.046 0.049 0.049 0.066
InfluxDB 9.92 8.44 8.72 8.8 8.72 105.26

圖7 聚合函數性能對比
圖7 聚合函數性能對比

從圖7可以看出,TDengine的聚合函數查詢時間在100毫秒以內,而InfluxDb的查詢時間在10秒左右。因此可以得出結論,在同等數據集和硬件環境下,TDengine聚合函數的查詢速度遠遠高於InfluxDB,超過100倍。

按標籤分組查詢性能對比

本測試做了按標籤分組函數的性能測試,測試函數會搭配篩選條件(WHERE)來選取設備的十分之一、十分之二、十分之三、直到全部設備。

1.TDengine的測試方法

測試SQL語句存儲在tdengine/q3.txt中,例如

select count(temperature), sum(temperature), avg(temperature) from db.devices where devgroup<10 group by devgroup;

執行方法如下

./tdengineTest -sql ./q3.txt

2.InfluxDB的測試方法

測試SQL語句存儲在influxdb/q3.txt中,例如

select count(temperature), sum(temperature), mean(temperature) from devices where devgroup=~/[1-1][0-9]/ group by devgroup;

執行方法如下

./influxdbTest -sql ./q3.txt

如下所示,橫軸爲查詢設備佔總設備的百分比,測試結果的單位爲秒

- 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
TDengine 0.030 0.028 0.031 0.041 0.069 0.066 0.077 0.091 0.102 0.123
InfluxDB 3.19 6.37 9.60 12.95 15.93 19.16 22.05 25.20 28.06 31.52

圖8 TDengine和InfluxDB的按標籤分組查詢性能對比
圖8 TDengine和InfluxDB的按標籤分組查詢性能對比

從測試結果來看,TDengine的分組聚合查詢速度遠高於InfluxDB,約爲300倍。

按時間分組查詢性能對比

本測試做了按時間分組函數的性能測試,測試函數會搭配篩選條件(WHERE)來選取設備的十分之一、十分之二、十分之三、直到全部設備。

1.TDengine的測試方法

測試SQL語句存儲在tdengine/q4.txt中,例如

select count(temperature), sum(temperature), avg(temperature) from db.devices where devgroup<10 interval(1m);

執行方法如下

./tdengineTest -sql ./q4.txt

2.InfluxDB的測試方法

測試SQL語句存儲在influxdb/q4.txt中,例如

select count(temperature), sum(temperature), mean(temperature) from devices where devgroup=~/[1-1][0-9]/ group by time(1m);

執行方法如下

./influxdbTest -sql ./q4.txt

如下所示,橫軸爲查詢設備佔總設備的百分比,測試結果的單位爲秒

- 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
TDengine 0.237 0.472 0.653 0.902 1.134 1.422 1.753 1.784 2.085 2.549
InfluxDB 3.26 6.50 9.59 12.85 16.07 19.02 22.32 25.44 28.29 31.44

圖9 TDengine和InfluxDB的按時間分組查詢性能對比
圖9 TDengine和InfluxDB的按時間分組查詢性能對比

壓縮比對比

1.原始數據的磁盤佔用
本次測試共生成100個測試數據文件,存儲在~/testdata目錄下,使用du命令查看~/testdata目錄的文件大小

cd ~/testdata
du -m .

如下圖所示
圖10 原始數據的磁盤佔用情況
圖10 原始數據的磁盤佔用情況

2.查看TDengine的磁盤佔用

TDengine的磁盤文件默認位置在目錄/var/lib/taos/data下,在查看磁盤文件大小時,首先將TDengine的服務停止

sudo systemctl stop taosd

然後,調用du命令,查看/var/lib/taos/data目錄下文件的大小

cd /var/lib/taos/data
du -h .

圖11 TDengine的磁盤佔用情況
圖11 TDengine的磁盤佔用情況

3.查看InfluxDB的磁盤佔用

InfluxDB的磁盤文件默認位置在目錄/var/lib/influxdb/data/db下,在查看磁盤文件大小時,首先將InfluxDB的服務停止

sudo systemctl stop influxDb

目錄/var/lib/taos/data爲用戶influxdb所有,請確保當前用戶有查看該目錄的權限。本測試中,數據存儲在autogen/84目錄下,調用du命令,查看該目錄下文件的大小。

cd /var/lib/influxdb/data/db/autogen/84
du -h .

圖12 InfluxDB的磁盤佔用情況
圖12 InfluxDB的磁盤佔用情況

4.磁盤佔用情況對比

生成的測試數據文件佔用的磁盤大小爲3941MB,InfluxDB磁盤佔用855MB,TDengine磁盤佔用459MB。在相對比較隨機數據集的情況下,TDengine的壓縮比約爲InfluxDB壓縮比的1.86倍。

在物聯網場景下,大多數採集數據的變化範圍都比較小。由於TDengine採用列式存儲,因此可以預期,TDengine在真實場景的壓縮比表現會更好。

功能對比

TDengine與InfluxDB都能用於時序數據的處理,兩者在數據庫層面上功能接近。但TDengine還具備消息隊列、緩存、消息訂閱等大數據平臺所需要的功能。使用InfluxDB,還需要集成Kafka, Redis或其他類似軟件。具體對比如下:

功能支持 TDengine InfluxDB
SQL語法支持 支持 支持
Schema 需要定義 無需定義
私有化部署支持 支持 支持
水平擴展能力 支持 支持
系統連接管理 支持 支持
查詢任務管理 支持 支持
數據導入工具 支持 支持
數據導出工具 支持 支持
Web管理工具 支持 支持
多介質分級存儲 支持 支持
Telegraf數據採集 支持 支持
Grafana數據可視化 支持 支持
RESTFul 支持 支持
C/C++ 支持 不支持
JDBC/ODBC 支持 不支持
GO 支持 支持
Python 支持 支持
數據庫參數配置 支持 支持
配置副本數 支持 支持
數據時效 支持 支持
數據分區 支持 支持
連續查詢 支持 支持
數據訂閱 支持 不支持
緩存 支持 不支持
微秒級精度 支持 支持
聚合函數支持 支持 支持
數據降採樣 支持 支持
數據分頁 支持 支持
數據插值 支持 支持
歷史數據修改 不支持 支持
歷史數據的標籤修改 支持 不支持
時間線刪除 支持 支持
數據清空 支持 支持
Matlab 接口 支持 無官方支持
R 接口 支持
安裝包大小 1.5M 48M

總結

此次測試,從數據庫的讀、寫、查詢、壓縮比等方面對TDengine和InfluxDB進行了對比測試。測試用數據集、測試程序源碼、執行的SQL語句都可以從https://github.com/taosdata/T... 下載,測試具備可重複性。

從測試結果上看,TDengine的性能遠超InfluxDB,寫入性能約爲5倍,讀取性能約爲35倍,聚合函數性能約爲140倍,按標籤分組查詢性能約爲250倍,按時間分組查詢性能約爲12倍,壓縮比約爲1.8倍,具體見下表

- TDengine InfluxDB
寫入吞吐量 1477208 記錄數/秒 273820 記錄數/秒
100萬條記錄讀取時間 0.21秒 7.5秒
1億條記錄取平均值時間 0.06秒 8.44秒
1億條記錄按標籤分組取均值時間 0.123秒 31.52秒
1億條記錄按時間分組取均值時間 2.549秒 31.44秒
1億條記錄的磁盤佔用空間 459MB 855MB
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章