這篇文章(zhang)是“2024,我想和(he) TDengine 談(tan)談(tan)”征(zheng)文活動的(de)三等獎作品(pin)之一(yi)。作者通過自身實踐,詳細分享了(le)(le) TDengine 在高端(duan)裝備運維(wei)服務(wu)平臺(tai)中的(de)應用,涵蓋架(jia)構改(gai)造、性能測試、功能實現(xian)等多個(ge)方(fang)面。從壓(ya)縮效率(lv)到(dao)查詢性能,從功能優化到(dao)使用體驗,文章(zhang)不僅(jin)展(zhan)示了(le)(le) TDengine 的(de)技(ji)術(shu)優勢,也提(ti)出了(le)(le)許多寶貴的(de)改(gai)進建議,給人以深刻啟(qi)發。
為什么選擇 TDengine?
在裝備(bei)行業的(de)物(wu)聯網場景(jing)中,實時數(shu)據量極為龐大,涵蓋溫度、壓(ya)力、振動、位移等多種參數(shu),對這(zhe)些數(shu)據的(de)高效(xiao)分析(xi)和精準預(yu)警成為一大挑(tiao)戰。具(ju)體需求可以總(zong)結如(ru)下:
- 高并發寫入:需要支持每條記錄附帶時間戳的高頻數據寫入。
- 靈活表設計:不同傳感器設備的數據字段各不相同,需要針對每個設備靈活建表。
- 長期存儲與壓縮:原始數據需存儲至少 5 年,要求具備高效的數據壓縮能力以降低存儲成本。
- 國產化支持:需滿足國產化要求,并能提供快速響應的廠商服務。
我們選擇(ze)使用 TDengine 社區版 2.2.1.1 進(jin)行分布式模擬測試,實(shi)驗環境搭(da)建在以下配置的三臺(tai)服(fu)務器上:

測試一:驗證時序數據庫在 3 臺節點上的寫入性能模擬了 2 個廠區、共 10 個車間的數據,每個車間包含 1000 個監測點。從 2017-07-14 10:40:00.000 開始寫入模擬數據,時間戳間隔為 0.001 秒,每個監測點寫入 50 萬條記錄。測試采用 8 個線程并行寫入。在超過 50 億條記錄后停止寫入程序,測試結果顯示,平均寫入速度達 191 萬條/秒。


測試二:驗證時序數據庫在 3 臺節點上的數據壓縮能力
基(ji)于測(ce)試一的結果(guo),檢查 3 臺(tai)數據(ju)庫節點的實際文件(jian)存儲(chu)大小,具體(ti)數據(ju)如下:



落盤后的文件總大小為 36GB,而原始數據大小為約 93.13GB(按 50 億條記錄,每條 20 字節計算)。由此可得,數據壓縮比達到 38.65%。
測試三:驗證時序數據庫在 3 臺節點上的歷史數據回溯查詢性能
隨機選取一個測點,查詢其在特定時間段內的歷史數據。例如,從 2017-07-14 10:40:00.000 到 2017-07-14 10:40:10.000,共計 10 秒(miao)內的 10001 條(tiao)記錄(查詢(xun)結果輸出至文件)。對應的數據庫查詢(xun)語句如下(xia):
select * from d0 where ts >= ‘2017-07-14 10:40:00.000’ and ts <= ’2017-07-14 10:40:10.000’ >> /dev/null;


