TDengine是一高效的時序空間大數據處理引擎,因為充分利用物聯網、車聯網、工業互聯網等場景的數據特點并做了很多優化,因此性能上遠勝通用的大數據平臺。但TDengine的核心功能是時序數據庫(Time-Series Database),而(er)大數據處(chu)理平(ping)臺往往還需要有消息隊(dui)列、緩存、流式計算(suan)等功能(neng),怎么能(neng)不要Redis、Kafak和(he)Spark這些(xie)軟件了呢?本文將給出詳細(xi)解答。
消息隊列
與互聯網(wang)(wang)應用不一(yi)樣(yang)的(de)是(shi)(shi),物(wu)(wu)聯網(wang)(wang)場景中(zhong),只要(yao)(yao)指(zhi)定(ding)聯網(wang)(wang)設(she)備數(shu)量(liang),數(shu)據(ju)(ju)(ju)采(cai)集(ji)頻次,系(xi)統所(suo)需(xu)要(yao)(yao)的(de)流(liu)量(liang)是(shi)(shi)可(ke)(ke)較為準確(que)估算出來(lai)的(de),流(liu)量(liang)是(shi)(shi)較為平穩的(de)。而(er)互聯網(wang)(wang)場景中(zhong),流(liu)量(liang)不平穩,比如(ru)雙11的(de)時(shi)(shi)候,電(dian)商的(de)流(liu)量(liang)可(ke)(ke)以(yi)幾十倍的(de)變化。同時(shi)(shi),物(wu)(wu)聯網(wang)(wang)設(she)備都(dou)有一(yi)定(ding)的(de)數(shu)據(ju)(ju)(ju)緩存能力,不能僅(jin)僅(jin)依靠云端的(de)緩存來(lai)解決。因(yin)為即使整個(ge)系(xi)統都(dou)工作正常,但網(wang)(wang)絡任(ren)何部分都(dou)可(ke)(ke)能出現(xian)中(zhong)斷,數(shu)據(ju)(ju)(ju)就無法傳(chuan)輸,物(wu)(wu)聯網(wang)(wang)設(she)備必須有能力把(ba)數(shu)據(ju)(ju)(ju)先緩存起來(lai),因(yin)此物(wu)(wu)聯網(wang)(wang)平臺對消息(xi)隊列(lie)的(de)需(xu)求(qiu)沒有那么強烈。而(er)TDengine內部實現(xian)了(le)一(yi)簡單的(de)消息(xi)隊列(lie),任(ren)何收到的(de)消息(xi)都(dou)會寫進WAL日志(zhi),只要(yao)(yao)回復確(que)認了(le)的(de)消息(xi),就一(yi)定(ding)不會丟失。同時(shi)(shi)TDengine提供訂(ding)閱功能,用戶可(ke)(ke)以(yi)訂(ding)閱原始(shi)數(shu)據(ju)(ju)(ju),一(yi)個(ge)數(shu)據(ju)(ju)(ju)子集(ji)、時(shi)(shi)間軸(zhou)上聚(ju)合計算的(de)結果,或(huo)是(shi)(shi)多條時(shi)(shi)間線定(ding)時(shi)(shi)聚(ju)合的(de)結果,這樣(yang)就不需(xu)要(yao)(yao)使用Kafka等類似的(de)消息(xi)隊列(lie)軟件。使用TDengine,將數(shu)據(ju)(ju)(ju)寫入消息(xi)隊列(lie),就是(shi)(shi)標(biao)準的(de)SQL insert指(zhi)令(ling),訂(ding)閱數(shu)據(ju)(ju)(ju),C/C++語(yu)言的(de)接口是(shi)(shi):
taos_subscribe(char *host, char *user, char *pass, char *db, char *table, long time, int mseconds)
這個API里的(de)(de)參數(shu)(shu)是鏈接數(shu)(shu)據庫所需(xu)(xu)要(yao)的(de)(de)IP地址、用戶名、密碼、數(shu)(shu)據庫以(yi)及表的(de)(de)名字,但(dan)參數(shu)(shu)mseconds控(kong)制了多快(kuai)返回(hui)一次數(shu)(shu)據給應用,參數(shu)(shu)time是指離(li)現在多長時間之前的(de)(de)數(shu)(shu)據需(xu)(xu)要(yao)返回(hui)給應用,如果沒有返回(hui)過的(de)(de)話。其他(ta)語言的(de)(de)API可以(yi)參考TDengine的(de)(de)用戶手(shou)冊。
緩存
TDengine對數(shu)(shu)(shu)(shu)據(ju)庫分配了固定的(de)(de)(de)內(nei)(nei)存(cun)(cun)池(chi),新插入(ru)的(de)(de)(de)數(shu)(shu)(shu)(shu)據(ju),會(hui)(hui)先寫入(ru)內(nei)(nei)存(cun)(cun)池(chi)。每(mei)個(ge)(ge)數(shu)(shu)(shu)(shu)據(ju)采集設(she)備(bei)(bei)(bei)或(huo)(huo)(huo)(huo)是(shi)每(mei)張表,都(dou)會(hui)(hui)從(cong)內(nei)(nei)存(cun)(cun)池(chi)中分配到一(yi)(yi)(yi)個(ge)(ge)或(huo)(huo)(huo)(huo)多個(ge)(ge)數(shu)(shu)(shu)(shu)據(ju)塊。對于(yu)(yu)互聯(lian)網(wang)應(ying)(ying)用(yong)(yong),需要緩存(cun)(cun)的(de)(de)(de)數(shu)(shu)(shu)(shu)據(ju)往往是(shi)用(yong)(yong)戶(hu)讀取(qu)(qu)頻次較高的(de)(de)(de)數(shu)(shu)(shu)(shu)據(ju),取(qu)(qu)決于(yu)(yu)用(yong)(yong)戶(hu)行為。比如(ru)某頭條文章或(huo)(huo)(huo)(huo)微博,一(yi)(yi)(yi)天(tian)之(zhi)后還很(hen)有熱度(du)(du),需要緩存(cun)(cun)才(cai)行。而(er)物聯(lian)網(wang)數(shu)(shu)(shu)(shu)據(ju),絕大部分情(qing)況下(xia),剛(gang)剛(gang)采集的(de)(de)(de)數(shu)(shu)(shu)(shu)據(ju)才(cai)是(shi)熱數(shu)(shu)(shu)(shu)據(ju),歷史數(shu)(shu)(shu)(shu)據(ju)一(yi)(yi)(yi)般(ban)情(qing)況下(xia)都(dou)是(shi)冷數(shu)(shu)(shu)(shu)據(ju)。因此TDengine按照先進(jin)先出的(de)(de)(de)原則對內(nei)(nei)存(cun)(cun)池(chi)進(jin)行管(guan)理,內(nei)(nei)存(cun)(cun)不足(zu)時(shi),老的(de)(de)(de)數(shu)(shu)(shu)(shu)據(ju)會(hui)(hui)被持久化存(cun)(cun)儲,而(er)內(nei)(nei)存(cun)(cun)里(li)的(de)(de)(de)老數(shu)(shu)(shu)(shu)據(ju)會(hui)(hui)被最(zui)(zui)新的(de)(de)(de)覆蓋掉(diao)。TDengine還保證(zheng)了任何一(yi)(yi)(yi)臺設(she)備(bei)(bei)(bei)最(zui)(zui)后一(yi)(yi)(yi)條記(ji)錄(lu)一(yi)(yi)(yi)定在內(nei)(nei)存(cun)(cun)中,如(ru)果(guo)應(ying)(ying)用(yong)(yong)要獲(huo)取(qu)(qu)每(mei)個(ge)(ge)設(she)備(bei)(bei)(bei)的(de)(de)(de)最(zui)(zui)新數(shu)(shu)(shu)(shu)據(ju)或(huo)(huo)(huo)(huo)狀態,都(dou)將從(cong)內(nei)(nei)存(cun)(cun)里(li)直接獲(huo)取(qu)(qu)。系統(tong)提供(gong)了一(yi)(yi)(yi)個(ge)(ge)特(te)殊的(de)(de)(de)函數(shu)(shu)(shu)(shu)SQL last_row專門用(yong)(yong)來返回(hui)最(zui)(zui)后一(yi)(yi)(yi)條記(ji)錄(lu)。如(ru)果(guo)使用(yong)(yong)TDengine超級表,還可(ke)以快速返回(hui)所(suo)有設(she)備(bei)(bei)(bei)或(huo)(huo)(huo)(huo)一(yi)(yi)(yi)組設(she)備(bei)(bei)(bei)的(de)(de)(de)最(zui)(zui)后一(yi)(yi)(yi)條記(ji)錄(lu),便(bian)于(yu)(yu)應(ying)(ying)用(yong)(yong)顯示系統(tong)實時(shi)狀態。比如(ru)查詢所(suo)有北京的(de)(de)(de)溫(wen)度(du)(du)傳感器(qi)的(de)(de)(de)最(zui)(zui)新溫(wen)度(du)(du)值,使用(yong)(yong)下(xia)面的(de)(de)(de)SQL即可(ke):
select last_row(*) from thermometers where location=’beijing’
這樣的設(she)計讓系統可以不再需要(yao)Redis這類軟(ruan)件。
流式計算
物聯網數據是一個(ge)流數據,需要(yao)實(shi)時流式計(ji)(ji)算(suan)(suan)來進行(xing)各(ge)種預警、預測或生成(cheng)實(shi)時報(bao)表。基于(yu)滑動窗口,TDengine后臺(tai)可定時的(de)拉起查詢計(ji)(ji)算(suan)(suan),提供了一簡化的(de)流式計(ji)(ji)算(suan)(suan),便于(yu)做各(ge)種實(shi)時的(de)統計(ji)(ji)聚(ju)合操作。比如(ru),某(mou)個(ge)溫度傳感器(qi)每(mei)隔10秒鐘采集一次(ci)溫度,但(dan)系統需要(yao)每(mei)隔1分(fen)鐘計(ji)(ji)算(suan)(suan)一下剛過去的(de)三分(fen)鐘的(de)溫度平均(jun)值,TDengine里就可以(yi)使用如(ru)下SQL語句實(shi)現(xian):
select avg(degree) from thermometer interval(3m) sliding(1m)
其(qi)中的(de)選項interval是指滑動(dong)窗(chuang)口(kou)的(de)時間長度,sliding是指窗(chuang)口(kou)多快滑動(dong)一(yi)次。這樣對(dui)于(yu)一(yi)般的(de)物聯網場景(jing),不(bu)再需要使(shi)用(yong)Spark等類型的(de)流式計算(suan)軟(ruan)件。
全棧的數據處理引擎
綜上所述,TDengine提供了大(da)數(shu)(shu)(shu)據(ju)(ju)(ju)(ju)處(chu)(chu)理所需要(yao)的(de)(de)緩存、消息(xi)隊列、流式計算(suan)等系列功(gong)能(neng)。但一(yi)個物(wu)聯(lian)網、車聯(lian)網大(da)數(shu)(shu)(shu)據(ju)(ju)(ju)(ju)平臺,往(wang)往(wang)還(huan)有很多業務(wu)數(shu)(shu)(shu)據(ju)(ju)(ju)(ju)需要(yao)處(chu)(chu)理。這些業務(wu)數(shu)(shu)(shu)據(ju)(ju)(ju)(ju)包括(kuo)人員、設備的(de)(de)管(guan)理數(shu)(shu)(shu)據(ju)(ju)(ju)(ju),交易記錄等等,這些數(shu)(shu)(shu)據(ju)(ju)(ju)(ju)不(bu)是(shi)時序(xu)的(de)(de),而(er)且往(wang)往(wang)有復雜的(de)(de)關系查詢,無法由(you)TDengine處(chu)(chu)理,還(huan)需要(yao)使(shi)用(yong)傳統的(de)(de)關系型數(shu)(shu)(shu)據(ju)(ju)(ju)(ju)庫,比如(ru)MySQL來(lai)處(chu)(chu)理。只不(bu)過,這些業務(wu)數(shu)(shu)(shu)據(ju)(ju)(ju)(ju)的(de)(de)量都(dou)不(bu)大(da),根本不(bu)需要(yao)大(da)數(shu)(shu)(shu)據(ju)(ju)(ju)(ju)技術來(lai)處(chu)(chu)理。
在(zai)典(dian)型的(de)物聯(lian)網、車聯(lian)網場景里(li),采(cai)集(ji)的(de)數據量(liang)占(zhan)有整(zheng)個系統(tong)的(de)數據量(liang)的(de)99%以上,使用TDengine,就能很(hen)好的(de)解決整(zheng)個平臺(tai)的(de)大(da)(da)(da)數據問題(ti),完全可(ke)拋棄掉(diao)Kafka、HDFS、HBase、Spark和Redis等(deng)一大(da)(da)(da)堆軟件,大(da)(da)(da)幅簡化(hua)數據平臺(tai)的(de)設計,降低研發成本大(da)(da)(da),降低運(yun)維門檻。而(er)且系統(tong)將更加健壯,數據的(de)一致性更有保證。
最(zui)后值得一提的(de)(de)是,對于(yu)私有化部署(shu)的(de)(de)物(wu)聯網、車聯網平(ping)臺,因為TDengine部署(shu)簡單,增(zeng)加一個節(jie)(jie)點幾秒搞定,無歷(li)史(shi)數(shu)(shu)(shu)據(ju)實時數(shu)(shu)(shu)據(ju)之分,數(shu)(shu)(shu)據(ju)備份恢復全部自動,相對于(yu)通用的(de)(de)大數(shu)(shu)(shu)據(ju)平(ping)臺而言,將大幅節(jie)(jie)省現(xian)場實施和后續的(de)(de)維護成本。


























