使用 TDengine 快速搭建車聯網平臺

車聯網屬於物聯網的一個分支,經過車載終端採集數據,利用無線網絡傳輸到雲服務平臺進行持久化存儲,最終提供基於實時/歷史數據的個性化服務。git

目前初創型的車輛網企業,接入的車輛一般低於10萬,數據採集頻率遠遠大於1秒。這個級別的數據規模,若是採用HBase系的技術方案,須要至少6臺8核32G配置的機器,而採用TDengine做爲數據存儲引擎,一臺2核8G的機器就能夠完成。github

技術架構

TDengine做爲時序處理引擎,能夠徹底不用Kafka、HDFS/HBase/Spark、Redis等軟件,大幅簡化大數據平臺的設計,下降研發成本和運營成本。由於須要集成的開源組件少,於是系統能夠更加健壯,也更容易保證數據的一致性。sql

  • 基於HBase的解決方案,架構圖以下

圖 1 基於HBase的技術架構圖

  • 而基於TDengine的解決方案,架構圖以下

圖 2 基於TDengine的技術架構圖

數據模型

車載終端採集的數據字段很是多,不少企業按照國標ISO 22901創建數據模型,也有公司按照業務須要使用自定義的數據模型。但一般,採集數據都包含以下字段,本文也採用這種方法構造數據模型。數據庫

  • 採集時間(時間戳)
  • 車輛標誌(字符串)
  • 經度(雙精度浮點)
  • 維度(雙精度浮點)
  • 海拔(浮點)
  • 方向(浮點)
  • 速度(浮點)
  • 車牌號(字符串)
  • 車輛型號(字符串)
  • 車輛vid(字符串)

不一樣於其餘時序數據引擎,TDengine爲每輛車單首創建一張數據表,數據字段爲採集時間、車輛標誌、經度、緯度、海拔、方向、速度等與時間序列相關的採集數據;標籤字段爲車牌號、車輛型號等車輛自己固定的描述信息。這裏面有一個小技巧,浮點數據壓縮比相對整型數據壓縮比不好,經度緯度一般精確到小數點後7位,所以將經度緯度增大1E7倍轉爲長整型存儲,將海拔、方向、速度增大1E2倍轉爲整型存儲。緩存

建立數據庫的語句爲bash

create database db cache 8192 ablocks 2 tblocks 1000 tables 10000;
複製代碼

建立超級表的SQL語句爲網絡

create table vehicle(ts timestamp, longitude bigint, latitude bigint, altitude int, direction int, velocity int) tags(card int, model binary(10));
複製代碼

以車輛vid做爲表名(例如vid爲1,車牌號爲25746,類型爲bmw),那麼建立數據表的語句爲多線程

create table v1 using tags(25746, ‘bmw’);
複製代碼

數據寫入

仍然以車輛v1爲例,寫入一條記錄到表v1的SQL語句爲架構

insert into v1 values(1562150939000,1,2,3,4,5);
複製代碼

測試數據的生成,能夠採用批量數據寫入方法,相似運維

insert into v1 values(1562150939000,1,1,1,1,1) (1562150969000,2,2,2,2,2) (1562150999000,3,3,3,3,3) (……)(……);
複製代碼

本文采用C語言編寫了一個車輛模擬數據生成程序,該程序首先10萬張數據表,而後每張數據表寫入1個月的數據(數據間隔1分鐘,計44000條數據)

#include <stdio.h> 
#include <stdlib.h>
#include <string.h> 
#include <unistd.h> 
#include "time.h"
#include "taos.h"
int main(int argc, char *argv[]) {
   taos_init();
 
   TAOS *taos = taos_connect("127.0.0.1", "root", "taosdata", NULL, 0);
   if (taos == NULL) {
     printf("failed to connect to server, reason:%s\n", taos_errstr(taos));
     exit(1);
   }
 
   if (taos_query(taos, "create database db cache 8192 ablocks 2 tblocks 1000 tables 10000") != 0) {
     printf("failed to create database, reason:%s\n", taos_errstr(taos));
     exit(1);
   }
 
   taos_query(taos, "use db");
 
   char sql[65000] = "create table vehicles(ts timestamp, longitude bigint, latitude bigint, altitude int, direction int, velocity int) tags(card int, model binary(10))";
   if (taos_query(taos, sql) != 0) {
     printf("failed to create stable, reason:%s\n", taos_errstr(taos));
     exit(1);
   }
 
   int begin = time(NULL);
   for (int table = 0; table < 100000; ++table) {
     sprintf(sql, "create table v%d using vehicles tags(%d, 't%d')", table, table, table);
     if (taos_query(taos, sql) != 0) {
       printf("failed to create table t%d, reason:%s\n", table, taos_errstr(taos));
       exit(1);
     }
 
     for (int loop = 0; loop < 44; loop++) {   
       int len = sprintf(sql, "insert into v%d values", table);   
       for (int row = 0; row < 1000; row++) {     
         len += sprintf(sql + len, "(%ld,%d,%d,%d,%d,%d)", 1561910400000L + 60000L * (row + loop * 1000L), row, row, row, row, row);   
       }   
       if (taos_query(taos, sql) != 0) {     
         printf("failed to insert table t%d, reason:%s\n", table, taos_errstr(taos));   
       } 
     }
   }
   int end = time(NULL);
     printf("insert finished, time spend %d seconds", end - begin);
   }
}
複製代碼