試驗證明,TDengine 具有(you)卓越的寫入(ru)性能(neng)、高并發能(neng)力以(yi)及極(ji)低(di)的查詢延遲(chi)。其分布式架(jia)構確保了系統的可靠性、穩定性和數據完(wan)整性。基于(yu)測試結果,我(wo)們迅速將 TDengine 應用于(yu)現有(you)業務系統,進行升級改造入(ru)。
TDengine 在 3H1 上的落地實踐
3H1 高端裝備運維服務(wu)平臺重(zhong)點(dian)解(jie)決(jue)高端成形裝備企(qi)業(ye)(ye)由制造化向服務(wu)化轉型的(de)關鍵問題,為(wei)企(qi)業(ye)(ye)提供工業(ye)(ye)互聯網與(yu)智能運維的(de)整體解(jie)決(jue)方案。
如下圖所示(shi),TDengine 與(yu)高端(duan)(duan)(duan)成(cheng)(cheng)形裝備(bei)的(de)智(zhi)能(neng)數(shu)(shu)據(ju)(ju)采(cai)集終端(duan)(duan)(duan)模(mo)塊深度集成(cheng)(cheng),助力采(cai)集終端(duan)(duan)(duan)完(wan)成(cheng)(cheng)對(dui)設備(bei)運(yun)行數(shu)(shu)據(ju)(ju)的(de)采(cai)集,為(wei)系統提(ti)供(gong)設備(bei)數(shu)(shu)據(ju)(ju)基礎(chu)。工業云計算服(fu)(fu)(fu)務(wu)平(ping)臺(tai)則進一(yi)步提(ti)供(gong)數(shu)(shu)據(ju)(ju)的(de)存儲、轉換和分析能(neng)力,為(wei)業務(wu)系統提(ti)供(gong)強有力的(de)數(shu)(shu)據(ju)(ju)支持。同時,智(zhi)能(neng)運(yun)維(wei)服(fu)(fu)(fu)務(wu)系統由裝備(bei)智(zhi)能(neng)運(yun)維(wei)服(fu)(fu)(fu)務(wu)平(ping)臺(tai)和智(zhi)能(neng)運(yun)維(wei)服(fu)(fu)(fu)務(wu) APP 組成(cheng)(cheng),分別為(wei)企(qi)業人員(yuan)提(ti)供(gong)系統和移動端(duan)(duan)(duan)的(de)服(fu)(fu)(fu)務(wu)支持。

針對企業多種應用(yong)場景,系統應用(yong)服務共分為以下六大功能模塊:
1. 企業駕駛艙:專為設(she)備(bei)制造(zao)企業(ye)的(de)管(guan)理(li)(li)者設(she)計,便于(yu)全(quan)面掌握(wo)平臺(tai)數據和(he)(he)關鍵(jian)業(ye)務(wu)流程指標。通過(guo)直(zhi)觀的(de)界面,管(guan)理(li)(li)者可以輕松了解(jie)設(she)備(bei)銷售情(qing)況(kuang)、企業(ye)接入信息以及平臺(tai)數據的(de)采集情(qing)況(kuang)。同(tong)時,駕駛艙支持對關鍵(jian)業(ye)務(wu)流程進行管(guan)理(li)(li),包括設(she)備(bei)監控、報(bao)警信息展示、維修效(xiao)率(lv)分析、設(she)備(bei)故障情(qing)況(kuang)以及三包任務(wu)的(de)追蹤和(he)(he)管(guan)理(li)(li)。

2. 設備資源管理:旨在為每臺高端成形裝備建立電子檔案,便于全面了解設備的歷史狀態、當前運行情況,并優化設備運行與未來狀況預測。在查看具體設備信息時,系統主要呈現以下四個維度:當前工況、健康分析、維修情況和歷史工況。
其中,當前工況為用戶提(ti)供設備的(de)基本信息、關(guan)鍵指標和報警情況的(de)總覽,幫助(zhu)快(kuai)速掌握設備的(de)實時(shi)運行狀態。

健康分(fen)析的目的是幫助用(yong)戶全面掌握設備的當前狀(zhuang)態(tai)以及健康狀(zhuang)況隨時間(jian)的變化(hua)趨(qu)勢(shi)。如(ru)果設備面臨故(gu)障(zhang)風險,系統能夠快速識別風險來(lai)源及故(gu)障(zhang)模(mo)塊(kuai),為(wei)用(yong)戶提供精準的診斷支持。

維修情況則是(shi)為用戶提供設備(bei)維修信息(xi)的全面概覽,并(bing)支持對當前維修任(ren)務的流(liu)程(cheng)進(jin)行實時跟蹤。

歷史(shi)工(gong)況(kuang)是為(wei)了(le)進行故障模塊預排查。

3. 維修服務管理:面向維修服務部門,提供維修任(ren)務的實(shi)時狀(zhuang)態和(he)(he)歷史(shi)效率分析(xi)。系統展(zhan)示當前待處理任(ren)務數量(liang),例如待接單、待派單和(he)(he)待回訪任(ren)務,并支持查(cha)看和(he)(he)操(cao)作每項任(ren)務,詳盡覆(fu)蓋維修流程的每個(ge)環節。

