作(zuo)者:喻東 東莞(guan)中融數字
小T導(dao)讀:當下我(wo)國(guo)養殖企業普遍采(cai)用傳統塑(su)料(liao)耳標+人工定(ding)期分析+獸醫(yi)現場診(zhen)斷來(lai)做牲(sheng)(sheng)畜(chu)(chu)異常預防,雖然(ran)市(shi)面上有固(gu)定(ding)攝像頭(tou)、滑軌追(zhui)蹤攝像頭(tou)、電信NB卡等方(fang)案,但這(zhe)種(zhong)方(fang)式依(yi)舊(jiu)會(hui)存在牲(sheng)(sheng)畜(chu)(chu)識別錯誤、高延遲(chi)等問題,無法做到實時監控每一頭(tou)牲(sheng)(sheng)畜(chu)(chu)。基于此,我(wo)們(men)利用新興技術打(da)造了牲(sheng)(sheng)畜(chu)(chu)“特征(zheng)采(cai)集(ji)+AI分析”的AIoT平臺,來(lai)實現牲(sheng)(sheng)畜(chu)(chu)異常的早(zao)發(fa)現、早(zao)報警(jing)、早(zao)預防。
具體場景如下:使用APP提(ti)前錄入(ru)采(cai)(cai)集(ji)器(qi)編號(hao),再(zai)將(jiang)采(cai)(cai)集(ji)器(qi)固定在牲畜身上(耳朵、頸部、腿部等),采(cai)(cai)集(ji)器(qi)每分(fen)鐘會(hui)采(cai)(cai)集(ji)20次特(te)征數(shu)(shu)據(ju),采(cai)(cai)集(ji)數(shu)(shu)據(ju)種類包括溫度、流汗情(qing)況(kuang)、經緯(wei)度、運動、脈搏、環境溫濕(shi)度等。將(jiang)采(cai)(cai)集(ji)到的(de)數(shu)(shu)據(ju)進行邊緣計算(suan),再(zai)將(jiang)匯總結果通過(guo)4G網絡發送至云(yun)端(duan)服務器(qi),之(zhi)后云(yun)端(duan)會(hui)根據(ju)經緯(wei)度等要求獲(huo)取(qu)到所對應的(de)天氣(qi)、風量等變量,結合(he)采(cai)(cai)集(ji)器(qi)數(shu)(shu)據(ju),AI會(hui)綜合(he)評(ping)估(gu)出牲畜當前的(de)健康情(qing)況(kuang),例如是(shi)否(fou)有食(shi)欲不振、癱坐不動、發燒趨(qu)勢等。
一、架構和具體實現
與傳(chuan)統物(wu)聯網項(xiang)目一樣,本平臺對(dui)數據的(de)(de)寫入性能有較高的(de)(de)要求,同時(shi)也有一定的(de)(de)聚合(he)查詢需求,具體操作上寫多讀少,是(shi)典型的(de)(de)高并(bing)發寫入場景。我們之前采用(yong)的(de)(de)是(shi)MongoDB的(de)(de)方案,還(huan)做了月份(fen)分表,但是(shi)進行(xing)聚合(he)查詢的(de)(de)效率(lv)并(bing)不高,而且也不便利(li),之后我們又嘗試引入Cassandra,但使用(yong)上依舊不夠便利(li)。
偶然的機會下,我們了解到InfluxDB和TDengine這類時序數據庫(Time-Series Database),在搭建測試環境后對兩者分別進行了測試,最終敲定TDengine。除了兩者直接的性能差距外,TDengine提供的表數據TTL機制、數據壓縮、流式計算等功能也讓我們更加青睞于它。
基于超級表的設計原(yuan)理,我們將牲(sheng)畜的業務關(guan)聯(lian)信(xin)息作(zuo)為(wei)tag,方便關(guan)聯(lian)MySQL,同時(shi)一個(ge)采集器就作(zuo)為(wei)一個(ge)子表(biao)存在,采集器測點作(zuo)為(wei)子表(biao)的列。
表(biao)結構分別如下圖所(suo)示:圖一(yi)為牲畜所(suo)佩戴的采集器表(biao),也可以認為是(shi)牲畜表(biao),其與采集器一(yi)一(yi)綁定,圖二與圖三則為安裝(zhuang)在養(yang)殖場(chang)固定位置的環境溫濕度表(biao),此(ci)外(wai)還有存(cun)儲原始報文(wen)數(shu)據的表(biao)等,就不(bu)在此(ci)一(yi)一(yi)列舉了。



