TDengine是一高效的時(shí)序空間大數(shù)據(jù)處理引擎,因?yàn)槌浞掷梦锫?lián)網(wǎng)、車(chē)聯(lián)網(wǎng)、工業(yè)互聯(lián)網(wǎng)等場(chǎng)景的數(shù)據(jù)特點(diǎn)并做了很多優(yōu)化,因此性能上遠(yuǎn)勝通用的大數(shù)據(jù)平臺(tái)。但TDengine的核心功能是時(shí)序數(shù)據(jù)庫(kù)(Time-Series Database),而大數(shù)據(jù)處理平臺(tái)往往還需要有消息隊(duì)列、緩存、流式計(jì)算等功能,怎么能不要Redis、Kafak和Spark這些軟件了呢?本文將給出詳細(xì)解答。
消息隊(duì)列
與互聯(lián)網(wǎng)應(yīng)用不一樣的是,物聯(lián)網(wǎng)場(chǎng)景中,只要指定聯(lián)網(wǎng)設(shè)備數(shù)量,數(shù)據(jù)采集頻次,系統(tǒng)所需要的流量是可較為準(zhǔn)確估算出來(lái)的,流量是較為平穩(wěn)的。而互聯(lián)網(wǎng)場(chǎng)景中,流量不平穩(wěn),比如雙11的時(shí)候,電商的流量可以幾十倍的變化。同時(shí),物聯(lián)網(wǎng)設(shè)備都有一定的數(shù)據(jù)緩存能力,不能僅僅依靠云端的緩存來(lái)解決。因?yàn)榧词拐麄€(gè)系統(tǒng)都工作正常,但網(wǎng)絡(luò)任何部分都可能出現(xiàn)中斷,數(shù)據(jù)就無(wú)法傳輸,物聯(lián)網(wǎng)設(shè)備必須有能力把數(shù)據(jù)先緩存起來(lái),因此物聯(lián)網(wǎng)平臺(tái)對(duì)消息隊(duì)列的需求沒(méi)有那么強(qiáng)烈。而TDengine內(nèi)部實(shí)現(xiàn)了一簡(jiǎn)單的消息隊(duì)列,任何收到的消息都會(huì)寫(xiě)進(jìn)WAL日志,只要回復(fù)確認(rèn)了的消息,就一定不會(huì)丟失。同時(shí)TDengine提供訂閱功能,用戶可以訂閱原始數(shù)據(jù),一個(gè)數(shù)據(jù)子集、時(shí)間軸上聚合計(jì)算的結(jié)果,或是多條時(shí)間線定時(shí)聚合的結(jié)果,這樣就不需要使用Kafka等類(lèi)似的消息隊(duì)列軟件。使用TDengine,將數(shù)據(jù)寫(xiě)入消息隊(duì)列,就是標(biāo)準(zhǔn)的SQL insert指令,訂閱數(shù)據(jù),C/C++語(yǔ)言的接口是:
taos_subscribe(char *host, char *user, char *pass, char *db, char *table, long time, int mseconds)
這個(gè)API里的參數(shù)是鏈接數(shù)據(jù)庫(kù)所需要的IP地址、用戶名、密碼、數(shù)據(jù)庫(kù)以及表的名字,但參數(shù)mseconds控制了多快返回一次數(shù)據(jù)給應(yīng)用,參數(shù)time是指離現(xiàn)在多長(zhǎng)時(shí)間之前的數(shù)據(jù)需要返回給應(yīng)用,如果沒(méi)有返回過(guò)的話。其他語(yǔ)言的API可以參考TDengine的用戶手冊(cè)。
緩存
TDengine對(duì)數(shù)據(jù)庫(kù)分配了固定的內(nèi)存池,新插入的數(shù)據(jù),會(huì)先寫(xiě)入內(nèi)存池。每個(gè)數(shù)據(jù)采集設(shè)備或是每張表,都會(huì)從內(nèi)存池中分配到一個(gè)或多個(gè)數(shù)據(jù)塊。對(duì)于互聯(lián)網(wǎng)應(yīng)用,需要緩存的數(shù)據(jù)往往是用戶讀取頻次較高的數(shù)據(jù),取決于用戶行為。比如某頭條文章或微博,一天之后還很有熱度,需要緩存才行。而物聯(lián)網(wǎng)數(shù)據(jù),絕大部分情況下,剛剛采集的數(shù)據(jù)才是熱數(shù)據(jù),歷史數(shù)據(jù)一般情況下都是冷數(shù)據(jù)。因此TDengine按照先進(jìn)先出的原則對(duì)內(nèi)存池進(jìn)行管理,內(nèi)存不足時(shí),老的數(shù)據(jù)會(huì)被持久化存儲(chǔ),而內(nèi)存里的老數(shù)據(jù)會(huì)被最新的覆蓋掉。TDengine還保證了任何一臺(tái)設(shè)備最后一條記錄一定在內(nèi)存中,如果應(yīng)用要獲取每個(gè)設(shè)備的最新數(shù)據(jù)或狀態(tài),都將從內(nèi)存里直接獲取。系統(tǒng)提供了一個(gè)特殊的函數(shù)SQL last_row專(zhuān)門(mén)用來(lái)返回最后一條記錄。如果使用TDengine超級(jí)表,還可以快速返回所有設(shè)備或一組設(shè)備的最后一條記錄,便于應(yīng)用顯示系統(tǒng)實(shí)時(shí)狀態(tài)。比如查詢所有北京的溫度傳感器的最新溫度值,使用下面的SQL即可:
select last_row(*) from thermometers where location=’beijing’
這樣的設(shè)計(jì)讓系統(tǒng)可以不再需要Redis這類(lèi)軟件。
流式計(jì)算
物聯(lián)網(wǎng)數(shù)據(jù)是一個(gè)流數(shù)據(jù),需要實(shí)時(shí)流式計(jì)算來(lái)進(jìn)行各種預(yù)警、預(yù)測(cè)或生成實(shí)時(shí)報(bào)表?;诨瑒?dòng)窗口,TDengine后臺(tái)可定時(shí)的拉起查詢計(jì)算,提供了一簡(jiǎn)化的流式計(jì)算,便于做各種實(shí)時(shí)的統(tǒng)計(jì)聚合操作。比如,某個(gè)溫度傳感器每隔10秒鐘采集一次溫度,但系統(tǒng)需要每隔1分鐘計(jì)算一下剛過(guò)去的三分鐘的溫度平均值,TDengine里就可以使用如下SQL語(yǔ)句實(shí)現(xiàn):
select avg(degree) from thermometer interval(3m) sliding(1m)
其中的選項(xiàng)interval是指滑動(dòng)窗口的時(shí)間長(zhǎng)度,sliding是指窗口多快滑動(dòng)一次。這樣對(duì)于一般的物聯(lián)網(wǎng)場(chǎng)景,不再需要使用Spark等類(lèi)型的流式計(jì)算軟件。
全棧的數(shù)據(jù)處理引擎
綜上所述,TDengine提供了大數(shù)據(jù)處理所需要的緩存、消息隊(duì)列、流式計(jì)算等系列功能。但一個(gè)物聯(lián)網(wǎng)、車(chē)聯(lián)網(wǎng)大數(shù)據(jù)平臺(tái),往往還有很多業(yè)務(wù)數(shù)據(jù)需要處理。這些業(yè)務(wù)數(shù)據(jù)包括人員、設(shè)備的管理數(shù)據(jù),交易記錄等等,這些數(shù)據(jù)不是時(shí)序的,而且往往有復(fù)雜的關(guān)系查詢,無(wú)法由TDengine處理,還需要使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù),比如MySQL來(lái)處理。只不過(guò),這些業(yè)務(wù)數(shù)據(jù)的量都不大,根本不需要大數(shù)據(jù)技術(shù)來(lái)處理。
在典型的物聯(lián)網(wǎng)、車(chē)聯(lián)網(wǎng)場(chǎng)景里,采集的數(shù)據(jù)量占有整個(gè)系統(tǒng)的數(shù)據(jù)量的99%以上,使用TDengine,就能很好的解決整個(gè)平臺(tái)的大數(shù)據(jù)問(wèn)題,完全可拋棄掉Kafka、HDFS、HBase、Spark和Redis等一大堆軟件,大幅簡(jiǎn)化數(shù)據(jù)平臺(tái)的設(shè)計(jì),降低研發(fā)成本大,降低運(yùn)維門(mén)檻。而且系統(tǒng)將更加健壯,數(shù)據(jù)的一致性更有保證。
最后值得一提的是,對(duì)于私有化部署的物聯(lián)網(wǎng)、車(chē)聯(lián)網(wǎng)平臺(tái),因?yàn)門(mén)Dengine部署簡(jiǎn)單,增加一個(gè)節(jié)點(diǎn)幾秒搞定,無(wú)歷史數(shù)據(jù)實(shí)時(shí)數(shù)據(jù)之分,數(shù)據(jù)備份恢復(fù)全部自動(dòng),相對(duì)于通用的大數(shù)據(jù)平臺(tái)而言,將大幅節(jié)省現(xiàn)場(chǎng)實(shí)施和后續(xù)的維護(hù)成本。



互聯(lián)網(wǎng).png)



-1.png)




.png)


證.png)


伙伴.png)
伙伴.png)
伙伴.png)



