泛能網(wǎng)能碳產(chǎn)業(yè)智能平臺作為新奧數(shù)能科技有限公司打造的一體化智能平臺,服務(wù)于公建、工廠、園區(qū)等場景,旨在通過物聯(lián)網(wǎng)、大數(shù)據(jù)與人工智能技術(shù),實(shí)現(xiàn)能源設(shè)備的實(shí)時(shí)監(jiān)控、運(yùn)營管理與能碳分析。隨著客戶規(guī)模擴(kuò)大與數(shù)據(jù)量激增,平臺面臨海量設(shè)備數(shù)據(jù)采集、高并發(fā)查詢、長期存儲及指標(biāo)計(jì)算準(zhǔn)確性等多重挑戰(zhàn)。平臺原先基于 OpenTSDB 的架構(gòu)已無法滿足業(yè)務(wù)發(fā)展需求,尤其在數(shù)據(jù)處理及時(shí)性、準(zhǔn)確性與資源成本方面存在明顯瓶頸。通過引入 TDengine 時(shí)序數(shù)據(jù)庫,平臺實(shí)現(xiàn)了從任務(wù)調(diào)度到流式計(jì)算的架構(gòu)升級,數(shù)據(jù)處理性能顯著提升,計(jì)算時(shí)效性最高提升 100 倍,計(jì)算時(shí)長縮短 2-8 倍,客戶投訴率幾乎降為零,同時(shí)服務(wù)器資源從原先的十多臺物理機(jī)大幅縮減,整體運(yùn)維成本顯著降低。
泛能網(wǎng)平臺自 2018 年啟動建設(shè)以來,已服務(wù)超過 5000 家客戶,每客戶平均接入約 50 臺設(shè)備,每臺設(shè)備每分鐘采集 10-20 個(gè)數(shù)據(jù)點(diǎn),系統(tǒng)每秒數(shù)據(jù)處理量(TPS)高達(dá) 9 萬。隨著業(yè)務(wù)擴(kuò)展,以 OpenTSDB 為基礎(chǔ)的架構(gòu)平臺在數(shù)據(jù)采集、存儲、查詢和計(jì)算方面面臨嚴(yán)峻挑戰(zhàn):
基于上述痛點(diǎn),平臺在數(shù)據(jù)庫選型中設(shè)定了明確目標(biāo):支持高并發(fā)寫入與查詢、具備高效壓縮與長期存儲能力、支持流式計(jì)算與實(shí)時(shí)處理、具備良好的擴(kuò)展性與運(yùn)維便利性。在對比了多款時(shí)序數(shù)據(jù)庫(Timeseries Database)后,項(xiàng)目初期我們選擇使用了 TDengine TSDB 2.x 的社區(qū)版本,社區(qū)版本在集群高可用、性能方面可以很好支撐業(yè)務(wù)平穩(wěn)運(yùn)行。但我們在使用 2.x 社區(qū)版本中遇到幾個(gè)問題:
基于以上幾點(diǎn),為了保障未來業(yè)務(wù)穩(wěn)定運(yùn)行,我們決定升級到 TDengine TSDB 3.3.6.x 的企業(yè)版穩(wěn)定版本。
平臺采用“采算分離”架構(gòu),物聯(lián)網(wǎng)平臺負(fù)責(zé)數(shù)據(jù)采集,TDengine 時(shí)序數(shù)據(jù)庫(Timeseries Database)作為核心存儲與計(jì)算引擎,配合流式計(jì)算模塊實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)處理。

平臺基于 TDengine TSDB 的超級表與子表模型進(jìn)行建模:

面對千億級歷史數(shù)據(jù)、新舊數(shù)據(jù)模型差異以及在線業(yè)務(wù)零中斷的核心要求,我們設(shè)計(jì)了一套灰度遷移與數(shù)據(jù)同步方案。整個(gè)遷移過程分為三個(gè)階段:新版本測試驗(yàn)證、歷史數(shù)據(jù)遷移、灰度切換與流量遷移。全程采用漸進(jìn)式灰度策略,確保業(yè)務(wù)平穩(wěn)過渡。
第一階段:新版本測試驗(yàn)證
我們在 TDengine TSDB 3.x 企業(yè)版集群中測試驗(yàn)證業(yè)務(wù)應(yīng)用是否正常工作,需要升級 taosjdbc driver 版本至 TDengine TSDB 3.x。其他業(yè)務(wù) SQL 無需修改,與 TDengine TSDB 2.x 版本保持一致。
第二階段:歷史數(shù)據(jù)遷移
歷史數(shù)據(jù)規(guī)模龐大,且需保證遷移過程中不影響線上查詢性能。我們放棄了傳統(tǒng)的數(shù)據(jù)導(dǎo)出-導(dǎo)入方式,而是采用 TDengine TSDB企業(yè)版工具 taosX 進(jìn)行在線熱遷移。該工具支持從 TDengine TSDB 2.x 集群直接向 3.x 集群同步數(shù)據(jù),具備斷點(diǎn)續(xù)傳、增量同步和一致性校驗(yàn)?zāi)芰Α?/p>
具體步驟如下:
整個(gè)遷移過程在業(yè)務(wù)低峰期執(zhí)行,并通過監(jiān)控平臺實(shí)時(shí)觀測源集群與目標(biāo)集群的負(fù)載、延遲及錯(cuò)誤率,確保系統(tǒng)穩(wěn)定。
第三階段:灰度切換與流量遷移
數(shù)據(jù)同步完成后,我們通過可配置的路由開關(guān)逐步將客戶請求導(dǎo)向新集群:
通過上述分階段、灰度化的遷移方案,我們實(shí)現(xiàn)了千萬級測點(diǎn)、千億條數(shù)據(jù)的平滑遷移,全程業(yè)務(wù)無感知,客戶查詢零中斷。遷移過程中積累的模型映射腳本、驗(yàn)證工具和監(jiān)控方案,也為后續(xù)其他業(yè)務(wù)的數(shù)據(jù)遷移提供了重要模板。

從最初的選擇 OpenTSDB,到我們面臨種種挑戰(zhàn),決定進(jìn)行新一輪的數(shù)據(jù)庫選型,這一路走來充滿了思考與抉擇。2018 年到 2022 年,OpenTSDB 在我們私有化場景中的表現(xiàn)曾一度支撐著我們的系統(tǒng),但隨著業(yè)務(wù)的不斷擴(kuò)展,問題也接踵而至——高昂的部署成本、復(fù)雜的運(yùn)維難題,讓我們不得不尋求新的解決方案。
正是在這個(gè)關(guān)鍵時(shí)刻,TDengine 走入了我們的視野。初次接觸 TDengine 時(shí),我們帶著試探的心態(tài),先在私有化場景中做了嘗試。出乎意料的是,它不僅幫助我們降低了部署和運(yùn)維成本,還讓我們對未來充滿了信心。于是 2023 年 6 月,我們正式啟動了平臺的全面切換,將 TDengine 應(yīng)用到核心生產(chǎn)環(huán)境。
TDengine TSDB 在泛能網(wǎng)平臺中的成功應(yīng)用,為系統(tǒng)性能與運(yùn)維效率帶來顯著提升。未來,團(tuán)隊(duì)將持續(xù)關(guān)注 TDengine TSDB 新版本功能,進(jìn)一步探索其在邊緣計(jì)算、多級存儲、實(shí)時(shí)分析等場景中的深度應(yīng)用,推動平臺向更智能、更高效的方向演進(jìn)。
新奧數(shù)能科技有限公司成立于 2018 年,隸屬于新奧集團(tuán),專注于能源行業(yè)智能化平臺研發(fā)與運(yùn)營,致力于通過物聯(lián)網(wǎng)、大數(shù)據(jù)與人工智能技術(shù),為客戶提供一體化的能碳管理與運(yùn)維解決方案。泛能網(wǎng)依托新奧集團(tuán)深厚的產(chǎn)業(yè)實(shí)踐,以泛能理念為牽引,聚焦能源數(shù)智化,圍繞 3100 萬家庭用戶、27 萬工商業(yè)客戶、260 個(gè)城市燃?xì)忭?xiàng)目積累了豐富的應(yīng)用場景。
龔恒星
]]>一家工廠有三十臺壓縮機(jī),每臺都接了溫度、壓力、振動三個(gè)測點(diǎn)。三個(gè)月下來,積累了上千萬條數(shù)據(jù)。當(dāng)工藝主任想看”這些壓縮機(jī)在哪個(gè)工況區(qū)間運(yùn)行得最多”時(shí),他發(fā)現(xiàn)所有監(jiān)控面板上只有折線圖和柱狀圖——它們能告訴他某天下午的溫度峰值,卻回答不了”數(shù)據(jù)整體是怎么分布的”。
這不是折線圖的問題,而是不同圖表類型有各自擅長回答的問題。TDengine IDMP v1.0.19 起在可視化面板中支持熱力圖(Heatmap),讓工業(yè)數(shù)據(jù)分析多了一種組織信息的維度:把兩個(gè)屬性各自分桶,統(tǒng)計(jì)落在每對桶區(qū)間里的樣本數(shù)量,用顏色深淺呈現(xiàn)密度分布,讓設(shè)備運(yùn)行真相浮現(xiàn)。
工業(yè)監(jiān)控中最常見的圖表類型,各自有明確的適用邊界:
折線圖擅長回答”趨勢”——溫度在上升還是下降。柱狀圖擅長回答”比較”——A 泵和 B 泵這個(gè)月的總能耗差多少。散點(diǎn)圖擅長回答”關(guān)系”——轉(zhuǎn)速升高時(shí)振動是不是也在變大。
這些圖表的共同點(diǎn)是:它們都在按時(shí)間維度組織數(shù)據(jù)。折線圖是”值隨時(shí)間變化”,柱狀圖是”按時(shí)間段匯總”,散點(diǎn)圖雖然兩個(gè)軸都可以是屬性,但每個(gè)點(diǎn)還是一個(gè)時(shí)刻的采樣。
熱力圖換了一種組織方式:把兩個(gè)屬性維度同時(shí)展開,看數(shù)據(jù)在二維空間里的密度分布。 它不關(guān)心某個(gè)時(shí)刻發(fā)生了什么,它關(guān)心所有的歷史數(shù)據(jù)點(diǎn)在兩個(gè)屬性的交叉空間中是怎么聚集的。
舉個(gè)例子。一臺變速設(shè)備,轉(zhuǎn)速在 300-1200 之間變化,載荷在 20-100% 之間波動。三個(gè)月運(yùn)行下來,你想要回答:”它在哪個(gè)轉(zhuǎn)速-載荷組合區(qū)間運(yùn)行的時(shí)間最長?”這個(gè)問題用折線圖是無解的——轉(zhuǎn)速和載荷各是一條隨時(shí)間變化的線,兩條線在時(shí)間上的關(guān)系可以大致感知,但它們在整個(gè)歷史中的聯(lián)合分布,折線圖表達(dá)不了。柱狀圖也無能為力——兩個(gè)連續(xù)變量交叉產(chǎn)生的區(qū)間數(shù)量太多,不可能用一組柱子表達(dá)清楚。
熱力圖的處理方式是把轉(zhuǎn)速分成若干個(gè)桶(比如每 100 轉(zhuǎn)一個(gè)桶),把載荷也分成若干個(gè)桶(每 10% 一個(gè)桶),統(tǒng)計(jì)每個(gè)交叉格子里落入了多少個(gè)數(shù)據(jù)樣本,然后用顏色深淺標(biāo)記出來。顏色最深的格子,就是設(shè)備運(yùn)行時(shí)間最長的工況區(qū)間。整個(gè)過程就是一個(gè)二維分桶統(tǒng)計(jì),沒有任何復(fù)雜算法,但它呈現(xiàn)的信息——”數(shù)據(jù)在二維空間中如何分布”——是前面幾種圖表都做不到的。
在 IDMP 中使用熱力圖,配置步驟很簡單:X 軸選一個(gè)屬性,Y 軸選另一個(gè)屬性,設(shè)定每個(gè)軸的分桶大小,選擇配色方案,加載數(shù)據(jù)即可。
兩個(gè)軸都可以自由選擇元素的任意屬性——轉(zhuǎn)速、溫度、壓力、振動、電流,也可以是時(shí)間維度。沒有誰必須是橫軸的限制,任意兩個(gè)屬性的交叉分析都支持。
分桶大小決定了熱力圖的分辨率。比如橫軸(轉(zhuǎn)速)每 100 轉(zhuǎn)一個(gè)桶,得到的是粗粒度的分布輪廓;每 20 轉(zhuǎn)一個(gè)桶,能看到更細(xì)的結(jié)構(gòu),但格子多了,對數(shù)據(jù)量的要求也更高。桶的粗細(xì)沒有絕對標(biāo)準(zhǔn),取決于分析目的——如果想看大致的工況集中區(qū),粗桶夠用;如果想定位某個(gè)共振轉(zhuǎn)速區(qū)間,需要細(xì)桶。分桶方式也有兩種選擇:按固定寬度分(每個(gè)桶覆蓋相同的數(shù)值范圍),或者按固定數(shù)量分(將整個(gè)數(shù)值范圍等分為指定數(shù)量的桶),后者適合快速控制熱力圖的整體密度。
配色方面,IDMP 支持多種深淺色系,從單色漸變到多色漸變都可以選。深色代表該格子內(nèi)樣本數(shù)量多,淺色代表樣本少甚至為零。