將改C文件命名爲test.c,在相同目錄下建立makefile文件

ROOT = ./
TARGET = exe
LFLAGS = -Wl,-rpath,/usr/lib/ -ltaos -lpthread -lm -lrt 
CFLAGS = -O3 -g -Wall -Wno-deprecated -fPIC -Wno-unused-result -Wconversion -Wno-char-subscripts -D_REENTRANT -Wno-format -D_REENTRANT -DLINUX -msse4.2 -Wno-unused-function -D_M_X64 -std=gnu99 -I/usr/local/include/taos/
 
all: $(TARGET)
 
exe:
   gcc $(CFLAGS) ./test.c -o $(ROOT)/test $(LFLAGS)
 
clean:
   rm $(ROOT)test 
複製代碼

編譯以後,將測試程序和數據庫在同一臺2核8G的臺式機上運行,寫入時間共計爲3946秒,至關於4400000000條/3946秒=111.5萬條/秒,折算成點數爲111.5*5=557萬點/秒。

insert finished, time spend 3946 seconds
複製代碼

該程序是單線程運行的,如將其修改爲多線程,速度還會有更大提高,可是僅就目前的性能來看,對於車輛網的場景也已經足夠。

數據查詢

TDengine在數據查詢方面作了不少針對時序數據的優化。基於上面生成的測試數據集進行查詢,這是一些常見SQL語句的運行結果,性能仍是有點嚇人的。

  • 查詢總數

  • 單輛車的明細數據
查詢類型 查詢時間
1車當前值查詢 2.3ms
1車1小時明細查詢 2.1ms
1車1日明細查詢 6.3ms
1車10日明細查詢 15.4ms
1車31日明細查詢 31.6ms

  • 單輛車的聚合查詢
查詢類型 查詢時間
1車1小時聚合查詢 1.9ms
1車1日聚合查詢 1.7ms
1車10日聚合查詢 2.3ms
1車31日聚合查詢 2.2ms

  • 多輛車的單日聚合查詢
查詢類型 查詢時間
1車單日聚合查詢 3.2ms
10車單日聚合查詢 5.1ms
100車單日聚合查詢 10.4ms
1000車單日聚合查詢 51.4ms
10000車單日聚合查詢 455.9ms
100000車單日聚合查詢 2074.8ms

  • 多輛車單月聚合查詢
查詢類型 查詢時間
1車單月聚合查詢 3.1ms
10車單月聚合查詢 4.1ms
100車單月聚合查詢 7.7ms
1000車單月聚合查詢 33.7ms
10000車單月聚合查詢 289.5ms
100000車單月聚合查詢 1197.ms

  • 多輛車單月曲線查詢
查詢類型 查詢時間
1車單月曲線查詢 6.9ms
10車單月曲線查詢 13.2ms
100車單月曲線查詢 75.6ms
1000車單月曲線查詢 710.9ms
10000車單月曲線查詢 7137.6ms
100000車單月曲線查詢 32130.8ms

  • 資源消耗

數據庫服務進程只消耗了約2.7GB的內存,CPU佔用能夠忽略不計。

結果分析

TDengine提供的時序數據解決方案,單機狀況下的平均寫入速度在百萬條/秒級別,單輛車的全部查詢均能作到實時,多輛車的查詢速度也很是快,是車聯網乃至物聯網的必備利器。

關於 TDengine

TDengine是濤思數據擁有自主知識產權的高性能、可伸縮、高可靠、零管理的物聯網大數據平臺軟件,能夠將數據庫、緩存、消息隊列、流式計算等功能徹底融合在一塊兒。因爲針對物聯網大數據特色作了各類優化,TDengine的數據插入、查詢的性能比通用的大數據平臺好10倍以上,存儲空間也大爲節省,採用SQL接口,與第三方軟件能無縫集成,大幅簡化了物聯網平臺的系統架構,大幅減小了研發和運維的複雜度與成本。TDengine可普遍運用於物聯網、車聯網、工業大數據等領域。2019年7月12日,TDengine開源,在GitHub全球趨勢排行榜上連續幾天排名第一。

目前在GitHub上,TDengine的Star數已超10,000,GitHub地址:github.com/taosdata/TD… ,歡迎來GitHub上Star咱們!

相關文章
相關標籤/搜索