摘要:爲幫助用戶瞭解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的寫入吞吐量
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.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.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.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 |