從MongoDB遷移到TDengine後,成本顯著下

從MongoDB遷移到TDengine後,成本顯著下

作者:喻東東莞中融數字

小T導讀

:當下我國養殖企業普遍採用傳統塑膠耳標+人工定期分析+獸醫現場診斷來做牲畜異常預防,雖然市面上有固定攝像頭、滑軌追蹤攝像頭、電信NB卡等方案,但這種方式依舊會存在牲畜識別錯誤、高延遲等問題,無法做到實時監控每一頭牲畜。基於此,我們利用新興技術打造了牲畜“特徵採集+AI分析”的AIoT平臺,來實現牲畜異常的早發現、早報警、早預防。

具體場景如下:使用APP提前錄入採集器編號,再將採集器固定在牲畜身上(耳朵、頸部、腿部等),採集器每分鐘會採集20次特徵資料,採集資料種類包括溫度、流汗情況、經緯度、運動、脈搏、環境溫溼度等。將採集到的資料進行邊緣計算,再將彙總結果透過4G網路傳送至雲端伺服器,之後雲端會根據經緯度等要求獲取到所對應的天氣、風量等變數,結合採集器資料,AI會綜合評估出牲畜當前的健康情況,例如是否有食慾不振、癱坐不動、發燒趨勢等。

一、架構和具體實現

與傳統物聯網專案一樣,本平臺對資料的寫入效能有較高的要求,同時也有一定的聚合查詢需求,具體操作上寫多讀少,是典型的高併發寫入場景。我們之前採用的是MongoDB的方案,還做了月份分表,但是進行聚合查詢的效率並不高,而且也不便利,之後我們又嘗試引入Cassandra,但使用上依舊不夠便利。

偶然的機會下,我們瞭解到InfluxDB和TDengine,在搭建測試環境後對兩者分別進行了測試,最終敲定TDengine。

除了兩者直接的效能差距外,TDengine提供的表資料TTL機制、資料壓縮、流式計算等功能也讓我們更加青睞於它。

基於超級表的設計原理,我們將牲畜的業務關聯資訊作為tag,方便關聯MySQL,同時一個採集器就作為一個子表存在,採集器測點作為子表的列。

表結構分別如下圖所示:圖一為牲畜所佩戴的採集器表,也可以認為是牲畜表,其與採集器一一繫結,圖二與圖三則為安裝在養殖場固定位置的環境溫溼度表,此外還有儲存原始報文資料的表等,就不在此一一列舉了。

從MongoDB遷移到TDengine後,成本顯著下

圖1

從MongoDB遷移到TDengine後,成本顯著下

圖2

從MongoDB遷移到TDengine後,成本顯著下

圖3

目前我司的所有物聯網資料表都是基於TDengine超級表設計的,針對核心的牲畜超級表,其關聯的tag會比其他表更多一些。需要注意的是,為了保證TDengine中tag與MySQL一致,每當業務中修改了牲畜的基本屬性,也需要同步執行tag修改操作。

這種表設計方便我們追溯可能出現的處理延時等問題,表中的collect_time為採集時間,insert_time為資料落盤時間,如果兩者的時間差較大,則可能就出現了網路差、採集器故障、服務端吞吐量不夠等問題,此時就需要排查下原因了。

牲畜資料採集到資料落盤的全流程如下圖所示,透過採集器採集到的資料經過4G網路上報,由裝置閘道器初步處理資料並推送至MQ,提升吞吐量,之後傳輸給消費者,最終落盤到TDengine。

從MongoDB遷移到TDengine後,成本顯著下

二、資料遷移和實際效果

因為我們之前使用的是其他資料庫,更換新的資料庫時會產生資料遷移的操作,具體遷移步驟如下:

新產生的採集器資料分別寫入MongoDB和TDengine,即一份資料寫兩份,舊資料查MongoDB,新資料查TDengine,以便出現問題後能及時挽救;

逐步將歷史資料格式化匯入到TDengine;

AI分析的資料來源由MySQL數倉改為TDengine。

在遷移過程中我們也遇到了一些小問題,主要有兩點:

由於此前使用的是MySQL+MongoDB的方案,所有MongoDB的語句都得改寫為TDengine的SQL,而TDengine的語法雖然接近SQL,但細節部分區別卻不少,不過也並不是大問題,適應之後就好了。

由於我司的服務比較多,起初我有考慮做一箇中間件來提供給系統內的其他服務做資料查詢,但由於TDengine是一個較新的開源專案,因此最終還是使用傳統的方式:涉及到了物聯網資料呼叫的服務全部自行連線taos,在遷移執行穩定後再做整合。

遷移之後的效果也非常明顯,我們在使用MongoDB時,自建叢集是使用了6臺4核32G機器,

遷移到TDengine之後,自建叢集僅使用了2臺8核32G機器,在成本上有顯著下降

在效能的具體表現上,我模擬了6000多個採集器的資料,表資料合計約三億條。我司大部分查詢都是基於子表,僅部分業務需要檢視聚合操作。對超級表做groupby+last_row(*)查詢時,能在1。5s內返回資料,對子表做查詢在0。1秒左右(select*fromson_tablelimit10),可以滿足業務要求。

三、寫在最後

隨著物聯網、人工智慧等新興科技的發展,AIot已經是個不可忽視的大趨勢,而計算環節往往少不了數倉,但在需求不復雜的產品中或許可以節省掉這一步,某種意義上,TDengine提供的流式計算和高效能的查詢,也幫助我們在一定程度上省掉了不少中間步驟,達到了降本增效的結果。

現在TDengine在成本管控和效能提升方面所帶來的效果已經很突出,如果其能夠在未來某個版本支援與模型之間的呼叫並直接輸出結果,那可就太完美了!

?想了解更多

TDengine|物聯網大資料平臺,時序大資料引擎

的具體細節,歡迎大家在GitHub上檢視相關原始碼哦。?