維(wei)修(xiu)(xiu)(xiu)效率分析則(ze)是對(dui)維(wei)修(xiu)(xiu)(xiu)中的關鍵效率指標進(jin)行統計分析,包(bao)括近一年(nian)來(lai)的訂(ding)單量的變化(hua)情況、維(wei)修(xiu)(xiu)(xiu)響應時間變化(hua)情況、故障類型分布、維(wei)修(xiu)(xiu)(xiu)人(ren)員(yuan)任務統計等,方便維(wei)修(xiu)(xiu)(xiu)管(guan)理人(ren)員(yuan)對(dui)維(wei)修(xiu)(xiu)(xiu)服務和(he)效率進(jin)行管(guan)理。

4. 設備健康分析:通過分析設備的歷史和(he)當前運行數據,預測(ce)設備未來可(ke)能(neng)發生的故障,并提(ti)供故障的可(ke)能(neng)性和(he)類(lei)型(xing)評估,幫(bang)助維修部門為用(yong)戶(hu)制定維保策略(lve),提(ti)前主動聯系用(yong)戶(hu),提(ti)升服務效(xiao)率。

5. 三包服務管理:服務(wu)于三包部門,提供當(dang)前維(wei)(wei)保活(huo)動(dong)提醒、設(she)備(bei)維(wei)(wei)保活(huo)動(dong)記錄、設(she)備(bei)維(wei)(wei)保到期預警等功能。
6. 備品備件管理:通(tong)過建(jian)立與維修保(bao)(bao)養(yang)(yang)相關的備(bei)(bei)(bei)品備(bei)(bei)(bei)件檔案,用戶和相關部門人員可在移動(dong)端和系統端進行備(bei)(bei)(bei)件的查詢(xun)、申請和審批操作,簡化流程(cheng),提高維修保(bao)(bao)養(yang)(yang)效(xiao)率。此外,利用數據分析(xi)預測備(bei)(bei)(bei)品備(bei)(bei)(bei)件需(xu)求(qiu),既(ji)能(neng)滿足需(xu)求(qiu),又能(neng)有效(xiao)降低(di)庫存成(cheng)本。
引入(ru) TDengine 后,這六(liu)大功能模塊的(de)使用效果顯著提升,不僅在數(shu)據寫入(ru)和(he)查詢(xun)性能上表現優異,高效的(de)壓縮效率也(ye)進一步優化了(le)性能與成(cheng)本的(de)平(ping)衡,實現了(le)最(zui)佳的(de)系統效能。
分析思路環節
架(jia)構改造升級到 TDengine 后,效(xiao)果非常明顯,硬件(jian)資源減(jian)少到原(yuan)來的(de) 1/5,效(xiao)率(lv)有了明顯的(de)提升。我們相信,隨著存儲規(gui)模的(de)不斷(duan)變大(da),這種改善和提升效(xiao)果會(hui)越(yue)(yue)來越(yue)(yue)明顯。此(ci)外,在運(yun)維管(guan)理(li)、費用支出、開發測試(shi)等方面(mian)也有了很大(da)的(de)改善。
- 開發人員現在可以自己電腦上搭建一套環境,隨便折騰,不用擔心跑不起來,也不用擔心影響別人;
- 性能測試的時候,用配置低一些的機器也沒問題,照樣能做出壓測效果;
- 遇到技術難題,原來通過 Google、百度、StackOverflow 尋找答案,現在可以直接在官方渠道 //github.com/taosdata/TDengine 提 issue,也可以在 TDengine 的技術社區進行提問,TDengine 的技術專家親自答復,響應非常快;
- TDengine 的體積小,上傳起來非常快,有些私有化部署項目,不允許訪問外網,只能手動上傳,體積小的優勢就非常明顯;
- 安裝部署簡單,配合 Docker 容器,可以在幾分鐘內完成安裝部署;
- 運營監控工作變簡單了,只需要對 TDengine 的幾個進程進行監控;
- 占用的磁盤空間明顯變小了,減少到原來的 1/5;
- 使用的主機減少到原來的 1/5,相應的費用支出也減少了。
總結思考
此次升級改造總體較為順利,但也遇到了一些挑戰,特別是在數據建模過程中。但辦法總比困難多,通過一些方法和技巧,我們成功將 TDengine 調整為 schema-free 數據庫,滿(man)足了(le)(le)本項目(mu)的需求,最終(zhong)順利完成(cheng)了(le)(le)系統的升級改造。
目前,TDengine 已全面支持所有物聯網設備的數據上報,并為應用層提供了多種場景的支持。我們現在使用到的功能還比較簡單,主要是插入、連續查詢和降采樣查詢,但這已足夠滿足物聯網平臺的需求。像 UNION、GROUP BY、JOIN 和聚合查詢等高級功能雖然暫未使用,但它們在大數據分析中(zhong)非常有(you)價值,未來(lai)可在相關(guan)項目中(zhong)嘗試使用,甚(shen)至(zhi)有(you)望(wang)替代 Hadoop 全家桶(tong)。
在使用過程中,我們也發現了一些可以(yi)改進的地方:
- JDBC-JNI 依賴動態庫,導致安裝和部署較為繁瑣。雖然通過 JDBC-RESTful 解決了這個問題,但多了一層 RESTful Connector,性能略有下降。理想的解決方案是開發一個基于純 Java 的 JDBC 驅動,直接連接后端服務。
- 客戶端以命令行形式為主,對開發者,尤其是初學者或習慣圖形界面的用戶并不友好。圖形界面支持如語法高亮、語法檢查等功能非常實用。目前已有社區開發者貢獻了兩個 GUI 工具,但如果能由官方提供支持,體驗會更佳。
總(zong)而言(yan)之(zhi),在引(yin)入 TDengine 后,3H1 原有(you)業務系統通過升級改造實(shi)現了(le)顯著提升,不(bu)僅大幅降低了(le)研發和維護(hu)成本,還成功(gong)實(shi)現了(le)橫向擴(kuo)展(zhan)。TDengine 出色的(de)查詢性能令人驚(jing)喜(xi),其卓(zhuo)越的(de)壓縮效(xiao)率也顯著節省了(le)存儲資源(yuan)。未來,我們計(ji)劃在更多應用場景中探索 TDengine 的(de)潛力,并進一(yi)步深化(hua)與 TDengine 的(de)合作。
TDengine 知識點
安裝 TDengine
下載地址:

