小 T 導讀:在拓斯達的(de)智(zhi)能工廠整體(ti)解決方案項目中,傳統的(de)關系(xi)型數據(ju)庫已經(jing)無法(fa)高效處理時序數據(ju),在加載、存儲和查詢等多個(ge)方面都遇到了(le)挑戰,最終他(ta)們(men)選(xuan)擇了(le) TDengine 來(lai)匹(pi)配工業傳感器(qi)數據(ju)的(de)應用分(fen)析場景。本文將講(jiang)述他(ta)們(men)應用 TDengine 的(de)具體(ti)實踐。
企業簡介
廣東拓斯(si)達(da)科技(ji)股份有(you)限公司(簡稱:拓斯(si)達(da),股票(piao)代碼:300607)是廣東省首家登(deng)陸創(chuang)業(ye)(ye)板(ban)的機器(qi)人(ren)骨干企業(ye)(ye)。拓斯(si)達(da)堅持“讓工業(ye)(ye)制造(zao)更(geng)美好”的企業(ye)(ye)使(shi)命,通過以工業(ye)(ye)機器(qi)人(ren)、注塑(su)機、CNC為核(he)心(xin)(xin)的智能裝備(bei),以及(ji)控制、伺服、視覺三大核(he)心(xin)(xin)技(ji)術,打造(zao)以核(he)心(xin)(xin)技(ji)術驅動(dong)的智能硬件平臺,為制造(zao)企業(ye)(ye)提供(gong)智能工廠整體解決方案。
項目介紹
在工(gong)業(ye)領域, 生產、測(ce)試(shi)、運行階段(duan)都可能(neng)會產生大量帶有時間(jian)戳的(de)傳感(gan)器數據,這(zhe)都屬(shu)于典型(xing)的(de)時序數據。時序數據主要(yao)由各類(lei)型(xing)實(shi)時監測(ce)、檢查與分析設備所采集或產生,涉(she)及制造、電力、化工(gong)、工(gong)程作業(ye)等多(duo)(duo)個行業(ye),具備寫多(duo)(duo)讀少、量非常大等典型(xing)特性。
在我們(men)的業務中,傳統(tong)的關系型數(shu)據庫(ku)(Relational Database)已(yi)經無法高效處理(li)時序數(shu)據,在加載、存(cun)儲和查(cha)詢(xun)等多(duo)個方面都遇到了挑戰(zhan)。主要(yao)問題(ti)可以匯總如下:
- 寫入吞吐低:單機寫入吞吐量低,很難滿足時序數據千萬級的寫入壓力;
- 存儲成本大:在對時序數據進行壓縮時性能不佳,需占用大量機器資源;
- 維護成本高:單機系統,需要在上層人工進行分庫分表,維護成本高;
- 查詢性能差:海量實時數據的聚合分析性能差。
為了更好地滿足時序數據的處理需求,我們決定進行數據庫選型調研,最終選擇了時序數據庫(Time-Series Database)TDengine。 事實證(zheng)明,TDengine 針對(dui)時序數(shu)據的(de)寫入、存儲、索(suo)引、查詢等方(fang)面(mian)都(dou)進行了特定的(de)優化,從而(er)實現(xian)了更優的(de)數(shu)據加載(zai)、數(shu)據壓(ya)縮、查詢寫入性能,非常(chang)匹(pi)配工(gong)業傳感器數(shu)據的(de)應用分析場景。
選擇 TDengine 的理由
與通用(yong)(yong)數據(ju)庫(ku)相比(bi),TDengine 的壓縮(suo)率表現驚人(ren),核心(xin)原因是其采(cai)用(yong)(yong)列式存儲,而且采(cai)用(yong)(yong)了(le)(le)二階段(duan)壓縮(suo)策略(lve),還(huan)針對不同(tong)數據(ju)類型采(cai)取了(le)(le)不同(tong)的壓縮(suo)算法,這(zhe)種(zhong)壓縮(suo)機制(zhi)使其壓縮(suo)率遠(yuan)超(chao)其他數據(ju)庫(ku)。
此外 TDengine 還擁有極高的讀寫性能,并且讀寫速度受數據存儲規模的影響微乎其微,要知道通用數據庫的數據量一旦過百萬級,讀寫速度就會有明顯下降,之前我們做過一次 MySQL 批量插入數據的測試,性能差距明顯,這也是在大量級數據存儲下我們會選擇TDengine的重要原因之一。具體來說,TDengine 優勢(shi)如下(xia):
- 數據的讀寫速度快且自帶時間戳,使用 SQL 進行數據庫操作,簡單易學,支持復雜查詢
- 數據壓縮率高,大量級的數據也不會占據過多存儲空間,可導出數據進行備份
- 擁有交流社區和交流群,遇見問題可以和 TDengine 的其他使用者一起探討,而且官方的同學也能提供及時的幫助
當然,世上(shang)沒有(you)完(wan)美的(de)數(shu)據庫(ku),我們(men)在應用(yong)之后總結出了兩點待改(gai)進的(de)地(di)方:
- 無法使用可視化軟件如 Navicat 等進行數據庫操作(TDengine GUI)
- 目前還沒有 Windows 版的服務端,像我們上一個客戶,只在本地 Windows 上使用程序,在沒有安裝虛擬機和部署到服務器的情況下,就無法部署 TDengine
但每一(yi)款產品都(dou)是在發現問(wen)題和(he)改進問(wen)題的步伐中逐漸進步的,而且對于(yu)我們的業務實現來(lai)說,TDengine 不(bu)存在明顯的短(duan)板。沒有最優的數(shu)據庫,在場景匹配的情況下(xia),我們最終采用(yong)了 TDengine。
落地實踐
- 平臺架構
我(wo)們是通(tong)過網關(guan)采集設備(bei)數據(ju)推送到 MQTT,Java 后(hou)端(duan)監聽到后(hou)會寫入(ru) TDengine,在后(hou)端(duan)按需(xu)求查詢(xun)處理(li)后(hou)再把數據(ju)返(fan)回給前(qian)端(duan)。
具體來說,網關會先(xian)讀取后臺發(fa)布的(de)上(shang)行(xing)規則(ze),在采集到(dao)設備(bei)數據后,使用上(shang)行(xing)規則(ze)對數據進(jin)行(xing)處理計算后再將結果返回給下行(xing)規則(ze)模塊,后臺監(jian)聽到(dao)后,會連(lian)接 TDengine 進(jin)行(xing)數據庫表的(de)創(chuang)建修改(gai)和數據寫入(ru)。之前在云平臺我們使用過(guo) Kafka 進(jin)行(xing)數據的(de)發(fa)布訂閱,現在所有環境都改(gai)為 MQTT 了。
- 超級表及建模思路
在(zai)應用 TDengine 時,我們(men)建立了(le)流水數據庫(ku) “iot_platform” 用來(lai)(lai)存(cun)儲(chu)(chu)網(wang)關傳來(lai)(lai)的(de)數據,便于日后查詢使(shi)用。我們(men)遵(zun)循(xun)“一(yi)個(ge)采集點一(yi)張(zhang)(zhang)表(biao),一(yi)類數據一(yi)個(ge)超級表(biao)”的(de)思路來(lai)(lai)建表(biao),在(zai)具體實踐上設計了(le)兩張(zhang)(zhang)超級表(biao),一(yi)張(zhang)(zhang)是用于存(cun)儲(chu)(chu) log 指令內(nei)容(rong)的(de)“logs”表(biao),另一(yi)張(zhang)(zhang)是用于存(cun)儲(chu)(chu)其(qi)它指令內(nei)容(rong)的(de)“datas”表(biao),數據類型基本為電流電壓、設備狀態等。在(zai)進行數據存(cun)儲(chu)(chu)時首(shou)先會對數據加以判(pan)斷,再決定將數據存(cun)儲(chu)(chu)到(dao)哪張(zhang)(zhang)表(biao)里。
落地效果
運行一段時間后,TDengine 的查詢、寫入速度完全可以滿足我們目前的客戶需求,最慢的分鐘級,最快的能達到 1 秒一條;一個設備一天最多能寫入近十萬條數據,近千個設備同時寫入也完全沒有問題,相較于之前,寫入速度提升了數十倍。查詢數據在以月為單位的時間范圍內沒有過于明顯的延遲,整體的數據壓縮比大概是1/10,目前每天產生的數據量在數G左右。
- 流水數據查詢