有幾個(gè)使用上的建議值得提一下:
熱力圖和趨勢圖是互補(bǔ)的,不是替代關(guān)系。 熱力圖擅長發(fā)現(xiàn)分布模式和異常聚集,但看不出變化的先后順序。如果你在熱力圖上發(fā)現(xiàn)某個(gè)轉(zhuǎn)速區(qū)間的溫度樣本異常集中,想了解這個(gè)現(xiàn)象是怎么發(fā)生的,還是要回到趨勢線上去看時(shí)間序列。
熱力圖的數(shù)據(jù)范圍會影響視覺效果。 因?yàn)轭伾成涫腔诋?dāng)前數(shù)據(jù)范圍內(nèi)的最小值和最大值自動計(jì)算的,如果數(shù)據(jù)中存在少量極端離群點(diǎn),會導(dǎo)致絕大部分正常數(shù)據(jù)都在很窄的顏色區(qū)間內(nèi),熱力圖的分布特征就看不清了。這時(shí)候適當(dāng)縮小查詢范圍或者過濾掉極端值,效果會更好。
分桶數(shù)量要跟數(shù)據(jù)量匹配。 桶分得太細(xì)而數(shù)據(jù)量不夠,大部分格子都是空的或者只有一兩個(gè)點(diǎn),熱力圖就變成了一張”稀疏噪聲圖”,看不到有意義的聚集模式。一般來說,大部分格子的樣本數(shù)應(yīng)該在幾十到幾千之間,太密或太疏都不利于讀出信息。
數(shù)值跨量級時(shí)考慮對數(shù)刻度。 有些傳感器數(shù)據(jù)的變化范圍跨越多個(gè)數(shù)量級——比如微量泄漏時(shí)的流速和正常流量差了三個(gè)數(shù)量級。線性刻度下,小值區(qū)間的所有數(shù)據(jù)會被擠在底部幾行格子里,完全無法分辨。切換到對數(shù)刻度后,每個(gè)數(shù)量級獲得均等的垂直空間,高頻小值和稀疏大值都能被看清。
過濾稀疏格子讓熱點(diǎn)更突出。 熱力圖中通常散布著大量計(jì)數(shù)為 1 或 2 的零星格子——它們不代表任何有意義的模式,只是噪聲。隱藏這些低計(jì)數(shù)格子后,真正的聚集區(qū)會更加醒目。同時(shí)適當(dāng)給格子之間留一點(diǎn)縫隙,也能讓每個(gè)格子的顏色更容易被獨(dú)立辨識。
一臺電機(jī)的電流和繞組溫度存在自然的對應(yīng)關(guān)系:電流越大,溫度應(yīng)該越高,冷卻系統(tǒng)正常情況下,兩者應(yīng)該保持一個(gè)大致的正比關(guān)系。如果這種對應(yīng)關(guān)系被打破——比如電流不高但溫度很高——就說明冷卻出了問題。
X 軸選電流(每 5A 一個(gè)桶),Y 軸選溫度(每 3°C 一個(gè)桶),加載過去一周的數(shù)據(jù)。正常情況下,熱力圖的深色區(qū)域會沿對角線分布:低電流對應(yīng)低溫,高電流對應(yīng)高溫。如果深色區(qū)域整體向上偏移——電流中等但溫度偏高——說明設(shè)備在同樣的負(fù)載下比之前更熱了,冷卻效率可能在下降。如果深色區(qū)域變得分散、不再有明顯的對角線形態(tài),說明電流和溫度之間的對應(yīng)關(guān)系在變?nèi)酰赡芤馕吨鴾囟仁艿搅似渌蛩兀ōh(huán)境、潤滑、機(jī)械摩擦)的干擾。
這種二維對應(yīng)關(guān)系在折線圖上很難判斷——電流和溫度是兩條獨(dú)立的線,你看到它們都在波動,但兩條線之間的”匹配程度”靠人眼幾乎無法量化。熱力圖把兩者的關(guān)系壓成一張密度圖,對應(yīng)關(guān)系是否成立、是否在發(fā)生變化,一眼就能判斷。
一個(gè)車間有二十臺同型號電機(jī),每臺都有繞組溫度測點(diǎn)。車間主任想快速了解:這批電機(jī)的溫度分布有沒有差異?有沒有哪臺電機(jī)整體溫度偏高?
X 軸選溫度(每 3°C 一個(gè)桶),Y 軸選設(shè)備名稱,加載過去一周的數(shù)據(jù)。熱力圖會為每臺電機(jī)生成一行,行內(nèi)顏色深淺反映該電機(jī)在不同溫度區(qū)間的樣本量。正常設(shè)備深色集中在低溫區(qū)間,溫度偏高的設(shè)備深色集中在右側(cè)的高溫區(qū)間——哪臺電機(jī)有問題,一行掃過去就能看到。
如果某臺電機(jī)的深色區(qū)域明顯比其他電機(jī)偏右(溫度高出 5-10°C),即使最高溫度還沒有觸發(fā)告警閾值,也說明該電機(jī)存在異常。”整體偏高”的信號在逐一翻看折線圖時(shí)很容易被忽略,但在熱力圖上,同行設(shè)備并列對比,差異會被顏色直接放大。
某工廠運(yùn)維團(tuán)隊(duì)管理著上百臺設(shè)備,半年來積累了數(shù)千條告警記錄。運(yùn)維主管想知道:這些告警在時(shí)間上有沒有聚集規(guī)律?
X 軸選一天 24 小時(shí),Y 軸選一周七天,每個(gè)格子的顏色深淺代表該時(shí)段內(nèi)的告警總次數(shù)。熱力圖直接呈現(xiàn)出深色聚集區(qū)落在哪幾個(gè)格子上——比如星期一上午 8-10 點(diǎn)和星期六凌晨 3-5 點(diǎn)。
星期一上午的高發(fā)窗口對應(yīng)每周的開機(jī)啟動階段,設(shè)備經(jīng)歷周末停機(jī)后重新啟動,故障率天然偏高。星期六凌晨的高發(fā)窗口則對應(yīng)夜班人員最少的時(shí)段,小問題無人及時(shí)發(fā)現(xiàn)和處理,容易蔓延。運(yùn)維團(tuán)隊(duì)據(jù)此調(diào)整了巡檢排班,兩個(gè)月后重新生成熱力圖,深色窗口明顯變淺。
熱力圖不是什么新發(fā)明。生物信息學(xué)里用它看基因表達(dá)譜,氣象學(xué)里用它看溫度異常的時(shí)空分布,網(wǎng)站的運(yùn)維后臺里用它看用戶點(diǎn)擊熱區(qū)。它不在工業(yè)監(jiān)控軟件的默認(rèn)圖表列表里,不是因?yàn)閷?shí)現(xiàn)不了,而是工業(yè)場景過去對”分布”的需求不夠強(qiáng)烈。
數(shù)據(jù)量小的時(shí)候,分布分析靠人腦就夠了。”轉(zhuǎn)速一般就在 500 到 600 之間”——工程師憑經(jīng)驗(yàn)就說得出來,不需要一張圖來證明。但當(dāng)測點(diǎn)數(shù)量和數(shù)據(jù)頻率同時(shí)膨脹后,人對分布的直覺就跟不上了。你不可能憑記憶判斷一臺設(shè)備在過去三個(gè)月里的數(shù)百萬個(gè)采樣點(diǎn)是在哪個(gè)工況區(qū)間最密集,但這恰好是熱力圖一秒鐘就能呈現(xiàn)的東西。
熱力圖把早已在其他行業(yè)驗(yàn)證過的分布分析方法帶進(jìn)了工業(yè)場景。它做的不是任何復(fù)雜計(jì)算,就是一個(gè)二維分桶統(tǒng)計(jì)——但多一種組織數(shù)據(jù)的視角,有時(shí)候能讓人看到之前一直存在卻從未被注意到的規(guī)律。
熱力圖功能自 TDengine IDMP v1.0.19 起在可視化面板中正式可用。更多信息請?jiān)L問 idmpdocs.taosdata.com。
]]>在工業(yè)設(shè)備監(jiān)控領(lǐng)域,折線圖統(tǒng)治了三十年。溫度、壓力、振動、電流——所有的時(shí)序數(shù)據(jù),默認(rèn)的可視化方式就是一條曲線。但當(dāng)一臺電機(jī)的繞組溫度數(shù)據(jù)顯示在屏幕上時(shí),我們真正關(guān)心的往往不是”平均值是多少”,而是”這一個(gè)小時(shí)里,溫度是持續(xù)爬升還是瞬間沖高?波動是在擴(kuò)大還是在收窄?”
折線圖回答不了這些問題——或者說,它把答案藏在了密密麻麻的曲線里,需要經(jīng)驗(yàn)極其豐富的工程師盯著屏幕反復(fù)縮放、來回拖拽,才能隱約感知到”波動”的存在。
TDengine IDMP v1.0.19 起,我們在可視化面板中正式支持蠟燭圖(Candlestick Chart)。這不是為了多一種圖表類型的堆砌,而是試圖把”波動”從一個(gè)需要人工感知的模糊概念,變成一種可以直接閱讀的視覺語言。
折線圖的基本邏輯是:在每一個(gè)時(shí)間點(diǎn)上取一個(gè)值,然后把這些點(diǎn)連成一條線。它在過去三十年里一直是工業(yè)監(jiān)控的默認(rèn)選擇——當(dāng)數(shù)據(jù)采集頻率是每分鐘一次甚至更低時(shí),每個(gè)點(diǎn)都代表那一分鐘的狀態(tài),連起來就是直觀的趨勢,這沒有任何問題。
但今天的情況已經(jīng)變了。
高頻采集已經(jīng)成為工業(yè)現(xiàn)場的標(biāo)配。每秒一個(gè)點(diǎn)甚至毫秒級采樣,意味著過去”看一分鐘”的粒度現(xiàn)在可以拆成幾十份乃至數(shù)萬份。數(shù)據(jù)密度發(fā)生了數(shù)量級的變化,但分析習(xí)慣還沒有完全跟上——我們依然傾向于把數(shù)據(jù)拉成一條線,然后看它的走向。
問題在于:折線圖天然是”一個(gè)時(shí)刻一個(gè)值”的圖表。 它沒辦法同時(shí)表達(dá)”這一分鐘里發(fā)生了什么”和”下一分鐘里發(fā)生了什么”,它只能告訴你”這一分鐘取到的那個(gè)值”和”下一分鐘取到的那個(gè)值”連起來的方向。
當(dāng)數(shù)據(jù)密度足夠大之后,用戶真正想知道的往往不是”這個(gè)測點(diǎn)現(xiàn)在是 50 還是 51″,而是更細(xì)顆粒度的信息:
這些問題的共同特點(diǎn)是:它們關(guān)心的不是一個(gè)時(shí)刻的值,也不是一串時(shí)刻連起來的方向,而是在一個(gè)時(shí)間窗口內(nèi),數(shù)據(jù)的變化結(jié)構(gòu)和節(jié)奏。
折線圖回答不了這些問題。它把每個(gè)窗口里成百上千個(gè)數(shù)據(jù)點(diǎn)壓縮在一個(gè)單一的視覺元素里——一個(gè)點(diǎn),或者一段線。窗口內(nèi)的信息結(jié)構(gòu),在這個(gè)壓縮過程中被扁平化了。
蠟燭圖的價(jià)值就在于此:它用一個(gè)視覺元素,同時(shí)保留了一個(gè)窗口內(nèi)的四個(gè)關(guān)鍵位置——起點(diǎn)、終點(diǎn)、最高點(diǎn)和最低點(diǎn)。它不能替代折線圖,但它補(bǔ)充了折線圖天然缺失的那個(gè)維度:窗口內(nèi)的波動結(jié)構(gòu)。
蠟燭圖(Candlestick Chart)是金融領(lǐng)域已經(jīng)使用了數(shù)十年的圖表。它在每個(gè)時(shí)間窗口內(nèi)同時(shí)編碼四個(gè)關(guān)鍵數(shù)值:
把開-高-低-收(Open-High-Low-Close)這套邏輯移植到工業(yè)場景,語義映射是自然而直接的:
| 金融語義 | 工業(yè)語義 | 以電機(jī)繞組溫度為例(1 小時(shí)窗口) |
|---|---|---|
| 開盤價(jià) | 窗口起始值 | 本小時(shí)開始時(shí)刻的溫度讀數(shù) |
| 最高價(jià) | 窗口最大值 | 本小時(shí)內(nèi)的瞬時(shí)峰值溫度 |
| 最低價(jià) | 窗口最小值 | 本小時(shí)內(nèi)的最低溫度 |
| 收盤價(jià) | 窗口結(jié)束值 | 本小時(shí)結(jié)束時(shí)刻的溫度讀數(shù) |
一根蠟燭柱的視覺結(jié)構(gòu)很簡單:實(shí)體(較粗的柱身)表示起始值到結(jié)束值的范圍,影線(上下伸出的細(xì)線)表示窗口內(nèi)觸達(dá)過的極值。當(dāng)查看的時(shí)間跨度很長、蠟燭非常密集時(shí),也可以切換為更簡潔的 SPVE Bars 樣式——每根蠟燭縮成一條細(xì)豎線加短橫標(biāo)記,犧牲一些視覺辨識度換取更高的信息密度,適合快速掃讀長期趨勢。
這個(gè)結(jié)構(gòu)在工業(yè)場景中天然對應(yīng)三種波動模式:
模式一:實(shí)體長、影線短。 窗口內(nèi)發(fā)生了顯著的凈變化,但極值沒有大幅偏離起點(diǎn)和終點(diǎn)。也就是說,參數(shù)在窗口時(shí)間內(nèi)穩(wěn)步變化,沒有劇烈震蕩。這是”趨勢型窗口”——設(shè)備在穩(wěn)定地向某個(gè)方向偏移,最值得關(guān)注的是偏移的速度和方向。
模式二:實(shí)體短、影線長。 窗口內(nèi)的凈變化很?。ㄗ罱K回到了起點(diǎn)附近),但中間觸碰過遠(yuǎn)離起點(diǎn)的極值。也就是說,窗口內(nèi)發(fā)生了一次”沖擊-恢復(fù)”事件。這是”瞬態(tài)事件窗口”——參數(shù)短暫偏離后系統(tǒng)(或操作員)將其拉回,最值得關(guān)注的是沖擊的頻率和幅度是否在變化。
模式三:實(shí)體和影線整體較大且持續(xù)擴(kuò)張。 窗口內(nèi)的波動幅度在逐窗口增加。這是”劣化窗口”——系統(tǒng)的穩(wěn)定性正在下降,最值得關(guān)注的是球還在滾,到底滾多快。
這三種模式在折線圖上都需要靠人工”放大、拖拽、目測”來識別。而蠟燭圖上,一眼望去就能區(qū)分:長實(shí)體的是趨勢型,長影線的是沖擊型,整體變高的需要關(guān)注劣化速度。