目前(qian) TDengine 在 Windows 平臺上只支持 Windows Server 2016/2019 和 Windows 10/11。這里我們先(xian)下載(zai)和安裝 TDengine-server-3.0.1.7-Windows-x64.exe。安裝之(zhi)后的文件夾如(ru)下:

運行 TDengine
TDengine 安裝完成后,我們可以在擁有管理員權限的 cmd 窗口執(zhi)行 sc start taosd 或(huo)在 C:\TDengine 目錄下,運(yun)行 taosd.exe 來啟動 TDengine 服務進程(cheng)。

執行 TDengine 命令行
為了方便檢查 TDengine 的運行狀態并執行各種即席(Ad Hoc)查詢,TDengine 提供了命令行工具 TDengine CLI(簡稱 taos)。只需在終端輸入 taos,即可進入命令行界面開始操作。

新建數據庫(腳本文件)
在 TDengine CLI 中,我們可以使用 source 命令運(yun)行腳本文件中的多條 SQL 命令,實現批量執行操作。
# taos> source <filename>;
taos> source test.txt;
test.txt 內容如下:
CREATE DATABASE demo2;
USE demo2;
CREATE TABLE t (ts TIMESTAMP, speed INT);
INSERT INTO t VALUES ('2019-07-15 00:00:00', 10);
INSERT INTO t VALUES ('2019-07-15 01:00:00', 20);
SELECT * FROM t;

taosBenchmark 命令(體驗寫入速度)
你可以通過 TDengine 自帶的工具 taosBenchmark 快速測試其寫入速度。啟動 TDengine 服務后,在終端運行 taosBenchmark(前身為 taosdemo)即(ji)可體驗(yan)。
taosBenchmark --help
taosBenchmark