查詢某(mou)一時(shi)間段內的流(liu)水數據,使用查詢語句:
SELECT datagettime as ts , ${dataName} as data FROM ${tableName}
<where>
uuid = ${uuid}
<if test="startTime != null ">
and datagettime > #{startTime}
</if>
<if test="endTime != null ">
and #{endTime} > datagettime
</if>
and ${dataName} is not null
</where>
limit 0, ${countLimit}
- 聚合函數計算一天的數據

使用(yong)(yong) TDengine 的函數(shu)計算每天的用(yong)(yong)電量,再通過每天的去(qu)計算月和年數(shu)據(ju),查(cha)詢語句為(wei):
select diff(${dataName}) as data
from ${tableName}
where ${dataName} > 0
and datagettime > #{startTime}
and #{endTime} >= datagettime
- 計算某一時間段內的數據

select ${method}(${dataName}) as data
from ${tableName}
where uuid = ${uuid}
and datagettime > #{startTime}
and #{endTime} > datagettime;
寫在最后
在工業互聯網(wang)快速發(fa)展的(de)(de)(de)大背景下,工業生產(chan)現場(chang)投(tou)放了(le)大量(liang)的(de)(de)(de)設(she)備傳感器和(he)監控(kong)系統(tong),二者提供的(de)(de)(de)實(shi)時數據(ju)能夠(gou)反映設(she)備的(de)(de)(de)狀態和(he)生產(chan)的(de)(de)(de)進度,其(qi)中的(de)(de)(de)大多數據(ju)都是按(an)照時間順(shun)序(xu)形成的(de)(de)(de)實(shi)時數據(ju),這些海量(liang)實(shi)時數據(ju)有(you)著多樣(yang)化的(de)(de)(de)分析需求和(he)重要的(de)(de)(de)參(can)考價值。
未來希望 TDengine 可以(yi)提供更復(fu)雜(za)的(de)流式(shi)計算、查詢分析(xi)以(yi)及監(jian)測預警(jing)等能力(li),可以(yi)為產品的(de)可視化(hua)運維、預測性(xing)維護、遠程智能管理(li)等方(fang)面提供數據(ju)依據(ju),從而(er)降低人(ren)員、時間等成(cheng)本,加速工業化(hua)與信息(xi)化(hua)的(de)深度融合,促進(jin)復(fu)雜(za)重(zhong)型裝備制造(zao)業的(de)轉型升(sheng)級,產生社會經(jing)濟(ji)效益。


























