摘要:爲幫助用戶瞭解TDengine的指標,特將TDengine與InfluxD從數據庫的讀、寫、查詢、壓縮比等方面進行了對比測試。從測試結果上看,TDengine的性能遠超InfluxDB,寫入性能約爲5倍,讀取性能約爲35倍,聚合函數性能約爲140倍,按標籤分組查詢性能約爲250倍,按時間分組查詢性能約爲12倍。java
對比測試的測試程序和數據庫服務在同一臺4核8GB的Dell臺式機上部署,臺式機型號爲OptiPlex-3050,詳細配置以下git
OS: Ubuntu 16.04 x64 CPU: Intel(R) Core(TM) i3-7100 CPU @ 3.90GHz Memory: 8GB Disk: 1TB HDD
1.測試數據生成方法github
本次測試調研了兩類比較熱門的測試數據集正則表達式
因此,爲使測試可輕易重複,單獨編寫了一個生成模擬數據的程序來進行本次測試。sql
測試數據生成程序模擬若干溫溼度計生成的數據,其中溫度爲整數、溼度爲浮點數,同時每一個溫度計包含設備ID、設備分組、設備名稱三個標籤。爲了儘量真實地模擬溫溼度計的生成數據,沒有使用徹底隨機數,而是針對每一個溫度計確保生成的數據值呈正態分佈。shell
測試數據的頻率爲1秒鐘,數據集包含10000臺設備,每臺設備10000條記錄。每條數據採集記錄包含1個時間戳字段、2個數據字段和3個標籤字段。數據庫
2.測試數據生成程序源碼緩存
採用java程序生成測試數據集,測試程序源代碼能夠到https://github.com/taosdata/T... 下載,下載後執行以下語句併發
cd tests/comparisonTest/dataGenerator javac com/taosdata/generator/DataGenerator.java
3.測試數據生成程序用法運維
相關參數以下
4.生成測試數據
執行以下命令,會在~/testdata目錄下生成100個數據文件,每一個文件包含100臺設備的測試數據;合計10000臺設備,每臺設備10000條記錄
mkdir ~/testdata java com/taosdata/generator/DataGenerator -dataDir ~/testdata -numOfDevices 10000 -numOfFiles
TDengine是一個開源的專爲物聯網、車聯網、工業互聯網、IT運維等設計和優化的大數據平臺。除核心的快10倍以上的時序數據庫功能外,還提供緩存、數據訂閱等功能,最大程度減小研發和運維的工做量。
1.安裝部署
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的用法相同,寫入相關參數
例如
./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的寫入吞吐量
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的寫入速度約爲十萬條記錄/秒的量級。所以能夠得出結論,在同等數據集和硬件環境下,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的100萬條的讀取速度穩定在0.21秒,吞吐量約爲500萬條記錄/秒,InfluxDB的100萬條的讀取速度穩定在7.5秒,吞吐量約爲13萬條記錄/秒。因此從測試結果來看,TDengine的查詢吞吐量遠高於InfluxDB。
本單元的測試包含COUNT,AVERAGE,SUM,MAX,MIN,SPREAD這六個TDEngine和InfluxDB共有的聚合函數。全部測試函數都會搭配篩選條件(WHERE)來選取設備的十分之1、十分之2、十分之3、直到所有設備。
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聚合函數性能
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聚合函數性能
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能夠看出,TDengine的聚合函數查詢時間在100毫秒之內,而InfluxDb的查詢時間在10秒左右。所以能夠得出結論,在同等數據集和硬件環境下,TDengine聚合函數的查詢速度遠遠高於InfluxDB,超過100倍。
本測試作了按標籤分組函數的性能測試,測試函數會搭配篩選條件(WHERE)來選取設備的十分之1、十分之2、十分之3、直到所有設備。
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的按標籤分組查詢性能對比
從測試結果來看,TDengine的分組聚合查詢速度遠高於InfluxDB,約爲300倍。
本測試作了按時間分組函數的性能測試,測試函數會搭配篩選條件(WHERE)來選取設備的十分之1、十分之2、十分之3、直到所有設備。
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的按時間分組查詢性能對比
1.原始數據的磁盤佔用
本次測試共生成100個測試數據文件,存儲在~/testdata目錄下,使用du命令查看~/testdata目錄的文件大小
cd ~/testdata du -m .
以下圖所示
圖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的磁盤佔用狀況
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的磁盤佔用狀況
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 |