目(mu)前我司的所(suo)有物聯網數據表(biao)(biao)(biao)都是基于(yu)TDengine超(chao)(chao)級表(biao)(biao)(biao)設(she)計的,針對核心的牲畜超(chao)(chao)級表(biao)(biao)(biao),其關聯的tag會比其他表(biao)(biao)(biao)更多一些。需要注(zhu)意的是,為(wei)了保證TDengine中(zhong)tag與MySQL一致(zhi),每當業務(wu)中(zhong)修(xiu)改(gai)了牲畜的基本(ben)屬性(xing),也需要同(tong)步執行tag修(xiu)改(gai)操作。
這(zhe)種表設計方便我們追溯可(ke)能出(chu)現(xian)的處(chu)理(li)延時等問(wen)題(ti),表中的collect_time為(wei)采集時間(jian),insert_time為(wei)數據落(luo)盤時間(jian),如果兩(liang)者的時間(jian)差(cha)較(jiao)大,則可(ke)能就(jiu)出(chu)現(xian)了(le)網(wang)絡差(cha)、采集器(qi)故障、服(fu)務端吞(tun)吐量(liang)不(bu)夠等問(wen)題(ti),此時就(jiu)需要排查下原因了(le)。
牲畜數(shu)據(ju)采(cai)集到數(shu)據(ju)落盤(pan)的全流程(cheng)如(ru)下(xia)圖(tu)所(suo)示,通過采(cai)集器采(cai)集到的數(shu)據(ju)經過4G網絡(luo)上報,由設(she)備網關初步(bu)處理數(shu)據(ju)并推(tui)送至MQ,提升(sheng)吞吐(tu)量,之后傳輸給消(xiao)費(fei)者,最終落盤(pan)到TDengine。
二、數據遷移和實際效果
因(yin)為我們(men)之前使用的(de)是其他數(shu)(shu)據(ju)庫,更換新的(de)數(shu)(shu)據(ju)庫時會產生(sheng)數(shu)(shu)據(ju)遷(qian)移(yi)的(de)操作,具體(ti)遷(qian)移(yi)步驟如下(xia):
- 新產生的采集器數據分別寫入MongoDB和TDengine,即一份數據寫兩份,舊數據查MongoDB,新數據查TDengine,以便出現問題后能及時挽救;
- 逐步將歷史數據格式化導入到TDengine;
- AI分析的數據源由MySQL數倉改為TDengine。
在遷移過程中我們也(ye)遇到了一些小問題,主要有(you)兩點(dian):
- 由于此前使用的是MySQL+MongoDB的方案,所有MongoDB的語句都得改寫為TDengine的SQL,而TDengine的語法雖然接近SQL,但細節部分區別卻不少,不過也并不是大問題,適應之后就好了。
- 由于我司的服務比較多,起初我有考慮做一個中間件來提供給系統內的其他服務做數據查詢,但由于TDengine是一個較新的開源項目,因此最終還是使用傳統的方式:涉及到了物聯網數據調用的服務全部自行連接taos,在遷移運行穩定后再做整合。
遷移之后的效果也非常明顯,我們在使用MongoDB時,自建集群是使用了6臺4核32G機器,遷移到TDengine之后,自建集群僅使用了2臺8核32G機器,在成本上有顯著下降。
在性(xing)能的具體表(biao)(biao)現(xian)上,我(wo)模(mo)擬了6000多個(ge)采集器的數(shu)據(ju),表(biao)(biao)數(shu)據(ju)合計約三(san)億條。我(wo)司大部分查(cha)詢都是基(ji)于(yu)子表(biao)(biao),僅(jin)部分業(ye)務需要查(cha)看(kan)聚合操作(zuo)。對(dui)超(chao)級表(biao)(biao)做group by+last_row(*)查(cha)詢時,能在1.5s內(nei)返回數(shu)據(ju),對(dui)子表(biao)(biao)做查(cha)詢在0.1秒左(zuo)右(select * from son_table limit 10),可以(yi)滿足業(ye)務要求。
三、寫在最后
隨著物聯網、人工智能等新興科技的發展,AIot已經是個不可忽視的大趨勢,而計算環節往往少不了數倉,但在需求不復雜的產品中或許可以節省掉這一步,某種意義上,TDengine Database提供的流式計算和高性能的(de)查(cha)詢,也幫助我們在一定(ding)程(cheng)度上省掉了不少(shao)中(zhong)間步(bu)驟(zou),達到了降本增效的(de)結果。
現(xian)在 Database在成本管控和性能(neng)提升方面所帶來的(de)效果已經很突出(chu),如果其能(neng)夠在未來某(mou)個(ge)版本支(zhi)持與模型之間的(de)調用并直接輸出(chu)結果,那可就太完美(mei)了(le)!


