用以下四個(gè)示例場景來說明蠟燭圖在工業(yè)場景的典型應(yīng)用。請注意,這里并不是說這些場景下折線圖完全沒用——而是說,只用折線圖會漏掉一些關(guān)鍵信號,而這些信號用蠟燭圖恰好能捕捉到。
背景:一臺大型電機(jī)的繞組溫度被實(shí)時(shí)監(jiān)測。折線圖顯示”過去一周溫度偶爾沖到過 70°C”,但無法判斷這是持續(xù)過載還是偶發(fā)沖擊。
用折線圖容易漏掉什么:
如果一個(gè)小時(shí)窗口內(nèi),溫度在 50°C 的基礎(chǔ)上出現(xiàn)了一次 3 分鐘的瞬時(shí) 72°C 尖峰,然后迅速恢復(fù)到 52°C,折線圖上這一小時(shí)就是一條線,用戶看到這條線的走勢,很難意識到中間發(fā)生過一次只持續(xù)了 3 分鐘的沖擊——尖峰被窗口內(nèi)其余 57 分鐘的正常數(shù)據(jù)淹沒掉了。工程師看到一條平穩(wěn)的曲線,得出”溫度正常”的結(jié)論,但實(shí)際上電機(jī)可能經(jīng)歷了數(shù)次短暫的過載沖擊。
蠟燭圖能看到什么:
同一個(gè)小時(shí)窗口,蠟燭圖會呈現(xiàn)為”短實(shí)體 + 極長上影線”的形態(tài)。實(shí)體短說明窗口內(nèi)整體溫度并未顯著變化,溫度在窗口結(jié)束時(shí)基本回到起點(diǎn);上影線極長說明中間出現(xiàn)了瞬時(shí)高溫。如果這種形態(tài)每隔幾個(gè)小時(shí)出現(xiàn)一次,且間隔均勻,就可以進(jìn)一步推斷沖擊是否與特定的運(yùn)行操作相關(guān)。
這個(gè)信息幫助做什么決策:如果溫度異常是”長實(shí)體”(持續(xù)升溫),優(yōu)先排查冷卻系統(tǒng);如果是”長影線”(間歇沖擊),優(yōu)先排查負(fù)載突變、操作工序或潤滑狀態(tài)。兩種形態(tài)指向的維修動作完全不同。
背景:旋轉(zhuǎn)設(shè)備的振動傳感器在大部分時(shí)間里讀數(shù)正常,但軸承保持架出現(xiàn)微小碎裂后,滾動體每經(jīng)過一次碎裂位置,就會產(chǎn)生一個(gè)瞬時(shí)振動尖峰,其余時(shí)間振動依然正常。
用折線圖容易漏掉什么:
在 30 分鐘的折線圖里,這個(gè)尖峰只是一條線上一個(gè)不起眼的小凸起——因?yàn)槠溆?29 分 59 秒的數(shù)據(jù)都是正常的,一次瞬時(shí)尖峰在視覺上幾乎被正常的基線吞沒了。即使注意到了這個(gè)凸起,也無法判斷這是一個(gè)孤立事件還是規(guī)律性沖擊的開始——要回答這個(gè)問題,需要反復(fù)縮放、逐窗口對比,在折線圖上是極其耗時(shí)的工作。
蠟燭圖能看到什么:
以 30 分鐘為窗口,蠟燭圖在大多數(shù)窗口呈現(xiàn)為正常的矮柱。但每隔若干個(gè)窗口,會出現(xiàn)一個(gè)”極短實(shí)體 + 極長影線”的柱子——實(shí)體正常說明整體振動水平未惡化,影線突兀說明有一個(gè)瞬時(shí)沖擊。如果這種形態(tài)的柱子以規(guī)律間隔反復(fù)出現(xiàn),就和”滾動體經(jīng)過碎裂位置”的物理模型高度吻合。
這個(gè)信息幫助做什么決策:在振動基準(zhǔn)值還未明顯上升的早期階段(FMEA 意義上的”潛在故障期”),就發(fā)現(xiàn)軸承損傷的存在,且可以通過沖擊間隔 × 轉(zhuǎn)速反推損傷位置。這比等待振動基準(zhǔn)值整體抬升再報(bào)警,至少要早一個(gè)維護(hù)窗口。
背景:管道壓力在正常范圍內(nèi)波動,但偶爾出現(xiàn)快速的壓力下降后恢復(fù)。傳統(tǒng)趨勢圖上,這些事件表現(xiàn)為”一根向下的刺”。
用折線圖容易漏掉什么:
壓力驟降事件在折線圖上就是一個(gè) V 形尖刺。多個(gè) V 形尖刺看起來都差不多,但背后的物理原因可能完全不同。一次是安全閥正常開啟后迅速回座,一次是法蘭微漏導(dǎo)致的持續(xù)壓力衰減——在縮小的趨勢圖上,它們都是”向下跳了一下”。區(qū)分它們需要逐次放大查看每個(gè)事件的細(xì)節(jié),對于一天幾十次波動的大型管網(wǎng)來說,這是不現(xiàn)實(shí)的。
蠟燭圖能看到什么:
安全閥動作會呈現(xiàn)為”短實(shí)體 + 長下影線”——窗口結(jié)束時(shí)壓力已經(jīng)恢復(fù)到接近窗口開始的位置,中間的低壓只是一次瞬態(tài)釋放。而持續(xù)泄漏則呈現(xiàn)為”實(shí)體逐根下移”——每個(gè)窗口的收盤都低于開盤,雖然每根柱子的跌幅不大,但累積趨勢明確向下。
如果進(jìn)一步切換著色策略——從默認(rèn)的”窗口內(nèi)比較”改為”跨窗口比較”,將當(dāng)前窗口的終止值與上一窗口的終止值做對比來決定蠟燭顏色——連續(xù)下降的窗口序列就會呈現(xiàn)為一串刺眼的紅色,趨勢惡化方向一目了然。這種跨窗口視角對于需要快速判斷”情況是在好轉(zhuǎn)還是在惡化”的運(yùn)維場景尤其有用。
這個(gè)信息幫助做什么決策:維護(hù)工程師可以根據(jù)”長下影線”的出現(xiàn)頻率,量化安全閥的動作次數(shù),直接用于預(yù)防性維修排程。同時(shí),跨周期著色讓連續(xù)惡化的趨勢自動高亮,快速區(qū)分”安全閥正常動作”和”疑似泄漏”,將有限的巡檢資源優(yōu)先投入到后者。
背景:化工、制藥、食品飲料行業(yè)的批次生產(chǎn)過程,每個(gè)批次持續(xù)數(shù)小時(shí)到數(shù)天,關(guān)鍵工藝參數(shù)(反應(yīng)溫度、發(fā)酵 pH、滅菌溫度等)在批次內(nèi)持續(xù)變化。質(zhì)量部門通常關(guān)注的是批次之間的均值是否一致,但往往忽略了批次內(nèi)的波動差異。
用折線圖容易漏掉什么:
在一條趨勢線上疊加 50 個(gè)批次的溫度曲線,得到的是 50 條糾纏在一起的線,根本無法閱讀。通常的做法是每個(gè)批次只取一個(gè)均值或最終值,畫成一根柱狀圖——這樣可以看到批次間的差異,但完全丟失了批次內(nèi)的波動信息。一個(gè)在批次內(nèi)前半段高溫、后半段低溫的異常批次,其均值和一個(gè)全程平穩(wěn)的正常批次可能完全相同。
蠟燭圖能看到什么:
每個(gè)批次用一根蠟燭柱來表示:Open 是批次開始時(shí)的參數(shù)值,Close 是批次結(jié)束時(shí)的值,High/Low 是批次過程中的極值。50 個(gè)批次就是 50 根蠟燭柱,一字排開。正常批次的蠟燭柱高度(High ? Low)集中在某個(gè)狹窄范圍內(nèi);異常批次的蠟燭柱會明顯偏離——要么整體更高(批次內(nèi)波動大),要么實(shí)體顏色異常(批次內(nèi)趨勢方向反轉(zhuǎn)),要么出現(xiàn)在正常集群之外(孤立偏離)。
除了 OHLC 四個(gè)值之外,每個(gè)窗口內(nèi)的采樣數(shù)量本身也是一個(gè)有價(jià)值的信號。把蠟燭柱和每批次的樣本量柱并排展示時(shí),樣本量異常的批次會立刻暴露——采樣過少可能意味著該批次數(shù)據(jù)采集不完整,而樣本量異常偏高則可能暗示批次周期被意外拉長。這些信息在只看均值的柱狀圖上完全不可見。
這個(gè)信息幫助做什么決策:蠟燭柱高度可以作為一個(gè)新的過程穩(wěn)定性指標(biāo)——即使批次均值在規(guī)格限內(nèi),如果蠟燭柱高度在連續(xù)擴(kuò)大,說明批次內(nèi)的可控性在惡化;如果某批次的樣本量明顯偏離常規(guī)值,需要回溯該批次的數(shù)據(jù)采集過程是否正常。這些判斷不需要等到出現(xiàn)不合格批次再被動追溯。
蠟燭圖在金融市場已經(jīng)存在了數(shù)百年。在技術(shù)上,工業(yè)軟件實(shí)現(xiàn)一個(gè)蠟燭圖表沒有任何障礙——前端圖表庫早已支持,可視化代碼開發(fā)起來也并不難。
那為什么之前沒有人把它搬到工業(yè)場景?不是因?yàn)榧夹g(shù)門檻,而是因?yàn)?strong>數(shù)據(jù)環(huán)境沒有走到那一步。
十年前,大多數(shù)工業(yè)現(xiàn)場的數(shù)據(jù)采集頻率是每分鐘一次甚至更低。一個(gè)小時(shí)的窗口里只有 60 個(gè)數(shù)據(jù)點(diǎn),取最大值和取最小值的差距可能就三五個(gè)工程單位,折線圖已經(jīng)足夠用。在這種低密度數(shù)據(jù)環(huán)境下,蠟燭圖的優(yōu)勢——捕捉窗口內(nèi)的波動結(jié)構(gòu)——幾乎沒有施展空間。
但現(xiàn)在不同了。高頻采集(每秒甚至毫秒級)已經(jīng)成為標(biāo)配,一個(gè)小時(shí)的窗口里有幾千甚至幾萬個(gè)數(shù)據(jù)點(diǎn)。數(shù)據(jù)密度發(fā)生了數(shù)量級的變化,用戶關(guān)心的粒度也在變細(xì)——不是”過去一周溫度有沒有超限”,而是”今天下午 3 點(diǎn)到 4 點(diǎn)之間,溫度的波動模式跟平時(shí)有什么不同”。這種對更小窗口、更細(xì)波動結(jié)構(gòu)的關(guān)注,是數(shù)據(jù)密度提升之后自然產(chǎn)生的分析需求。
與此同時(shí),工業(yè)數(shù)據(jù)分析的深度也在變化。過去看數(shù)據(jù)是為了”知道現(xiàn)在是多少”,現(xiàn)在看數(shù)據(jù)是為了”預(yù)判接下來會怎樣”。預(yù)測性維護(hù)、過程能力分析、異常根因追溯——這些場景需要的不是更多的數(shù)據(jù)點(diǎn),而是更多的數(shù)據(jù)維度。波動性本身,從一個(gè)可有可無的附注,變成了一個(gè)具有獨(dú)立診斷價(jià)值的信息維度。
蠟燭圖在工業(yè)領(lǐng)域的價(jià)值,不是因?yàn)樗且环N新圖表,而是因?yàn)楣I(yè)數(shù)據(jù)終于走到了需要它的階段。 當(dāng)數(shù)據(jù)密度和分析深度同時(shí)越過某個(gè)閾值后,蠟燭圖這種”一個(gè)窗口四個(gè)維度”的壓縮表達(dá)方式,就從金融領(lǐng)域的專屬工具,變成了工業(yè)領(lǐng)域順理成章的選擇。
IDMP 在這個(gè)時(shí)間點(diǎn)引入蠟燭圖,不是因?yàn)槲覀冊趫D表類型上追求差異化,而是因?yàn)槲覀兛吹焦I(yè)用戶已經(jīng)在面臨這樣的困境:數(shù)據(jù)越來越多,但看到的維度并沒有越來越多。蠟燭圖是幫用戶把”波動性”這個(gè)隱藏維度重新拉回到視野里的一條有效路徑。
蠟燭圖功能自 TDengine IDMP v1.0.19 起在可視化面板中正式可用。更多信息請?jiān)L問 idmpdocs.taosdata.com。
]]>TDgpt并非一個(gè)獨(dú)立的外部工具,而是深度集成在時(shí)序數(shù)據(jù)庫內(nèi)部的AI分析引擎。傳統(tǒng)上,企業(yè)進(jìn)行時(shí)序數(shù)據(jù)分析需要經(jīng)歷繁瑣的流程:先從時(shí)序數(shù)據(jù)庫中導(dǎo)出數(shù)據(jù),再導(dǎo)入到Python或R環(huán)境中,接著進(jìn)行數(shù)據(jù)清洗、特征工程、模型訓(xùn)練和調(diào)優(yōu),最后才能得出分析結(jié)果。這一過程不僅耗時(shí)耗力,還面臨著數(shù)據(jù)一致性、安全性和實(shí)時(shí)性等諸多挑戰(zhàn)。
TDgpt徹底改變了這一現(xiàn)狀。作為時(shí)序數(shù)據(jù)庫原生支持的AI智能體,TDgpt直接在數(shù)據(jù)庫內(nèi)部執(zhí)行AI分析任務(wù),數(shù)據(jù)無需離開數(shù)據(jù)庫即可完成從存儲到分析的全流程。這種架構(gòu)設(shè)計(jì)不僅大幅降低了AI分析的門檻,還確保了數(shù)據(jù)處理的高效性和安全性。用戶無需掌握復(fù)雜的機(jī)器學(xué)習(xí)知識,也無需編寫冗長的Python腳本,只需使用熟悉的SQL語法,就能調(diào)用強(qiáng)大的AI分析能力。
TDgpt圍繞時(shí)序數(shù)據(jù)的典型分析需求,構(gòu)建了三項(xiàng)核心能力,全面覆蓋企業(yè)在實(shí)際業(yè)務(wù)中的AI分析場景。
時(shí)序預(yù)測是TDgpt最突出的能力之一?;谏疃葘W(xué)習(xí)模型,TDgpt能夠自動學(xué)習(xí)歷史數(shù)據(jù)中的時(shí)間依賴關(guān)系,對未來趨勢進(jìn)行精準(zhǔn)預(yù)測。無論是設(shè)備傳感器的未來讀數(shù)、服務(wù)器資源的使用趨勢,還是業(yè)務(wù)指標(biāo)的發(fā)展走向,TDgpt都能提供可靠的預(yù)測結(jié)果。更重要的是,TDgpt內(nèi)置了自動特征工程能力,能夠自動識別數(shù)據(jù)中的周期性、趨勢性和季節(jié)性特征,無需用戶手動配置。
在工業(yè)監(jiān)控和運(yùn)維場景中,及時(shí)發(fā)現(xiàn)數(shù)據(jù)異常至關(guān)重要。TDgpt的異常檢測功能能夠自動學(xué)習(xí)正常數(shù)據(jù)的分布模式,當(dāng)新數(shù)據(jù)偏離正常范圍時(shí)自動標(biāo)記異常。相比傳統(tǒng)的基于閾值的告警方式,TDgpt的智能異常檢測能夠適應(yīng)數(shù)據(jù)的動態(tài)變化,大幅降低誤報(bào)率和漏報(bào)率,幫助運(yùn)維人員聚焦于真正需要關(guān)注的問題。
實(shí)際業(yè)務(wù)中,時(shí)序數(shù)據(jù)常常因?yàn)榫W(wǎng)絡(luò)故障、設(shè)備離線等原因出現(xiàn)缺失。TDgpt的數(shù)據(jù)補(bǔ)全功能能夠基于上下文信息,智能推斷缺失值,保證數(shù)據(jù)集的完整性。這一功能對于后續(xù)的分析建模尤為重要,避免了因數(shù)據(jù)缺失導(dǎo)致的分析偏差。
TDgpt最大的創(chuàng)新在于其極簡的使用方式。用戶僅需一條SQL語句,即可完成傳統(tǒng)上需要數(shù)小時(shí)甚至數(shù)天才能完成的AI分析任務(wù)。
SELECT _irowts, FORECAST(i, 'algo=tdtsf,period=100')
FROM meter
WHERE ts >= '2024-01-01' AND ts < '2024-06-01';
在這條SQL中,FORECAST函數(shù)調(diào)用TDgpt的時(shí)序預(yù)測能力,algo=tdtsf指定了預(yù)測算法,period=100設(shè)置了預(yù)測未來100個(gè)時(shí)間步。整個(gè)預(yù)測過程在數(shù)據(jù)庫內(nèi)部完成,結(jié)果直接以SQL查詢結(jié)果的形式返回。
SELECT _irowts, ANOMALY(i, 'algo=tdtsad,sensitivity=0.95')
FROM server_metrics
WHERE ts >= '2024-01-01' AND ts < '2024-02-01';
ANOMALY函數(shù)觸發(fā)異常檢測分析,sensitivity參數(shù)控制檢測的敏感度。查詢結(jié)果中,異常數(shù)據(jù)點(diǎn)會被自動標(biāo)記,方便用戶快速定位問題。
這種SQL驅(qū)動的AI分析模式,徹底打破了數(shù)據(jù)科學(xué)與數(shù)據(jù)庫工程之間的壁壘。數(shù)據(jù)分析師、運(yùn)維工程師和業(yè)務(wù)人員都可以直接使用熟悉的SQL語言,獲得專業(yè)級的AI分析能力。
TDgpt的強(qiáng)大能力源于其底層的技術(shù)架構(gòu)。TDgpt集成了多種先進(jìn)的深度學(xué)習(xí)模型,包括專門針對時(shí)序數(shù)據(jù)設(shè)計(jì)的Transformer架構(gòu)和時(shí)序分解網(wǎng)絡(luò)。這些模型經(jīng)過大規(guī)模時(shí)序數(shù)據(jù)集預(yù)訓(xùn)練,具備良好的泛化能力,能夠適應(yīng)不同行業(yè)和場景的數(shù)據(jù)特征。
自動特征工程是TDgpt的另一大技術(shù)亮點(diǎn)。傳統(tǒng)機(jī)器學(xué)習(xí)項(xiàng)目中,特征工程往往占據(jù)80%以上的工作量,且高度依賴專家經(jīng)驗(yàn)。TDgpt內(nèi)置的自動特征工程模塊能夠自動識別數(shù)據(jù)中的趨勢項(xiàng)、季節(jié)項(xiàng)和殘差項(xiàng),自動選擇最優(yōu)的特征組合,自動進(jìn)行數(shù)據(jù)歸一化和窗口切分。用戶無需關(guān)心底層的技術(shù)細(xì)節(jié),即可獲得經(jīng)過優(yōu)化的分析結(jié)果。
此外,TDgpt采用了模型即服務(wù)(Model-as-a-Service)的架構(gòu)設(shè)計(jì)。預(yù)訓(xùn)練模型直接部署在數(shù)據(jù)庫服務(wù)端,分析請求在數(shù)據(jù)庫內(nèi)部完成推理,避免了數(shù)據(jù)傳輸帶來的延遲和帶寬消耗。對于需要更高精度的場景,TDgpt也支持增量訓(xùn)練和模型微調(diào),在保護(hù)數(shù)據(jù)隱私的前提下實(shí)現(xiàn)模型定制。
TDgpt的AI分析能力已經(jīng)在多個(gè)行業(yè)得到廣泛應(yīng)用,以下是幾個(gè)典型的應(yīng)用場景。
在智能制造和工業(yè)物聯(lián)網(wǎng)場景中,設(shè)備的意外停機(jī)往往帶來巨大的經(jīng)濟(jì)損失。通過TDgpt的時(shí)序預(yù)測能力,企業(yè)可以基于設(shè)備傳感器的歷史數(shù)據(jù),預(yù)測關(guān)鍵部件的剩余壽命,提前安排維護(hù)計(jì)劃,實(shí)現(xiàn)從被動維修到主動預(yù)防的轉(zhuǎn)變。異常檢測功能則可以實(shí)時(shí)監(jiān)控設(shè)備運(yùn)行狀態(tài),在故障征兆出現(xiàn)的早期階段及時(shí)告警,為故障排查爭取寶貴時(shí)間。
在能源管理和智慧建筑領(lǐng)域,精準(zhǔn)的能耗預(yù)測對于優(yōu)化能源調(diào)度、降低運(yùn)營成本具有重要意義。TDgpt能夠分析歷史能耗數(shù)據(jù),結(jié)合時(shí)間、天氣、生產(chǎn)計(jì)劃等多維度信息,預(yù)測未來的能耗趨勢?;陬A(yù)測結(jié)果,企業(yè)可以制定更科學(xué)的能源采購策略,優(yōu)化設(shè)備運(yùn)行計(jì)劃,實(shí)現(xiàn)節(jié)能減排目標(biāo)。
在互聯(lián)網(wǎng)和金融領(lǐng)域,業(yè)務(wù)指標(biāo)的異常波動往往預(yù)示著潛在的問題或機(jī)會。TDgpt可以對網(wǎng)站流量、交易金額、用戶活躍度等核心業(yè)務(wù)指標(biāo)進(jìn)行實(shí)時(shí)監(jiān)控,自動識別異常波動并觸發(fā)告警。相比傳統(tǒng)的固定閾值告警,TDgpt的智能異常檢測能夠適應(yīng)業(yè)務(wù)的自然增長和周期性波動,提供更加精準(zhǔn)的監(jiān)控能力。
TDgpt的出現(xiàn),為時(shí)序數(shù)據(jù)的AI分析提供了一條全新的路徑。相比傳統(tǒng)的AI分析方案,TDgpt具有三大顯著優(yōu)勢。
無需數(shù)據(jù)導(dǎo)出。傳統(tǒng)方案需要將數(shù)據(jù)從時(shí)序數(shù)據(jù)庫導(dǎo)出到分析環(huán)境,不僅增加了數(shù)據(jù)泄露的風(fēng)險(xiǎn),還造成了數(shù)據(jù)一致性問題。TDgpt直接在數(shù)據(jù)庫內(nèi)部執(zhí)行分析,數(shù)據(jù)全程不落地,既安全又高效。
無需單獨(dú)訓(xùn)練模型。傳統(tǒng)機(jī)器學(xué)習(xí)項(xiàng)目需要經(jīng)歷數(shù)據(jù)準(zhǔn)備、模型選擇、超參數(shù)調(diào)優(yōu)等復(fù)雜流程,通常需要數(shù)周時(shí)間才能交付可用模型。TDgpt內(nèi)置預(yù)訓(xùn)練模型,開箱即用,將AI分析的交付周期從周級別縮短到分鐘級別。
零代碼AI分析。傳統(tǒng)方案通常需要數(shù)據(jù)科學(xué)家編寫復(fù)雜的Python代碼,業(yè)務(wù)人員難以直接使用。TDgpt通過SQL接口暴露AI能力,任何熟悉SQL的用戶都可以輕松調(diào)用,真正實(shí)現(xiàn)了AI分析的民主化。
時(shí)序數(shù)據(jù)庫正在從單純的數(shù)據(jù)存儲工具,演進(jìn)為具備智能分析能力的數(shù)據(jù)平臺。TDgpt作為這一演進(jìn)方向的代表性創(chuàng)新,通過將AI能力深度融入時(shí)序數(shù)據(jù)庫內(nèi)核,為企業(yè)提供了一種前所未有的高效、便捷、安全的時(shí)序數(shù)據(jù)分析方案。無論是工業(yè)設(shè)備的健康管理、能源系統(tǒng)的智能調(diào)度,還是互聯(lián)網(wǎng)業(yè)務(wù)的實(shí)時(shí)監(jiān)控,TDgpt都能幫助企業(yè)從海量時(shí)序數(shù)據(jù)中快速提取 actionable insights,驅(qū)動業(yè)務(wù)決策的智能化升級。
如果您的企業(yè)正在使用時(shí)序數(shù)據(jù)庫存儲海量傳感器數(shù)據(jù)或業(yè)務(wù)指標(biāo),不妨嘗試TDgpt的AI分析能力。只需一條SQL,即可開啟您的零代碼AI分析之旅,讓數(shù)據(jù)價(jià)值在指尖流動。
]]>在傳統(tǒng)的時(shí)序數(shù)據(jù)庫項(xiàng)目中,數(shù)據(jù)接入通常需要經(jīng)歷以下流程:開發(fā)人員首先需要理解目標(biāo)數(shù)據(jù)源的通信協(xié)議,然后編寫數(shù)據(jù)采集程序,接著實(shí)現(xiàn)協(xié)議解析與數(shù)據(jù)格式轉(zhuǎn)換,最后將轉(zhuǎn)換后的數(shù)據(jù)寫入數(shù)據(jù)庫。這一過程存在三大核心痛點(diǎn)。
開發(fā)工作量大:一個(gè)中型工業(yè)項(xiàng)目通常涉及5到10種不同的數(shù)據(jù)源協(xié)議。以O(shè)PC UA為例,開發(fā)人員需要引入專門的SDK庫、處理安全認(rèn)證、實(shí)現(xiàn)訂閱機(jī)制,僅完成一個(gè)數(shù)據(jù)源的對接就需要數(shù)百行代碼。如果項(xiàng)目同時(shí)涉及MQTT設(shè)備接入和Kafka消息消費(fèi),開發(fā)工作量將成倍增長。
運(yùn)維復(fù)雜度高:每個(gè)自研的采集程序都是獨(dú)立的運(yùn)維對象,需要單獨(dú)監(jiān)控運(yùn)行狀態(tài)、處理異常重連、管理日志輸出。當(dāng)數(shù)據(jù)源數(shù)量達(dá)到數(shù)十個(gè)甚至上百個(gè)時(shí),運(yùn)維團(tuán)隊(duì)面臨的挑戰(zhàn)不亞于管理一個(gè)微服務(wù)集群。
數(shù)據(jù)模型不統(tǒng)一:不同數(shù)據(jù)源的字段命名、數(shù)據(jù)類型、時(shí)間戳格式各不相同,開發(fā)人員需要手動編寫映射邏輯,將異構(gòu)數(shù)據(jù)統(tǒng)一為時(shí)序數(shù)據(jù)庫的表結(jié)構(gòu)。一旦上游數(shù)據(jù)源發(fā)生變更,映射代碼也需要同步修改,增加了維護(hù)成本。
TDengine通過taosAdapter組件提供了零代碼數(shù)據(jù)接入能力。taosAdapter是一個(gè)輕量級的數(shù)據(jù)接入網(wǎng)關(guān),內(nèi)置了對多種主流工業(yè)協(xié)議和物聯(lián)網(wǎng)協(xié)議的支持,用戶只需通過配置文件或管理界面完成數(shù)據(jù)源綁定,即可自動完成協(xié)議解析和數(shù)據(jù)寫入,無需編寫任何代碼。
作為連接外部數(shù)據(jù)源與時(shí)序數(shù)據(jù)庫之間的橋梁,taosAdapter承擔(dān)了三方面核心職責(zé):協(xié)議適配,將MQTT、Kafka、OPC UA等外部協(xié)議的數(shù)據(jù)格式轉(zhuǎn)換為數(shù)據(jù)庫可識別的寫入請求;數(shù)據(jù)模型映射,自動將外部數(shù)據(jù)點(diǎn)映射為超級表和子表的結(jié)構(gòu)化模型;并發(fā)寫入優(yōu)化,內(nèi)置批量聚合和寫入緩沖機(jī)制,在高并發(fā)場景下保障數(shù)據(jù)寫入性能。
該零代碼接入方案覆蓋了工業(yè)和物聯(lián)網(wǎng)領(lǐng)域最常用的數(shù)據(jù)通信協(xié)議,能夠滿足絕大多數(shù)場景的數(shù)據(jù)接入需求。
MQTT協(xié)議:作為物聯(lián)網(wǎng)領(lǐng)域最廣泛使用的輕量級消息協(xié)議,MQTT被大量傳感器和邊緣設(shè)備采用。taosAdapter內(nèi)置MQTT客戶端功能,支持訂閱指定Topic,將設(shè)備上報(bào)的JSON或自定義格式數(shù)據(jù)自動解析并寫入時(shí)序數(shù)據(jù)庫。用戶只需配置Broker地址、Topic名稱和目標(biāo)超級表,即可完成設(shè)備數(shù)據(jù)的自動接入。
Kafka協(xié)議:在企業(yè)級數(shù)據(jù)架構(gòu)中,Kafka常作為數(shù)據(jù)總線的核心組件。taosAdapter支持作為Kafka Consumer消費(fèi)指定Topic中的消息,支持JSON、InfluxDB行協(xié)議等多種消息格式的自動解析,適合已有Kafka基礎(chǔ)設(shè)施的企業(yè)快速完成數(shù)據(jù)入湖。
OPC UA協(xié)議:在工業(yè)自動化領(lǐng)域,OPC UA是設(shè)備互聯(lián)的事實(shí)標(biāo)準(zhǔn)。taosAdapter支持連接OPC UA服務(wù)器,訂閱節(jié)點(diǎn)數(shù)據(jù)變化,將工業(yè)設(shè)備的實(shí)時(shí)測量值自動采集到時(shí)序數(shù)據(jù)庫中。這一能力對于制造業(yè)、能源行業(yè)的數(shù)字化轉(zhuǎn)型尤為重要。
PI System對接:對于正在從PI System遷移的用戶,系統(tǒng)提供了專門的遷移工具和協(xié)議兼容方案,支持歷史數(shù)據(jù)的批量遷移和實(shí)時(shí)數(shù)據(jù)的同步接入,大幅降低系統(tǒng)切換成本。
REST API與InfluxDB兼容:taosAdapter同時(shí)提供RESTful API寫入接口和InfluxDB行協(xié)議兼容接口,使得已有的采集程序和監(jiān)控工具無需修改即可對接,實(shí)現(xiàn)業(yè)務(wù)系統(tǒng)的平滑遷移。
零代碼接入方案的核心優(yōu)勢在于配置化操作。用戶可以通過兩種方式完成數(shù)據(jù)源配置。
配置文件方式:在taosAdapter的配置文件中,用戶可以為每個(gè)數(shù)據(jù)源定義連接參數(shù)。以MQTT接入為例,只需配置Broker地址、端口、用戶名密碼、訂閱Topic以及目標(biāo)超級表名稱即可。taosAdapter啟動后自動建立連接并開始數(shù)據(jù)采集。
管理界面方式:系統(tǒng)提供了可視化的管理控制臺,用戶可以在Web界面上完成數(shù)據(jù)源的添加、編輯和狀態(tài)監(jiān)控。管理界面會實(shí)時(shí)展示各數(shù)據(jù)源的連接狀態(tài)、數(shù)據(jù)寫入速率和錯(cuò)誤日志,極大降低了運(yùn)維門檻。
在數(shù)據(jù)模型映射方面,taosAdapter采用智能映射策略。用戶只需預(yù)先創(chuàng)建好超級表定義字段結(jié)構(gòu),taosAdapter會根據(jù)配置的映射規(guī)則,自動為每個(gè)設(shè)備或數(shù)據(jù)源創(chuàng)建對應(yīng)的子表,并將外部數(shù)據(jù)字段與超級表列進(jìn)行一一對應(yīng)。這種基于超級表和子表的模型設(shè)計(jì)是時(shí)序數(shù)據(jù)庫區(qū)別于傳統(tǒng)關(guān)系型數(shù)據(jù)庫的重要特征,能夠在保障數(shù)據(jù)組織清晰度的同時(shí),實(shí)現(xiàn)極高的寫入和查詢性能。
工業(yè)OPC UA數(shù)據(jù)采集:某大型制造企業(yè)需要將產(chǎn)線上數(shù)百臺PLC設(shè)備的實(shí)時(shí)運(yùn)行數(shù)據(jù)采集到數(shù)據(jù)平臺。傳統(tǒng)方案需要開發(fā)專門的OPC UA客戶端程序,處理復(fù)雜的安全認(rèn)證和節(jié)點(diǎn)瀏覽邏輯。采用零代碼接入方案后,運(yùn)維人員在管理界面上配置OPC UA服務(wù)器地址和節(jié)點(diǎn)列表,系統(tǒng)自動完成數(shù)據(jù)訂閱和寫入,整個(gè)部署過程從原來的數(shù)周縮短到數(shù)小時(shí)。
MQTT物聯(lián)網(wǎng)設(shè)備接入:某智慧園區(qū)項(xiàng)目需要接入上千臺環(huán)境傳感器,傳感器通過MQTT協(xié)議上報(bào)溫濕度、光照、PM2.5等數(shù)據(jù)。通過配置MQTT Topic與超級表的映射關(guān)系,所有設(shè)備數(shù)據(jù)自動入庫,每臺設(shè)備對應(yīng)一個(gè)子表,數(shù)據(jù)模型統(tǒng)一規(guī)范,后續(xù)查詢分析非常便捷。
| 對比維度 | 傳統(tǒng)ETL開發(fā)方案 | 零代碼接入方案 |
|---|---|---|
| 開發(fā)周期 | 2至4周 | 2至4小時(shí) |
| 代碼量 | 每數(shù)據(jù)源數(shù)百行 | 零代碼 |
| 運(yùn)維復(fù)雜度 | 高,需維護(hù)多個(gè)采集程序 | 低,統(tǒng)一網(wǎng)關(guān)管理 |
| 協(xié)議擴(kuò)展 | 需開發(fā)新適配模塊 | 配置即可支持 |
| 數(shù)據(jù)模型一致性 | 依賴開發(fā)規(guī)范 | 自動映射保障 |
從對比可以看出,零代碼接入方案在開發(fā)效率、運(yùn)維成本和擴(kuò)展性方面均具有顯著優(yōu)勢。對于快速迭代的物聯(lián)網(wǎng)項(xiàng)目而言,這種方案能夠?qū)?shù)據(jù)接入的開發(fā)周期從周級別縮短到小時(shí)級別,讓團(tuán)隊(duì)將精力集中在業(yè)務(wù)邏輯和數(shù)據(jù)分析層面。
數(shù)據(jù)接入是時(shí)序數(shù)據(jù)庫應(yīng)用落地的第一步,也是最容易被低估的環(huán)節(jié)。TDengine的零代碼數(shù)據(jù)接入方案通過taosAdapter網(wǎng)關(guān),將復(fù)雜的協(xié)議解析、數(shù)據(jù)轉(zhuǎn)換和模型映射工作封裝為配置化操作,大幅降低了多源異構(gòu)數(shù)據(jù)的接入門檻。無論您是工業(yè)自動化領(lǐng)域的系統(tǒng)集成商,還是物聯(lián)網(wǎng)平臺的技術(shù)負(fù)責(zé)人,這套方案都能幫助您快速構(gòu)建高效穩(wěn)定的數(shù)據(jù)管道。如果您正在評估時(shí)序數(shù)據(jù)庫的數(shù)據(jù)接入能力,建議下載TDengine進(jìn)行實(shí)際測試,體驗(yàn)零代碼配置帶來的效率提升。
]]>傳統(tǒng)物聯(lián)網(wǎng)采用”先采集、再集中”模式,數(shù)據(jù)全部傳至中心處理,隨設(shè)備規(guī)模擴(kuò)大暴露出帶寬壓力大、實(shí)時(shí)性不足等瓶頸。
因此,時(shí)序數(shù)據(jù)庫的邊云協(xié)同架構(gòu)將計(jì)算和存儲能力下沉到網(wǎng)絡(luò)邊緣,在邊緣節(jié)點(diǎn)完成數(shù)據(jù)的本地存儲、實(shí)時(shí)查詢和流計(jì)算,同時(shí)通過內(nèi)置的數(shù)據(jù)同步機(jī)制將關(guān)鍵數(shù)據(jù)按需上報(bào)至中心平臺,實(shí)現(xiàn)”邊緣自治、云端統(tǒng)覽”的協(xié)同模式。作為一款專為物聯(lián)網(wǎng)設(shè)計(jì)的時(shí)序數(shù)據(jù)庫,TDengine 在邊云協(xié)同領(lǐng)域提供了成熟的技術(shù)方案。
時(shí)序數(shù)據(jù)庫的邊云協(xié)同架構(gòu)建立在三大核心能力之上:內(nèi)置訂閱機(jī)制、多級拓?fù)渲С趾瓦吘壀?dú)立計(jì)算。與傳統(tǒng)方案不同,現(xiàn)代時(shí)序數(shù)據(jù)庫將數(shù)據(jù)訂閱功能直接內(nèi)置于數(shù)據(jù)庫引擎中,無需引入 Kafka、RabbitMQ 等外部消息隊(duì)列組件,大幅降低了系統(tǒng)復(fù)雜度和運(yùn)維成本。
內(nèi)置訂閱機(jī)制是整個(gè)邊云協(xié)同架構(gòu)的基石。時(shí)序數(shù)據(jù)庫基于發(fā)布-訂閱模式設(shè)計(jì)了完整的數(shù)據(jù)訂閱功能,支持以數(shù)據(jù)庫、超級表或自定義 SQL 查詢?yōu)榱6葎?chuàng)建訂閱主題。當(dāng)邊緣節(jié)點(diǎn)寫入新數(shù)據(jù)時(shí),時(shí)序數(shù)據(jù)庫的訂閱系統(tǒng)自動捕獲數(shù)據(jù)變更并推送到上級節(jié)點(diǎn),整個(gè)過程對業(yè)務(wù)應(yīng)用完全透明。
多級拓?fù)渲С?/strong>使數(shù)據(jù)能夠按照”邊緣節(jié)點(diǎn) – 區(qū)域中心 – 云端中心”的層級結(jié)構(gòu)逐級匯聚。每一級節(jié)點(diǎn)既是上級的數(shù)據(jù)生產(chǎn)者,也是下級的數(shù)據(jù)消費(fèi)者,形成靈活的數(shù)據(jù)上報(bào)鏈路。
邊緣獨(dú)立計(jì)算確保邊緣節(jié)點(diǎn)在斷網(wǎng)或中心平臺不可用時(shí),依然能夠獨(dú)立完成數(shù)據(jù)寫入、實(shí)時(shí)查詢和流式計(jì)算任務(wù),保障業(yè)務(wù)連續(xù)性。這是時(shí)序數(shù)據(jù)庫區(qū)別于傳統(tǒng)關(guān)系型數(shù)據(jù)庫的重要優(yōu)勢。
時(shí)序數(shù)據(jù)庫的邊云協(xié)同架構(gòu)采用三級拓?fù)湓O(shè)計(jì),適配不同規(guī)模的企業(yè)組織結(jié)構(gòu):
生產(chǎn)車間(邊緣節(jié)點(diǎn))
| 數(shù)據(jù)訂閱 · 降采樣 · 過濾
分廠/區(qū)域中心(匯聚節(jié)點(diǎn))
| 數(shù)據(jù)訂閱 · 聚合 · 匯總
集團(tuán)總部(云端中心)
邊緣節(jié)點(diǎn)獨(dú)立運(yùn)行時(shí)序數(shù)據(jù)庫實(shí)例,具備完整的存儲和計(jì)算能力,能夠在本地完成實(shí)時(shí)監(jiān)控、閾值告警和流式計(jì)算。
區(qū)域中心訂閱下轄各邊緣節(jié)點(diǎn)的數(shù)據(jù)。時(shí)序數(shù)據(jù)庫系統(tǒng)可以對數(shù)據(jù)進(jìn)行降采樣、過濾和初步聚合,大幅減少數(shù)據(jù)傳輸量。
云端中心匯聚來自所有區(qū)域中心的數(shù)據(jù)。企業(yè)可以基于時(shí)序數(shù)據(jù)庫構(gòu)建全局?jǐn)?shù)據(jù)視圖,進(jìn)行跨區(qū)域綜合分析。
時(shí)序數(shù)據(jù)庫的數(shù)據(jù)同步機(jī)制基于內(nèi)置訂閱功能實(shí)現(xiàn),提供靈活高效的自動數(shù)據(jù)管道:
與傳統(tǒng)方案相比,時(shí)序數(shù)據(jù)庫的邊云數(shù)據(jù)同步無需部署 Kafka 等消息中間件。時(shí)序數(shù)據(jù)庫將數(shù)據(jù)訂閱和傳輸能力內(nèi)置于引擎,一套系統(tǒng)即可完成存儲與跨節(jié)點(diǎn)同步。
邊云協(xié)同架構(gòu)中的邊緣節(jié)點(diǎn)是具備完整計(jì)算能力的獨(dú)立時(shí)序數(shù)據(jù)庫實(shí)例。時(shí)序數(shù)據(jù)庫在邊緣節(jié)點(diǎn)上支持流式計(jì)算、實(shí)時(shí)查詢、獨(dú)立數(shù)據(jù)保留策略和離線自治等核心能力。流式計(jì)算任務(wù)在本地完成,無需依賴云端;運(yùn)維人員可以通過時(shí)序數(shù)據(jù)庫的標(biāo)準(zhǔn) SQL 查詢直接查詢設(shè)備狀態(tài)和歷史數(shù)據(jù)。
智慧工廠:邊緣節(jié)點(diǎn)部署在每個(gè)車間完成設(shè)備監(jiān)控和告警,分廠區(qū)域中心的時(shí)序數(shù)據(jù)庫匯聚數(shù)據(jù)進(jìn)行產(chǎn)能分析,集團(tuán)云端中心整合所有分廠數(shù)據(jù)實(shí)現(xiàn)全局調(diào)度。時(shí)序數(shù)據(jù)庫在每一級都提供穩(wěn)定的數(shù)據(jù)存儲和查詢能力,保障工廠數(shù)據(jù)鏈路暢通。
能源管網(wǎng):每個(gè)監(jiān)測站作為邊緣節(jié)點(diǎn)獨(dú)立運(yùn)行時(shí)序數(shù)據(jù)庫,負(fù)責(zé)管道壓力、溫度等參數(shù)的實(shí)時(shí)監(jiān)控和異常告警。區(qū)域中心按地理區(qū)域匯聚數(shù)據(jù),云端中心進(jìn)行全局管網(wǎng)的泄漏檢測和負(fù)荷預(yù)測。
智慧城市:在各社區(qū)和路段部署的邊緣節(jié)點(diǎn)運(yùn)行時(shí)序數(shù)據(jù)庫完成本地?cái)?shù)據(jù)處理,區(qū)域中心按行政區(qū)匯聚數(shù)據(jù),城市大腦平臺基于全量數(shù)據(jù)進(jìn)行交通優(yōu)化和應(yīng)急指揮等綜合決策。
| 對比維度 | 時(shí)序數(shù)據(jù)庫邊云協(xié)同方案 | 傳統(tǒng)消息隊(duì)列方案 |
|---|---|---|
| 系統(tǒng)組件 | 數(shù)據(jù)庫內(nèi)置訂閱,無需額外組件 | 需部署 Kafka 等消息隊(duì)列 |
| 數(shù)據(jù)模型 | 邊云統(tǒng)一,無語義鴻溝 | 邊緣與云端可能采用不同數(shù)據(jù)模型 |
| 運(yùn)維復(fù)雜度 | 單一技術(shù)棧,運(yùn)維成本低 | 多組件協(xié)同,運(yùn)維難度高 |
| 數(shù)據(jù)同步粒度 | 支持庫級、表級、SQL 級靈活訂閱 | 通常為 Topic 級別,靈活性有限 |
| 降采樣能力 | 內(nèi)置降采樣,同步時(shí)直接聚合 | 需額外開發(fā)流處理邏輯 |
| 邊緣計(jì)算 | 原生支持流計(jì)算和實(shí)時(shí)查詢 | 需額外部署流計(jì)算框架 |
時(shí)序數(shù)據(jù)庫的邊云協(xié)同架構(gòu)正在成為物聯(lián)網(wǎng)和工業(yè)互聯(lián)網(wǎng)領(lǐng)域的關(guān)鍵基礎(chǔ)設(shè)施。通過內(nèi)置訂閱機(jī)制實(shí)現(xiàn)的多級數(shù)據(jù)同步、邊緣節(jié)點(diǎn)的獨(dú)立計(jì)算能力以及統(tǒng)一的數(shù)據(jù)模型,時(shí)序數(shù)據(jù)庫為企業(yè)提供了簡潔高效的邊云協(xié)同解決方案。無論您是正在規(guī)劃智慧工廠的數(shù)字化轉(zhuǎn)型,還是構(gòu)建跨區(qū)域的能源管網(wǎng)監(jiān)測平臺,時(shí)序數(shù)據(jù)庫的邊云協(xié)同架構(gòu)都值得深入評估和實(shí)踐。
歡迎訪問 TDengine 官方文檔了解時(shí)序數(shù)據(jù)庫邊云協(xié)同架構(gòu)詳情,或申請?jiān)囉闷髽I(yè)版體驗(yàn)核心能力。
]]>在典型的 IoT 或工業(yè)場景中,數(shù)據(jù)處理的完整鏈路往往涉及多個(gè)組件:數(shù)據(jù)采集后先寫入消息隊(duì)列,再由流處理框架消費(fèi)、計(jì)算,最后將結(jié)果寫回?cái)?shù)據(jù)庫。這條鏈路帶來了三個(gè)核心痛點(diǎn):
部署復(fù)雜度高:Flink 或 Spark 集群需要獨(dú)立的計(jì)算資源、ZooKeeper 協(xié)調(diào)服務(wù)以及狀態(tài)存儲后端,整套系統(tǒng)的搭建和調(diào)優(yōu)門檻極高。
數(shù)據(jù)延遲不可避免:數(shù)據(jù)從寫入時(shí)序數(shù)據(jù)庫到被流處理框架消費(fèi),中間經(jīng)歷了網(wǎng)絡(luò)傳輸、序列化反序列化等多個(gè)環(huán)節(jié),端到端延遲通常在秒級甚至更高。
運(yùn)維成本居高不下:流處理框架本身需要專業(yè)的運(yùn)維團(tuán)隊(duì)進(jìn)行監(jiān)控、擴(kuò)縮容和故障恢復(fù),對于中小規(guī)模項(xiàng)目而言,這筆投入往往遠(yuǎn)超預(yù)期。
作為一款專為時(shí)序場景設(shè)計(jì)的時(shí)序數(shù)據(jù)庫,該產(chǎn)品將流計(jì)算邏輯直接嵌入數(shù)據(jù)庫內(nèi)核,數(shù)據(jù)寫入后即刻觸發(fā)計(jì)算,省去了中間環(huán)節(jié)的傳輸開銷,端到端延遲降至毫秒級。同時(shí),由于不需要維護(hù)獨(dú)立的計(jì)算集群,運(yùn)維成本幾乎為零。
一款優(yōu)秀的時(shí)序數(shù)據(jù)庫,其流計(jì)算引擎應(yīng)當(dāng)覆蓋絕大多數(shù)實(shí)時(shí)數(shù)據(jù)處理場景。以下三大核心能力缺一不可:
窗口聚合是流計(jì)算中最基礎(chǔ)也最常用的操作。時(shí)序數(shù)據(jù)庫支持三種窗口類型:
與傳統(tǒng)的定時(shí)輪詢不同,流計(jì)算采用事件驅(qū)動模型。每當(dāng)有新數(shù)據(jù)寫入目標(biāo)表時(shí),流計(jì)算任務(wù)會立即被觸發(fā)執(zhí)行。這種機(jī)制確保了計(jì)算的實(shí)時(shí)性,避免了輪詢模式下的資源浪費(fèi)和響應(yīng)延遲。
流計(jì)算任務(wù)一旦創(chuàng)建,就會持續(xù)運(yùn)行在后臺。時(shí)序數(shù)據(jù)庫會自動維護(hù)查詢狀態(tài),對新到達(dá)的數(shù)據(jù)進(jìn)行增量計(jì)算,并將結(jié)果持續(xù)輸出到目標(biāo)表。用戶無需手動管理計(jì)算的生命周期,系統(tǒng)會自動處理故障恢復(fù)和狀態(tài)一致性。
降低學(xué)習(xí)成本是時(shí)序數(shù)據(jù)庫流計(jì)算引擎的重要設(shè)計(jì)理念。用戶只需通過標(biāo)準(zhǔn)的 SQL 語法即可定義流計(jì)算任務(wù),無需學(xué)習(xí)新的編程接口或框架 API。
核心語法為 CREATE STREAM,示例如下:
CREATE STREAM temp_alert_stream
TRIGGER AT_ONCE
AS SELECT _wstart, _wend, tbname, avg(temperature) AS avg_temp, max(temperature) AS max_temp
FROM factory_sensors
WHERE temperature > 80
PARTITION BY tbname
WINDOW(5m, 1m)
INTO temp_alert_table;
這條 SQL 的含義是:從 factory_sensors 超級表中持續(xù)讀取數(shù)據(jù),以 5 分鐘為窗口、1 分鐘為滑動步長,計(jì)算每個(gè)設(shè)備(按 tbname 分區(qū))的平均溫度和最高溫度,當(dāng)溫度超過 80 度時(shí),將結(jié)果寫入 temp_alert_table。
可以看到,整個(gè)流計(jì)算的定義方式與普通的聚合查詢幾乎一致,唯一的區(qū)別是增加了 CREATE STREAM 關(guān)鍵字和 INTO 子句來指定輸出目標(biāo)。這種設(shè)計(jì)讓熟悉 SQL 的開發(fā)人員可以在幾分鐘內(nèi)上手流計(jì)算功能。
在工業(yè)生產(chǎn)環(huán)境中,設(shè)備傳感器數(shù)據(jù)的異常波動往往意味著潛在故障。通過流計(jì)算引擎,可以實(shí)時(shí)監(jiān)控溫度、壓力、振動等關(guān)鍵指標(biāo),一旦超出預(yù)設(shè)閾值,立即觸發(fā)告警。相比事后分析,實(shí)時(shí)檢測能夠在故障發(fā)生前爭取寶貴的處理時(shí)間。
預(yù)測性維護(hù)是工業(yè)物聯(lián)網(wǎng)的核心應(yīng)用之一。通過持續(xù)計(jì)算設(shè)備的運(yùn)行特征(如溫度變化率、振動頻率漂移等),結(jié)合統(tǒng)計(jì)模型,可以在設(shè)備真正發(fā)生故障前發(fā)出預(yù)警,將”事后維修”轉(zhuǎn)變?yōu)?#8221;事前預(yù)防”,大幅降低停機(jī)損失。時(shí)序數(shù)據(jù)庫的流式計(jì)算能力為這一場景提供了堅(jiān)實(shí)的數(shù)據(jù)處理基礎(chǔ)。
對于智慧建筑、智慧園區(qū)等場景,需要對電表、水表、氣表的數(shù)據(jù)進(jìn)行實(shí)時(shí)匯總統(tǒng)計(jì)。流計(jì)算引擎可以按樓層、區(qū)域、用途等維度進(jìn)行多級聚合,實(shí)時(shí)輸出能耗報(bào)表,為能源管理決策提供數(shù)據(jù)支撐。時(shí)序數(shù)據(jù)庫在這一領(lǐng)域有著天然的優(yōu)勢。
| 對比維度 | 時(shí)序數(shù)據(jù)庫內(nèi)置流計(jì)算 | Flink/Spark Streaming |
|---|---|---|
| 部署方式 | 隨數(shù)據(jù)庫自動啟用 | 需獨(dú)立部署集群 |
| 端到端延遲 | 毫秒級 | 秒級 |
| 運(yùn)維成本 | 零額外運(yùn)維 | 需專業(yè)團(tuán)隊(duì)維護(hù) |
| 學(xué)習(xí)成本 | 標(biāo)準(zhǔn) SQL | 需學(xué)習(xí)框架 API |
| 數(shù)據(jù)遷移 | 無需遷移 | 需從數(shù)據(jù)庫導(dǎo)出 |
| 擴(kuò)展性 | 隨數(shù)據(jù)庫集群擴(kuò)展 | 獨(dú)立擴(kuò)展 |
對于大多數(shù)時(shí)序數(shù)據(jù)處理場景而言,內(nèi)置流計(jì)算引擎已經(jīng)能夠滿足需求。只有在需要進(jìn)行跨系統(tǒng)的復(fù)雜事件處理(如多數(shù)據(jù)源 Join、機(jī)器學(xué)習(xí)推理等)時(shí),才需要考慮引入外部流處理框架。
下面以一個(gè)完整的 IoT 場景為例,演示如何在時(shí)序數(shù)據(jù)庫中使用流計(jì)算引擎實(shí)現(xiàn)溫度異常檢測。
第一步:創(chuàng)建數(shù)據(jù)表
CREATE STABLE factory_sensors (ts TIMESTAMP, temperature FLOAT, humidity FLOAT)
TAGS (device_id INT, factory_zone NCHAR(50));
第二步:創(chuàng)建流計(jì)算任務(wù)
CREATE STREAM temp_monitor
TRIGGER AT_ONCE
WATERMARK 10s
AS SELECT _wstart AS window_start, _wend AS window_end,
tbname AS device,
avg(temperature) AS avg_temp,
max(temperature) AS max_temp,
count(*) AS sample_count
FROM factory_sensors
PARTITION BY tbname
WINDOW(1m, 30s)
WHEN avg_temp > 75 OR max_temp > 90
INTO temp_anomaly_alerts;
第三步:查詢告警結(jié)果
SELECT * FROM temp_anomaly_alerts
WHERE ts > NOW() - 1h
ORDER BY ts DESC;
上述案例中,流計(jì)算任務(wù)以 1 分鐘窗口、30 秒滑動步長持續(xù)監(jiān)控所有設(shè)備的溫度數(shù)據(jù)。當(dāng)某設(shè)備的平均溫度超過 75 度或瞬時(shí)溫度超過 90 度時(shí),系統(tǒng)自動將告警信息寫入 temp_anomaly_alerts 表。運(yùn)維人員只需查詢這張告警表,即可實(shí)時(shí)掌握設(shè)備運(yùn)行狀態(tài)。這正是時(shí)序數(shù)據(jù)庫流計(jì)算在工業(yè)場景中的典型價(jià)值體現(xiàn)。
時(shí)序數(shù)據(jù)庫內(nèi)置流計(jì)算引擎代表了數(shù)據(jù)基礎(chǔ)設(shè)施的發(fā)展趨勢——將計(jì)算能力下沉到數(shù)據(jù)存儲層,減少不必要的架構(gòu)復(fù)雜度和運(yùn)維負(fù)擔(dān)。TDengine 的流計(jì)算引擎以標(biāo)準(zhǔn) SQL 為接口,以事件驅(qū)動為機(jī)制,以毫秒級延遲為目標(biāo),為 IoT、工業(yè)互聯(lián)網(wǎng)和智慧城市等場景提供了開箱即用的實(shí)時(shí)數(shù)據(jù)處理能力。如果你的項(xiàng)目正在使用時(shí)序數(shù)據(jù)庫處理實(shí)時(shí)數(shù)據(jù),不妨親自體驗(yàn)一下內(nèi)置流計(jì)算的便捷與高效。訪問 TDengine 官方文檔,獲取流計(jì)算引擎的完整語法參考和更多實(shí)戰(zhàn)案例,開啟你的實(shí)時(shí)數(shù)據(jù)處理之旅。
]]>時(shí)序數(shù)據(jù)庫的核心使用模式之一是”頻繁查詢最新數(shù)據(jù)”。在工業(yè)監(jiān)控、IoT 平臺等典型場景中,超過 80% 的查詢請求集中在最近幾分鐘或幾小時(shí)的數(shù)據(jù)范圍內(nèi)。如果每次查詢都直接讀取磁盤,即使采用高效的列式存儲引擎,I/O 延遲仍然難以滿足毫秒級響應(yīng)的要求。
TDengine 的讀緩存機(jī)制正是針對這一痛點(diǎn)而設(shè)計(jì)。它在每個(gè) vnode(虛擬數(shù)據(jù)節(jié)點(diǎn))內(nèi)部維護(hù)了一份內(nèi)存緩存,自動保留每張子表的最新寫入數(shù)據(jù)塊。當(dāng)查詢請求到達(dá)時(shí),系統(tǒng)優(yōu)先從內(nèi)存緩存中獲取數(shù)據(jù),僅在緩存未命中時(shí)才回溯到磁盤。根據(jù)官方基準(zhǔn)測試數(shù)據(jù),在典型 IoT 場景下,開啟讀緩存后的最新數(shù)據(jù)查詢延遲可從數(shù)百毫秒降至數(shù)十毫秒以內(nèi),性能提升最高可達(dá) 8 倍。
這一機(jī)制的核心價(jià)值可以概括為三點(diǎn):
要理解 TDengine 讀緩存的高效性,需要先了解其存儲架構(gòu)。TDengine 采用分布式架構(gòu),數(shù)據(jù)按虛擬節(jié)點(diǎn)(vnode)進(jìn)行分片管理。每個(gè) vnode 負(fù)責(zé)管理一部分?jǐn)?shù)據(jù)分片,包含獨(dú)立的存儲引擎、查詢引擎和緩存模塊。
讀緩存并非緩存所有數(shù)據(jù),而是智能地聚焦于”最新寫入數(shù)據(jù)”。具體而言,每個(gè) vnode 的緩存模塊會自動保留每張子表最近寫入的數(shù)據(jù)塊。當(dāng)新數(shù)據(jù)持續(xù)寫入時(shí),緩存中較舊的數(shù)據(jù)塊會被自動淘汰,騰出空間給更新的數(shù)據(jù)。這種策略與時(shí)序數(shù)據(jù)的訪問模式高度契合——絕大多數(shù)實(shí)時(shí)查詢都聚焦于最新數(shù)據(jù),歷史數(shù)據(jù)的查詢頻率遠(yuǎn)低于此。
讀緩存與寫入流程緊密協(xié)同。數(shù)據(jù)寫入時(shí),首先寫入 WAL(Write-Ahead Log)保證持久性,隨后寫入內(nèi)存中的最新數(shù)據(jù)緩存。這意味著剛寫入的數(shù)據(jù)立即可被查詢命中,無需等待刷盤操作完成。這種”寫入即可見”的特性,對于實(shí)時(shí)告警、狀態(tài)監(jiān)控等場景至關(guān)重要。
當(dāng)查詢請求到達(dá)時(shí),TDengine 的查詢引擎會自動判斷所需數(shù)據(jù)是否在緩存中。對于時(shí)間范圍覆蓋最新數(shù)據(jù)的查詢,系統(tǒng)會從緩存中直接獲取對應(yīng)數(shù)據(jù)塊,避免磁盤 I/O;對于純歷史數(shù)據(jù)查詢,則直接讀取磁盤上的持久化文件。如果查詢的時(shí)間跨度同時(shí)覆蓋緩存數(shù)據(jù)和磁盤數(shù)據(jù),系統(tǒng)會將兩部分結(jié)果在內(nèi)存中合并后返回,整個(gè)過程對應(yīng)用層完全透明。
在傳統(tǒng)時(shí)序數(shù)據(jù)庫方案中,實(shí)現(xiàn)實(shí)時(shí)查詢加速通常需要引入 Redis 等外部緩存。應(yīng)用層需要手動編寫緩存邏輯,將最新數(shù)據(jù)同步寫入緩存,查詢時(shí)先查緩存、再查數(shù)據(jù)庫。這種方案雖然有效,但帶來了顯著的架構(gòu)復(fù)雜度和運(yùn)維負(fù)擔(dān)。
| 對比維度 | TDengine 內(nèi)置讀緩存 | Redis 外部緩存 |
|---|---|---|
| 部署方式 | 內(nèi)置,無需額外組件 | 獨(dú)立集群部署 |
| 數(shù)據(jù)一致性 | 自動保持與磁盤一致 | 需應(yīng)用層手動同步 |
| 緩存失效策略 | 引擎自動管理 | 需自行設(shè)計(jì)淘汰策略 |
| 運(yùn)維成本 | 零額外運(yùn)維 | 需獨(dú)立監(jiān)控、擴(kuò)容、故障處理 |
| 開發(fā)復(fù)雜度 | 零代碼改動 | 需編寫緩存讀寫邏輯 |
| 內(nèi)存利用率 | 按需分配,自動調(diào)節(jié) | 需手動配置內(nèi)存上限 |
| 數(shù)據(jù)持久化 | 緩存與存儲一體化 | 緩存丟失后需回源重建 |
從上表可以看出,TDengine 內(nèi)置讀緩存在運(yùn)維成本、開發(fā)復(fù)雜度和數(shù)據(jù)一致性三個(gè)方面具有顯著優(yōu)勢。對于追求架構(gòu)簡潔、運(yùn)維高效的團(tuán)隊(duì)而言,內(nèi)置緩存方案是更優(yōu)的選擇。
讀緩存機(jī)制并非在所有場景下都能帶來顯著收益,以下三類場景是其最佳適用場景。
監(jiān)控大屏通常以秒級或分鐘級刷新頻率展示最新數(shù)據(jù),如溫度、壓力、流量等傳感器指標(biāo)。這類查詢的時(shí)間窗口集中在最近數(shù)分鐘到數(shù)小時(shí),與讀緩存的數(shù)據(jù)范圍高度匹配。開啟讀緩存后,大屏刷新的響應(yīng)速度可提升數(shù)倍,用戶體驗(yàn)顯著改善。
在 IoT 平臺中,管理員和運(yùn)維人員需要頻繁查看設(shè)備的實(shí)時(shí)運(yùn)行狀態(tài)。每臺設(shè)備的狀態(tài)數(shù)據(jù)以子表形式存儲,讀緩存能夠自動保留每張子表的最新記錄,確保狀態(tài)查詢在毫秒級完成,即使平臺管理數(shù)百萬臺設(shè)備也能保持穩(wěn)定響應(yīng)。
工業(yè)場景中的告警系統(tǒng)需要持續(xù)檢測設(shè)備數(shù)據(jù)是否超過閾值。告警規(guī)則引擎會高頻輪詢最新數(shù)據(jù),讀緩存使得每次檢測都可在內(nèi)存中完成,避免了對磁盤的反復(fù)讀取,大幅降低了告警系統(tǒng)的資源消耗和響應(yīng)延遲。
TDengine 的讀緩存提供了靈活的配置選項(xiàng),允許用戶根據(jù)業(yè)務(wù)特點(diǎn)和硬件資源進(jìn)行調(diào)優(yōu)。
在 taos.cfg 配置文件中,可以通過 cache 參數(shù)設(shè)置每個(gè) vnode 的緩存大小(單位為 MB)。默認(rèn)值通常為 16MB,對于數(shù)據(jù)寫入量大或?qū)崟r(shí)查詢頻繁的場景,建議適當(dāng)增大該值。配置時(shí)需要綜合考慮可用內(nèi)存總量和 vnode 數(shù)量,確??偩彺嬲加貌怀^系統(tǒng)可用內(nèi)存的合理比例。
TDengine 提供了 cacheLastRow 配置項(xiàng),控制是否緩存每張表的最后一行數(shù)據(jù)。開啟該選項(xiàng)后,點(diǎn)查詢(如獲取某設(shè)備最新狀態(tài))將直接從內(nèi)存返回結(jié)果,延遲可降至個(gè)位數(shù)毫秒。對于以最新值查詢?yōu)橹鞯臉I(yè)務(wù)場景,強(qiáng)烈建議開啟此選項(xiàng)。
cache 值,延長緩存數(shù)據(jù)的覆蓋時(shí)間范圍,減少磁盤回溯頻率cacheLastRow,最大化點(diǎn)查詢性能cache 和 cacheLastRow 進(jìn)行組合調(diào)優(yōu),在內(nèi)存使用和查詢性能之間取得平衡以下是在典型 IoT 場景下的性能對比數(shù)據(jù)(基于 1000 萬張子表、每秒 1000 萬條寫入的基準(zhǔn)測試環(huán)境):
| 查詢類型 | 無緩存延遲 | 有緩存延遲 | 性能提升 |
|---|---|---|---|
| 最新單行查詢 | 120ms | 15ms | 8x |
| 最近 1 分鐘范圍查詢 | 350ms | 45ms | 7.8x |
| 最近 10 分鐘范圍查詢 | 580ms | 95ms | 6.1x |
| 最近 1 小時(shí)范圍查詢 | 1200ms | 420ms | 2.9x |
從測試數(shù)據(jù)可以看出,讀緩存對最新數(shù)據(jù)的查詢加速效果最為顯著,查詢時(shí)間窗口越短,緩存命中率越高,性能提升越明顯。隨著查詢時(shí)間窗口的擴(kuò)大,部分?jǐn)?shù)據(jù)需要從磁盤讀取,性能提升幅度相應(yīng)降低,但整體仍保持 2-3 倍的加速效果。
時(shí)序數(shù)據(jù)庫的讀緩存機(jī)制是提升實(shí)時(shí)查詢性能的關(guān)鍵技術(shù)手段。TDengine 將讀緩存深度集成到存儲引擎內(nèi)部,實(shí)現(xiàn)了緩存管理的自動化和查詢加速的透明化,無需引入 Redis 等外部組件即可獲得最高 8 倍的查詢性能提升。對于實(shí)時(shí)監(jiān)控大屏、IoT 設(shè)備狀態(tài)查詢和工業(yè)實(shí)時(shí)告警等高頻實(shí)時(shí)查詢場景,這一機(jī)制能夠顯著改善用戶體驗(yàn)并降低系統(tǒng)資源消耗。
如果您正在構(gòu)建物聯(lián)網(wǎng)或工業(yè)互聯(lián)網(wǎng)平臺,面臨實(shí)時(shí)查詢性能瓶頸,不妨親自體驗(yàn) TDengine 的讀緩存機(jī)制。訪問 TDengine 官方文檔,了解詳細(xì)的配置參數(shù)和最佳實(shí)踐,或下載社區(qū)版進(jìn)行試用,驗(yàn)證其在您的業(yè)務(wù)場景中的實(shí)際表現(xiàn)。
]]>傳統(tǒng)架構(gòu)中,時(shí)序數(shù)據(jù)從寫入到消費(fèi)往往需要經(jīng)過獨(dú)立的消息隊(duì)列中間件,數(shù)據(jù)鏈路長、運(yùn)維成本高。TDengine 時(shí)序數(shù)據(jù)庫將消息隊(duì)列能力直接內(nèi)置于數(shù)據(jù)庫引擎中,形成”寫入即訂閱”的極簡架構(gòu)。
| 特性 | TDengine 數(shù)據(jù)訂閱 | Kafka |
|---|---|---|
| 部署方式 | 內(nèi)置,無需額外組件 | 獨(dú)立集群部署 |
| 數(shù)據(jù)存儲 | 與時(shí)序數(shù)據(jù)共享存儲 | 獨(dú)立日志存儲 |
| 數(shù)據(jù)過濾 | 支持 SQL 預(yù)處理 | 需要流處理框架 |
| 消費(fèi)模型 | 推拉結(jié)合 | 純拉取模式 |
| 運(yùn)維成本 | 低(統(tǒng)一運(yùn)維) | 高(獨(dú)立運(yùn)維) |
主題(Topic)是 TDengine 數(shù)據(jù)訂閱的核心抽象,定義了數(shù)據(jù)的來源和范圍。TDengine 支持三種粒度的主題創(chuàng)建方式,滿足不同場景的數(shù)據(jù)消費(fèi)需求。
訂閱整個(gè)數(shù)據(jù)庫中的所有表數(shù)據(jù),適用于需要全量數(shù)據(jù)監(jiān)控的場景:
-- 創(chuàng)建數(shù)據(jù)庫級別的主題
CREATE TOPIC topic_db AS DATABASE power;
該主題會自動覆蓋 power 數(shù)據(jù)庫中所有表的數(shù)據(jù)變更,包括新增子表的數(shù)據(jù)。
訂閱指定超級表的數(shù)據(jù),適合按業(yè)務(wù)模塊劃分?jǐn)?shù)據(jù)消費(fèi)范圍:
-- 創(chuàng)建超級表級別的主題
CREATE TOPIC topic_meters AS STABLE meters;
該主題僅包含 meters 超級表及其所有子表的數(shù)據(jù),粒度更精確。
基于自定義 SQL 查詢創(chuàng)建主題,提供最靈活的數(shù)據(jù)篩選能力,是 TDengine 時(shí)序數(shù)據(jù)庫區(qū)別于傳統(tǒng)消息隊(duì)列的核心特性之一:
-- 創(chuàng)建 SQL 查詢主題,僅訂閱電壓超過 220V 的數(shù)據(jù)
CREATE TOPIC topic_high_voltage AS
SELECT ts, location, voltage, current
FROM meters
WHERE voltage > 220;
-- 創(chuàng)建聚合主題,訂閱每分鐘的平均電流
CREATE TOPIC topic_avg_current AS
SELECT _wstart, location, AVG(current) AS avg_current
FROM meters
INTERVAL(1m);
SQL 主題的優(yōu)勢在于:過濾和聚合計(jì)算在數(shù)據(jù)庫服務(wù)端完成,消費(fèi)者只需接收處理后的結(jié)果集,網(wǎng)絡(luò)傳輸量可降低數(shù)倍甚至數(shù)十倍。
-- 查看所有主題
SHOW TOPICS;
-- 刪除主題
DROP TOPIC topic_db;
TDengine 時(shí)序數(shù)據(jù)庫采用推拉結(jié)合(Push-Pull Hybrid)的數(shù)據(jù)傳輸模式,兼顧實(shí)時(shí)性與資源效率。
當(dāng)新數(shù)據(jù)寫入 TDengine 時(shí),訂閱系統(tǒng)會立即檢測到 WAL 中的數(shù)據(jù)變更,并主動推送給等待中的消費(fèi)者。整個(gè)流程無需消費(fèi)者輪詢,實(shí)現(xiàn)真正的毫秒級延遲:
數(shù)據(jù)寫入 → WAL 落盤 → 訂閱系統(tǒng)檢測 → 主動推送至消費(fèi)者
當(dāng)暫時(shí)沒有新數(shù)據(jù)時(shí),消費(fèi)者通過長輪詢機(jī)制保持與服務(wù)端的連接。一旦有新數(shù)據(jù)到達(dá),服務(wù)端立即響應(yīng)并推送數(shù)據(jù),避免了頻繁空輪詢造成的資源浪費(fèi)。
import taos
# 創(chuàng)建消費(fèi)者連接
consumer = taos.Consumer(
group_id="g1",
topics=["topic_meters"],
auto_offset="earliest"
)
# 循環(huán)拉取數(shù)據(jù)
for message in consumer:
print(f"主題: {message.topic}, 分區(qū): {message.partition}")
for row in message.rows:
print(f" 時(shí)間: {row[0]}, 電流: {row[1]}, 電壓: {row[2]}")
# 處理完成后提交進(jìn)度
message.commit()
consumer.close()
消費(fèi)組(Consumer Group)是 TDengine 數(shù)據(jù)訂閱實(shí)現(xiàn)高可靠、高吞吐消費(fèi)的關(guān)鍵機(jī)制。
同一消費(fèi)組內(nèi)的所有消費(fèi)者共享統(tǒng)一的消費(fèi)進(jìn)度。這意味著一條數(shù)據(jù)只會被消費(fèi)組內(nèi)的一個(gè)消費(fèi)者處理,避免了數(shù)據(jù)重復(fù)消費(fèi)的問題。消費(fèi)進(jìn)度由服務(wù)端(mnode)集中管理,持久化存儲,消費(fèi)者重啟后可從斷點(diǎn)繼續(xù)消費(fèi)。
TDengine 時(shí)序數(shù)據(jù)庫內(nèi)置了自動 Rebalance 機(jī)制,當(dāng)消費(fèi)組成員發(fā)生變化時(shí),系統(tǒng)會自動重新分配數(shù)據(jù)分區(qū):
系統(tǒng)每 2 秒檢測一次消費(fèi)組狀態(tài),發(fā)現(xiàn)變化時(shí)自動觸發(fā) Rebalance,以 vnode 為最小分配單元,采用均勻分配策略,并優(yōu)先保持已有分配關(guān)系以減少不必要的數(shù)據(jù)遷移。
import taos
# 消費(fèi)者 A
consumer_a = taos.Consumer(
group_id="g1", # 同一消費(fèi)組
topics=["topic_meters"],
auto_offset="latest"
)
# 消費(fèi)者 B(另一進(jìn)程或機(jī)器)
consumer_b = taos.Consumer(
group_id="g1", # 同一消費(fèi)組
topics=["topic_meters"],
auto_offset="latest"
)
# 兩個(gè)消費(fèi)者自動分配不同的 vnode 分區(qū),并行消費(fèi)
for message in consumer_a:
process(message)
message.commit()
消費(fèi)進(jìn)度管理是確保數(shù)據(jù)不丟失、不重復(fù)的關(guān)鍵。TDengine 時(shí)序數(shù)據(jù)庫通過 WAL 版本號精確記錄每個(gè) vnode 的消費(fèi)位置。
消費(fèi)者處理完數(shù)據(jù)后,需要提交消費(fèi)進(jìn)度(Commit Offset),告知服務(wù)端已成功處理到哪個(gè)位置:
# 方式一:手動提交(推薦)
for message in consumer:
process(message)
message.commit() # 顯式提交
# 方式二:批量提交
messages = []
for message in consumer:
messages.append(message)
if len(messages) >= 100:
process_batch(messages)
for msg in messages:
msg.commit()
messages.clear()
通過 auto.offset 參數(shù)控制消費(fèi)者首次啟動時(shí)的消費(fèi)起始位置:
| 配置值 | 行為 | 適用場景 |
|---|---|---|
earliest | 從最早可用的數(shù)據(jù)開始消費(fèi) | 需要全量歷史數(shù)據(jù)處理 |
latest | 僅從最新數(shù)據(jù)開始消費(fèi) | 僅關(guān)注實(shí)時(shí)數(shù)據(jù) |
none | 無已提交進(jìn)度時(shí)拋出異常 | 必須保證進(jìn)度連續(xù)性 |
# 從最早數(shù)據(jù)開始消費(fèi)(首次啟動時(shí)回溯全部歷史數(shù)據(jù))
consumer = taos.Consumer(
group_id="g1",
topics=["topic_meters"],
auto_offset="earliest"
)
# 僅消費(fèi)實(shí)時(shí)數(shù)據(jù)(忽略歷史數(shù)據(jù))
consumer = taos.Consumer(
group_id="g1",
topics=["topic_meters"],
auto_offset="latest"
)
對于已經(jīng)使用 Kafka 的團(tuán)隊(duì),TDengine 提供了兼容 Kafka 風(fēng)格的 API 接口,大幅降低遷移成本。開發(fā)者無需學(xué)習(xí)全新的 API 體系,只需調(diào)整連接配置即可完成切換。
| Kafka 概念 | TDengine 對應(yīng)概念 |
|---|---|
| Topic | Topic(主題) |
| Consumer Group | Consumer Group(消費(fèi)組) |
| Partition | VNode(虛擬數(shù)據(jù)節(jié)點(diǎn)) |
| Offset | Commit Offset(消費(fèi)進(jìn)度) |
| poll() | poll()(拉取數(shù)據(jù)) |
| commitSync() | commit()(提交進(jìn)度) |
# Kafka 風(fēng)格的消費(fèi)者代碼(TDengine)
from taos import Consumer
consumer = Consumer({
"group.id": "g1",
"td.connect.ip": "127.0.0.1",
"td.connect.port": "6030",
"auto.offset.reset": "earliest"
})
consumer.subscribe(["topic_meters"])
while True:
records = consumer.poll(timeout=1000)
for record in records:
handle(record)
consumer.unsubscribe()
consumer.close()
API 的使用方式與 Kafka 高度一致,包括 subscribe()、poll()、commit()、unsubscribe() 等核心方法,開發(fā)者可以快速上手。
SQL 預(yù)處理是 TDengine 數(shù)據(jù)訂閱區(qū)別于傳統(tǒng)消息隊(duì)列的核心優(yōu)勢。通過在數(shù)據(jù)庫服務(wù)端執(zhí)行過濾、聚合等計(jì)算,僅將結(jié)果集推送給消費(fèi)者,可以大幅減少網(wǎng)絡(luò)傳輸量和客戶端計(jì)算壓力。
-- 僅訂閱特定設(shè)備組的數(shù)據(jù)
CREATE TOPIC topic_group1 AS
SELECT ts, current, voltage
FROM meters
WHERE groupId = 1;
-- 僅訂閱異常數(shù)據(jù)
CREATE TOPIC topic_alert AS
SELECT ts, location, temperature
FROM sensors
WHERE temperature > 80 OR humidity > 95;
-- 訂閱每 5 分鐘的統(tǒng)計(jì)指標(biāo)
CREATE TOPIC topic_stats AS
SELECT _wstart, _wend, location,
AVG(current) AS avg_current,
MAX(voltage) AS max_voltage,
COUNT(*) AS sample_count
FROM meters
WHERE voltage > 200
INTERVAL(5m);
通過 SQL 預(yù)處理,原始數(shù)據(jù)量可能達(dá)到每秒百萬條級別,但推送給消費(fèi)者的聚合結(jié)果可能僅有每秒數(shù)百條,傳輸量降低上千倍。
工業(yè)場景中,監(jiān)控大屏需要實(shí)時(shí)展示設(shè)備運(yùn)行狀態(tài)。通過 TDengine 數(shù)據(jù)訂閱,可以將關(guān)鍵指標(biāo)實(shí)時(shí)推送至前端:
consumer = taos.Consumer(
group_id="dashboard_group",
topics=["topic_realtime_stats"],
auto_offset="latest"
)
for message in consumer:
# 將數(shù)據(jù)推送到 WebSocket 服務(wù)
websocket_server.broadcast(message.rows)
message.commit()
將 TDengine 中的時(shí)序數(shù)據(jù)實(shí)時(shí)同步到 Elasticsearch、ClickHouse 等其他系統(tǒng),用于全文檢索或離線分析:
consumer = taos.Consumer(
group_id="sync_group",
topics=["topic_meters"],
auto_offset="earliest"
)
for message in consumer:
# 批量寫入 Elasticsearch
es_client.bulk_index(message.rows)
message.commit()
訂閱關(guān)鍵傳感器數(shù)據(jù),實(shí)時(shí)檢測異常并觸發(fā)告警通知:
-- 創(chuàng)建告警主題
CREATE TOPIC topic_alert AS
SELECT ts, device_id, temperature, pressure
FROM sensors
WHERE temperature > 100 OR pressure < 0.5;
consumer = taos.Consumer(
group_id="alert_group",
topics=["topic_alert"],
auto_offset="latest"
)
for message in consumer:
for row in message.rows:
send_alert(
device=row["device_id"],
metric="temperature",
value=row["temperature"],
channel=["sms", "email", "dingtalk"]
)
message.commit()
TDengine 時(shí)序數(shù)據(jù)庫通過內(nèi)置類消息隊(duì)列的數(shù)據(jù)訂閱機(jī)制,為開發(fā)者提供了從數(shù)據(jù)寫入到實(shí)時(shí)消費(fèi)的一站式解決方案。主題創(chuàng)建的靈活粒度、消費(fèi)組的自動負(fù)載均衡、精確的進(jìn)度管理、兼容 Kafka 的 API 設(shè)計(jì)以及強(qiáng)大的 SQL 預(yù)處理能力,使得 TDengine 在實(shí)時(shí)監(jiān)控、數(shù)據(jù)同步、告警通知等場景中展現(xiàn)出顯著優(yōu)勢。
相比傳統(tǒng)”時(shí)序數(shù)據(jù)庫 + 消息隊(duì)列”的復(fù)雜架構(gòu),TDengine 的數(shù)據(jù)訂閱功能不僅簡化了系統(tǒng)架構(gòu)、降低了運(yùn)維成本,更通過零拷貝和推拉結(jié)合的傳輸模式實(shí)現(xiàn)了毫秒級的數(shù)據(jù)推送延遲。如果您正在尋找一款既能高效存儲時(shí)序數(shù)據(jù),又能提供實(shí)時(shí)數(shù)據(jù)分發(fā)能力的時(shí)序數(shù)據(jù)庫,TDengine 無疑是值得深入評估的選擇。歡迎訪問 TDengine 官方文檔中心,獲取更多技術(shù)細(xì)節(jié)與最佳實(shí)踐。
]]>TDengine時(shí)序數(shù)據(jù)庫的查詢引擎采用分布式計(jì)算架構(gòu),核心組件包括客戶端驅(qū)動(taosc)、虛擬存儲節(jié)點(diǎn)(vnode)和查詢計(jì)算節(jié)點(diǎn)(qnode)。taosc負(fù)責(zé)SQL解析與執(zhí)行計(jì)劃生成,vnode承擔(dān)本地?cái)?shù)據(jù)掃描與過濾,qnode則處理跨節(jié)點(diǎn)的聚合、排序和合并計(jì)算。
當(dāng)一條查詢語句提交到TDengine時(shí)序數(shù)據(jù)庫時(shí),系統(tǒng)依次完成SQL解析、元數(shù)據(jù)獲取、執(zhí)行計(jì)劃生成、任務(wù)分發(fā)、并行執(zhí)行和結(jié)果聚合六個(gè)階段。各vnode和qnode可并行處理子任務(wù),充分利用集群計(jì)算資源,實(shí)現(xiàn)毫秒級到秒級的查詢響應(yīng)。
-- 查看當(dāng)前查詢策略配置
SHOW QUERY_POLICY;
-- 設(shè)置查詢策略
SET QUERY_POLICY 2;
TDengine時(shí)序數(shù)據(jù)庫獨(dú)創(chuàng)的六層過濾機(jī)制是其查詢高性能的關(guān)鍵所在。當(dāng)查詢請求到達(dá)系統(tǒng)后,數(shù)據(jù)依次經(jīng)過以下六層過濾,層層縮小掃描范圍,最終實(shí)現(xiàn)精準(zhǔn)定位:
以標(biāo)簽過濾為例,TDengine將標(biāo)簽與時(shí)序數(shù)據(jù)分離存儲,標(biāo)簽數(shù)據(jù)常駐內(nèi)存并建立索引,可在毫秒級完成數(shù)百萬設(shè)備的過濾定位:
-- 利用標(biāo)簽索引快速過濾,僅掃描北京地區(qū)活躍設(shè)備
SELECT ts, temperature, humidity
FROM sensor_data
WHERE location = 'Beijing' AND status = 'active'
AND ts >= '2025-01-01 00:00:00'
AND ts < '2025-01-02 00:00:00';
TDengine時(shí)序數(shù)據(jù)庫提供了PARTITION BY語法,支持按任意標(biāo)簽或表達(dá)式分組聚合,比傳統(tǒng)GROUP BY更加靈活:
-- 按設(shè)備類型和小時(shí)窗口分組統(tǒng)計(jì)平均溫度
SELECT
_irowts,
device_type,
AVG(temperature) AS avg_temp,
MAX(humidity) AS max_humidity
FROM sensor_data
PARTITION BY device_type, INTERVAL(1h)
WHERE ts >= '2025-06-01 00:00:00';
在超級表查詢中,使用SLIMIT和SOFFSET限制參與計(jì)算的子表數(shù)量,避免全量掃描:
-- 僅對前10個(gè)設(shè)備進(jìn)行聚合統(tǒng)計(jì)
SELECT
device_id,
AVG(temperature) AS avg_temp
FROM sensor_data
PARTITION BY device_id
SLIMIT 10 SOFFSET 0;
TDengine時(shí)序數(shù)據(jù)庫支持豐富的聚合函數(shù)和降采樣策略,能夠?qū)⒏哳l采集的原始數(shù)據(jù)快速轉(zhuǎn)換為不同粒度的統(tǒng)計(jì)指標(biāo):
-- 降采樣:將秒級數(shù)據(jù)聚合為小時(shí)級統(tǒng)計(jì)
SELECT
_irowts,
AVG(temperature) AS avg_temp,
MAX(temperature) AS max_temp,
MIN(temperature) AS min_temp,
COUNT(*) AS sample_count
FROM sensor_data
WHERE ts >= '2025-01-01 00:00:00'
INTERVAL(1h)
FILL(NULL);
-- 插值填充:對缺失數(shù)據(jù)窗口進(jìn)行線性插值
SELECT
_irowts,
AVG(pressure) AS avg_pressure
FROM sensor_data
WHERE ts >= '2025-01-01 00:00:00'
INTERVAL(10m)
FILL(LINEAR);
FILL子句支持NULL、PREV、NEXT、LINEAR、VALUE等多種填充策略,確保降采樣結(jié)果的連續(xù)性。
TDengine時(shí)序數(shù)據(jù)庫提供五種窗口類型,覆蓋時(shí)序分析的各類場景:
最基本的窗口類型,按固定時(shí)間間隔切分:
SELECT _irowts, AVG(temperature), COUNT(*)
FROM sensor_data
PARTITION BY device_id
INTERVAL(1h);
根據(jù)字段值變化自動切分窗口,適用于設(shè)備狀態(tài)監(jiān)測:
SELECT
device_id,
AVG(temperature),
MAX(pressure)
FROM sensor_data
PARTITION BY device_id
STATE_WINDOW(machine_status);
當(dāng)數(shù)據(jù)間隔超過閾值時(shí)開啟新窗口,適用于用戶行為分析:
SELECT
device_id,
SUM(power_consumption)
FROM sensor_data
PARTITION BY device_id
SESSION(ts, 10m);
基于起始和結(jié)束事件定義窗口邊界:
SELECT
device_id,
AVG(temperature)
FROM sensor_data
PARTITION BY device_id
EVENT_WINDOW
START WITH temperature > 80
END WITH temperature < 40;
按固定數(shù)據(jù)條數(shù)切分窗口:
SELECT
device_id,
AVG(vibration)
FROM sensor_data
PARTITION BY device_id
COUNT_WINDOW(100);
ASOF Join是時(shí)序數(shù)據(jù)庫中關(guān)聯(lián)不同頻率時(shí)間序列的核心功能。它為左表每一行找到右表中時(shí)間戳最接近且不超過的匹配行:
-- 關(guān)聯(lián)傳感器溫度數(shù)據(jù)與設(shè)備運(yùn)行狀態(tài)
SELECT
a.ts,
a.device_id,
a.temperature,
b.status,
b.fault_code
FROM sensor_data a
ASOF JOIN device_status b
ON a.device_id = b.device_id;
Window Join在指定時(shí)間窗口內(nèi)關(guān)聯(lián)多個(gè)數(shù)據(jù)源,適用于多傳感器融合分析:
-- 在5秒時(shí)間窗口內(nèi)關(guān)聯(lián)溫度與壓力傳感器數(shù)據(jù)
SELECT
a.ts,
a.device_id,
a.temperature,
b.pressure
FROM temp_sensor a
WINDOW JOIN pressure_sensor b
ON a.device_id = b.device_id
AND a.ts BETWEEN b.ts - 5s AND b.ts + 5s;
TDengine時(shí)序數(shù)據(jù)庫通過vnode和qnode的協(xié)同計(jì)算實(shí)現(xiàn)查詢并行化。vnode負(fù)責(zé)本地?cái)?shù)據(jù)掃描和初步過濾,qnode承擔(dān)跨節(jié)點(diǎn)聚合和復(fù)雜計(jì)算。系統(tǒng)支持四種查詢策略模式(queryPolicy),適配不同部署架構(gòu):
| 策略模式 | 執(zhí)行方式 | 適用場景 |
|---|---|---|
| 策略1 | 全部在vnode本地執(zhí)行 | 邊緣計(jì)算、小規(guī)模部署 |
| 策略2 | 根據(jù)查詢復(fù)雜度智能調(diào)度 | 通用生產(chǎn)環(huán)境(推薦) |
| 策略3 | 存算分離,vnode僅掃描 | 大規(guī)模分析型負(fù)載 |
| 策略4 | qnode優(yōu)先執(zhí)行 | 計(jì)算資源充足的分析集群 |
-- 設(shè)置為存算分離模式,vnode專注寫入
SET QUERY_POLICY 3;
-- 復(fù)雜聚合查詢將自動調(diào)度到qnode執(zhí)行
SELECT
location,
_irowts,
AVG(temperature) AS avg_temp,
STDDEV(temperature) AS temp_stddev
FROM sensor_data
PARTITION BY location, INTERVAL(1h)
WHERE ts >= '2025-01-01 00:00:00'
HAVING avg_temp > 50;
超級表是TDengine時(shí)序數(shù)據(jù)庫的核心創(chuàng)新。標(biāo)簽數(shù)據(jù)與時(shí)序數(shù)據(jù)分離存儲,標(biāo)簽常駐內(nèi)存并建立高效索引,時(shí)序數(shù)據(jù)按時(shí)間分區(qū)存儲在vnode中。這種架構(gòu)帶來顯著的查詢性能優(yōu)勢:
-- 創(chuàng)建超級表,定義標(biāo)簽結(jié)構(gòu)
CREATE STABLE sensor_data (
ts TIMESTAMP,
temperature FLOAT,
humidity FLOAT,
pressure FLOAT
) TAGS (
device_id BINARY(32),
location BINARY(64),
device_type BINARY(16)
);
-- 對超級表進(jìn)行跨設(shè)備聚合查詢
SELECT
location,
device_type,
_irowts,
AVG(temperature) AS avg_temp,
MAX(pressure) AS max_pressure
FROM sensor_data
PARTITION BY location, device_type, INTERVAL(1h)
WHERE ts >= '2025-06-01 00:00:00';
TDengine時(shí)序數(shù)據(jù)庫實(shí)現(xiàn)了多級查詢緩存,顯著降低重復(fù)查詢的響應(yīng)延遲:
表結(jié)構(gòu)、標(biāo)簽值、集群拓?fù)涞仍獢?shù)據(jù)緩存在各節(jié)點(diǎn)的內(nèi)存中,SQL解析和執(zhí)行計(jì)劃生成階段無需頻繁訪問mnode,大幅降低元數(shù)據(jù)查詢開銷。
每張子表的最新一條數(shù)據(jù)單獨(dú)緩存在內(nèi)存中,對LAST(*)函數(shù)提供毫秒級響應(yīng):
-- 毫秒級獲取所有設(shè)備的最新溫度讀數(shù)
SELECT
device_id,
location,
LAST(temperature) AS latest_temp,
LAST(ts) AS latest_ts
FROM sensor_data
PARTITION BY device_id;
高頻訪問的時(shí)序數(shù)據(jù)塊會被緩存到內(nèi)存中,減少磁盤I/O次數(shù)。結(jié)合時(shí)序數(shù)據(jù)的訪問局部性特征(近期數(shù)據(jù)訪問頻率遠(yuǎn)高于歷史數(shù)據(jù)),緩存命中率通??蛇_(dá)90%以上。
ts范圍,避免全時(shí)間線掃描SLIMIT控制子表數(shù)量,分批處理大規(guī)模設(shè)備群FILL子句,避免結(jié)果中出現(xiàn)大量NULL值TDengine時(shí)序數(shù)據(jù)庫的高性能查詢引擎通過六層過濾機(jī)制、標(biāo)簽與時(shí)序數(shù)據(jù)分離存儲、多種窗口切分策略、ASOF/Window Join等時(shí)序?qū)訇P(guān)聯(lián)方式,以及vnode/qnode分布式并行計(jì)算架構(gòu),為海量時(shí)序數(shù)據(jù)的實(shí)時(shí)分析提供了業(yè)界領(lǐng)先的查詢性能。配合多級緩存體系和靈活的queryPolicy配置,TDengine能夠適配從邊緣計(jì)算到大規(guī)模云端分析的全場景需求。無論是物聯(lián)網(wǎng)設(shè)備監(jiān)控、工業(yè)產(chǎn)線分析還是IT運(yùn)維可觀測性,TDengine都能提供高效、靈活的查詢解決方案。如需進(jìn)一步了解TDengine時(shí)序數(shù)據(jù)庫的查詢優(yōu)化技巧,歡迎訪問TDengine官方文檔并下載試用。
]]>