該命令會在數據庫 test 下自動創建一個超級表 meters,其下包含 1 萬張子表,表名為 d0 到 d9999。每張表包含 1 萬條記錄,每條記錄包含 ts(時間戳)、current(電流)、voltage(電壓)、phase(相位)四個字段,時間戳范圍從 2017-07-14 10:40:00.000 到 2017-07-14 10:40:09.999。此外,每張表附帶兩個標簽:groupId(取值 1 至 10)和 location(California.Campbell、California.Cupertino、California.LosAngeles、California.MountainView、California.PaloAlto、California.SanDiego、California.SanFrancisco、California.SanJose、California.SantaClara 或 California.Sunnyvale)。
表管理
# 創建表
use testdb;
create table t1 (ts TIMESTAMP,name1 BINARY(100)) ;
# 查看表結構
describe t1;
# 插入數據
insert into t1 values(‘2021-03-10 22:37:36.100’,‘test’);
# 查詢表
select * from t1;
# 查看當前所有表
show tables;
TDengine 提供了豐富的應用程序開發接口,支持多種編程語言的連接器,幫助用戶快速開發應用。官方連接器涵蓋 C/C++、Java、Python、Go、Node.js、C# 和 Rust,可通過原生接口(taosc)或 REST 接口(部分語言暫不支持)連接 TDengine 集群。此外,社區開發者還貢獻了多種非官方連接器,如 ADO.NET、Lua 和 PHP 連接器,進一步擴(kuo)展了生態支持。

taospy 是 TDengine 的官方 Python 連接器,提供了豐富的 API,使 Python 應用能夠輕松集成 TDengine。它封裝了 TDengine 的原生接口和 REST 接口,分別對應 taospy 包中的 taos 模塊 和 taosrest 模塊。此外,taospy 提供了符合 Python 數據訪問規范(PEP 249)的編程接口,使其與 SQLAlchemy 和 pandas 等第三方(fang)工具的集成更加便(bian)捷。
taos-ws-py 是(shi)另一(yi)款 Python 連接(jie)器(qi),通過 WebSocket 方式連接(jie) TDengine,可根據需(xu)求選擇使用(yong)。
在連接方式上,使用客戶端驅動的原生接口直接與服務端建立的連接稱為“原生連接”;通過 taosAdapter 提供的 REST 或 WebSocket 接口(kou)與服(fu)務端建立(li)的連(lian)接,分別稱為“REST 連(lian)接”或“WebSocket 連(lian)接”。
TDengine 典型的操作流程

在第二和第三步中,taosc 啟動時并不知道 mnode 的 End Point,會直接向配置的集群對外服務 End Point 發起請求。如果目標 dnode 未配置 mnode,它會在回復中提供 mnode 的 End Point 列表,隨后 taosc 會重新向指定的 mnode 發送請求以獲取元數(shu)據(ju)。
在第四和第五步中,如果沒有緩存,taosc 無法確定虛擬節點組中的 master 節點,默認假設第一個 vnodeID 為 master 并發出請求。如果目標 vnode 并非 master,它將在回復中提供正確的 master 信息,taosc 隨后向指定的 master 節點發起請求。一旦插入成功,taosc 會將 master 節點的信息緩(huan)存起來(lai)。
上述流程不僅適用于插入數據,也同樣適用于查詢和計算操作。這些復雜的處理均由 taosc 封裝,應用(yong)無需感知或(huo)進(jin)行額外處理。
通過 taosc 的緩存機制,僅在首次操作某表時才需要訪問 mnode,從而避免 mnode 成為系統瓶頸。但由于可能存在 schema 變更或 vgroup 調整(如負載均衡),taosc 會定期與 mnode 交互(hu)以自(zi)動更新緩(huan)存。
多表聚合查詢
TDengine 為每個數據采集點單獨建表,但在實際應用中,往往需要對多個采集點的數據進行聚合分析。為提升聚合操作的效率,TDengine 引入了 超級表(STable) 的(de)概(gai)念(nian)。超級表代表一(yi)(yi)類特定類型的(de)數據(ju)采集點(dian),包含多(duo)個子(zi)表,這些子(zi)表的(de)模式(schema)完全一(yi)(yi)致(zhi),同時具有各(ge)自的(de)靜態標(biao)簽。標(biao)簽可(ke)以有多(duo)個,并支持動態增刪和修(xiu)改。
通(tong)過設(she)置標簽過濾條件,用戶可以對超(chao)級表下(xia)的全部(bu)(bu)或(huo)部(bu)(bu)分子表進行(xing)聚合或(huo)統計(ji)操作(zuo),大(da)幅簡化應用開發流程(cheng)。具(ju)體(ti)流程(cheng)如下(xia)圖所示:



























