小T導讀:鼎藍水務(wu)是一(yi)家致力(li)于城市水環(huan)(huan)境(jing)綜合整治與規劃(hua)的(de)專業環(huan)(huan)境(jing)服務(wu)公司,為國家高新技術(shu)(shu)認證企業。公司創立于2005年,為國內(nei)最早(zao)從事城市排水管網(wang)運(yun)維(wei)技術(shu)(shu)和裝備引進、推廣及實踐的(de)技術(shu)(shu)型企業。如今(jin)鼎藍水務(wu)精耕細作十余年,已發展(zhan)成為集規劃(hua)咨詢、裝備制(zhi)造、技術(shu)(shu)研發、系統集成和運(yun)營維(wei)護全流程個性(xing)化菜單式服務(wu)的(de)智(zhi)慧水務(wu)企業。
業務場景
智(zhi)慧排水系統中需(xu)要(yao)對排水設(she)備中的液位(wei)進行監測。通(tong)(tong)常會(hui)在被監測區域部署(shu)電(dian)流(liu)液位(wei)傳(chuan)感器(qi)(qi),采集電(dian)流(liu)液位(wei)頻率(lv)。傳(chuan)感器(qi)(qi)采集的信息(xi)通(tong)(tong)過MQTT協議傳(chuan)到網關,網關收集到信息(xi)后(hou)會(hui)定時推送到業務(wu)后(hou)臺(tai)服務(wu),由(you)服務(wu)層來(lai)做數據(ju)存(cun)儲和實時分析。設(she)備運行數據(ju)放(fang)在SQL Server里面,液位(wei)電(dian)流(liu)頻率(lv)等(deng)不重要(yao)又(you)特別多的數據(ju)放(fang)在TDengine Database里面。
智慧排水系統整體處理流程
整個(ge)智慧排水系(xi)統包含數(shu)據采集層(ceng)、數(shu)據傳輸(shu)層(ceng)、數(shu)據平臺層(ceng)和業(ye)務處(chu)理層(ceng)幾(ji)個(ge)模(mo)塊,具體的處(chu)理流(liu)程如下圖所示:

在(zai)目前的(de)(de)(de)應用場景(jing)中,海量的(de)(de)(de)數(shu)(shu)據(ju)(ju)(ju)來自攔(lan)蓄盾檢測設備(bei)上報(bao)的(de)(de)(de)數(shu)(shu)據(ju)(ju)(ju)。在(zai)這(zhe)些監測數(shu)(shu)據(ju)(ju)(ju)的(de)(de)(de)處理(li)流(liu)程(cheng)上,數(shu)(shu)據(ju)(ju)(ju)從(cong)(cong)網(wang)關推送(song)過來后會有一個(ge)判斷是否實時(shi)(shi)數(shu)(shu)據(ju)(ju)(ju)。對于(yu)非(fei)實時(shi)(shi)數(shu)(shu)據(ju)(ju)(ju),則會流(liu)經Redis去(qu)重,做報(bao)警判斷然后寫入(ru)SQL Server。對于(yu)實時(shi)(shi)數(shu)(shu)據(ju)(ju)(ju)則直接(jie)寫入(ru)TDengine Database,不需要(yao)再經過Redis。之后前端(duan)需要(yao)的(de)(de)(de)一些類似液位電流(liu)數(shu)(shu)據(ju)(ju)(ju)等就可以直接(jie)從(cong)(cong)TDengine訪(fang)問。在(zai)這(zhe)之前,所(suo)有數(shu)(shu)據(ju)(ju)(ju)都是使用SQL Server存(cun)儲,發現(xian)數(shu)(shu)據(ju)(ju)(ju)量達(da)到(dao)2000萬后SQL Server的(de)(de)(de)查(cha)詢(xun)時(shi)(shi)延(yan)已(yi)經非(fei)常慢,不得不做分庫分表操作來提高查(cha)詢(xun)速(su)度,但這(zhe)個(ge)解決方法遇到(dao)跨庫跨表的(de)(de)(de)查(cha)詢(xun)非(fei)常不便。
TDengine中的數據建模
TDengine是一個專門為物聯網結構化數據流設計的時序數據庫(Time-Series Database),其(qi)建(jian)庫、建(jian)表(biao)的(de)思路與關系庫完全不同(tong),遵循一(yi)個數(shu)據(ju)流隔離的(de)原則。物聯網設備(bei)產(chan)(chan)生的(de)數(shu)據(ju)是按照時(shi)(shi)間(jian)順序產(chan)(chan)生的(de)數(shu)據(ju)流。在智(zhi)慧排水(shui)系統(tong),我(wo)們(men)往往關心某一(yi)個液位(wei)計在一(yi)段(duan)時(shi)(shi)間(jian)范圍(wei)內的(de)變化趨勢或最(zui)大、最(zui)小值這些統(tong)計量。
用關系型數(shu)(shu)據(ju)庫比如SQL Server存儲時(shi)序(xu)數(shu)(shu)據(ju)時(shi),做法通常是所有(you)同類設備的(de)數(shu)(shu)據(ju)都進(jin)同一張(zhang)表(biao),每(mei)條記錄會包含設備ID、數(shu)(shu)據(ju)采集(或入(ru)庫)時(shi)間戳(chuo)、采集到的(de)值(zhi),并按照(zhao)時(shi)間范圍來分表(biao)提速。
這(zhe)種做(zuo)法的弊端在于(yu)查(cha)詢(xun)麻煩(fan)且(qie)效率(lv)低(di)。從關(guan)系型(xing)數據庫中查(cha)詢(xun)某一個設備(bei)的數據,就需要通過(guo)設備(bei)ID把其(qi)他設備(bei)的數據從大表中過(guo)濾(lv)掉(diao),且(qie)每查(cha)詢(xun)一個設備(bei),就要面臨過(guo)濾(lv)其(qi)他設備(bei)數據的開銷。
TDengine的(de)設計思路是一個數據(ju)源(設備)一個表,每(mei)個數據(ju)源按照時(shi)間順序產生的(de)消息流可以流入一個表中,不與其他(ta)數據(ju)流混合。表的(de)主鍵是數據(ju)記錄采集或入庫的(de)時(shi)間戳,其他(ta)字段(duan)是采集的(de)值。
這樣(yang)在TDengine中查詢某個(ge)設備的(de)指定時(shi)間段數據時(shi),查詢就(jiu)簡化為(wei)找(zhao)到該(gai)設備的(de)表并(bing)按照主鍵(時(shi)間戳)過濾(lv)搜索數據記錄,效(xiao)率(lv)大大提升(sheng)。
此外,在(zai)TDengine中,我們為了(le)方便(bian)管理設備(bei)的靜態信息,也創建了(le)超(chao)級表,并將設備(bei)ID和分組等作為標簽(qian)定(ding)義(yi)好。
具體到(dao)我(wo)們的(de)場景(jing)中,我(wo)們的(de)建(jian)庫(ku)、建(jian)表思路如下(xia):
- 數據庫
數(shu)據(ju)(ju)庫創建主(zhu)要依據(ju)(ju)業務模塊來,把泵站、泵閘等(deng)上報(bao)數(shu)據(ju)(ju)分開(kai)存(cun)儲。
name | created time | ntables | vgroups |replica| days | keep1,keep2,keep(D) | tables | rows | cache(b) | ablocks |tblocks| ctime(s) | clog | comp |time precision| status |
==============================================================================================================================================================================================================================================
log | 19-09-06 10:36:33.888| 3| 1| 1| 10|30,30,30 | 32| 1024| 2048| 2.00000| 32| 3600| 1| 2|us |ready |
hgm | 19-09-08 22:42:58.873| 12| 1| 1| 10|3650,3650,3650 | 1000| 4096| 16384| 4.00000| 100| 3600| 1| 2|ms |ready |
jlj | 19-09-08 23:01:12.251| 17| 1| 1| 10|3650,3650,3650 | 1000| 4096| 16384| 4.00000| 100| 3600| 1| 2|ms |ready |
bengzhan | 19-09-08 23:01:21.895| 93| 1| 1| 10|3650,3650,3650 | 1000| 4096| 16384| 4.00000| 100| 3600| 1| 2|ms |ready |
bengzha | 19-09-08 23:01:29.272| 15| 1| 1| 10|3650,3650,3650 | 1000| 4096| 16384| 4.00000| 100| 3600| 1| 2|ms |ready |
|ready </font>
- 超級表
超(chao)級表的結構(gou)非常簡單,采(cai)集字(zi)段就是時間戳ts和采(cai)集值val。但此處定義了兩(liang)個標簽,用于描述具體的點位靜(jing)態信息。
taos> describe rtdata;
Field | Type | Length | Note |
=======================================================================================================
ts |TIMESTAMP | 8| |
val |FLOAT | 4| |
sncode |BINARY | 20|tag |
pointcode |BINARY | 10|tag |
taos> show stables;
name | created time |columns| tags | tables |
====================================================================================================================
rtdata | 19-09-09 18:15:42.243| 2| 2| 12|
- 普通表
taos> show tables;
table_name | created time |columns| stable |
=================================================================================================================================================================
sch_8_n_level | 19-09-09 18:24:22.655| 2|rtdata |
sch_7_n_level | 19-09-09 18:24:22.620| 2|rtdata |
sch_6_n_level | 19-09-09 18:24:22.585| 2|rtdata |
sch_29_n_level | 19-10-30 11:35:01.292| 2|rtdata |
sch_5_n_level | 19-09-09 18:24:22.550| 2|rtdata |
sch_4_n_level | 19-09-09 18:24:22.514| 2|rtdata |
sch_30_n_level | 19-10-29 14:54:53.446| 2|rtdata |
sch_3_n_level | 19-09-09 18:24:22.479| 2|rtdata |
sch_2_n_level | 19-09-09 18:24:22.442| 2|rtdata |
sch_10_n_level | 19-09-09 18:24:25.338| 2|rtdata |
sch_1_n_level | 19-09-09 18:24:22.408| 2|rtdata |
sch_9_n_level | 19-09-09 18:24:22.691| 2|rtdata |
TDengine的優勢
高寫入速度
用下來感受是(shi)TDengine的(de)數(shu)據寫(xie)入性能非(fei)常高。現在的(de)接(jie)入網(wang)關的(de)設備數(shu)是(shi)23個(ge)(ge)液位9個(ge)(ge)頻(pin)率計9個(ge)(ge)電流計。總共10個(ge)(ge)攔蓄盾、3個(ge)(ge)泵站。3個(ge)(ge)截留井。 1個(ge)(ge)泵閘,總共有(you)40張(zhang)表(biao)(biao),每張(zhang)表(biao)(biao)每天新增(zeng)6萬(wan)條數(shu)據,現在每張(zhang)表(biao)(biao)的(de)大約三百萬(wan)條數(shu)據。使(shi)用TDengine帶來的(de)最大好處是(shi)不(bu)用再考慮SQLServer中的(de)分(fen)(fen)庫分(fen)(fen)表(biao)(biao)操作(zuo),數(shu)據不(bu)斷寫(xie)入一個(ge)(ge)月后,查(cha)詢時延也沒有(you)增(zeng)加(jia)。
降采樣查詢
TDengine為監(jian)控設備數據分析提供了一個(ge)非常有(you)用的(de)功能(neng) — interval,即按照時間(jian)窗口進行降采(cai)樣。比(bi)如(ru)在(zai)排水系(xi)統中,我們往(wang)往(wang)要計算攔蓄(xu)盾每隔20分鐘液(ye)位(wei)值,這種分析可以簡單(dan)由下面這個(ge)SQL語(yu)句實現。
select avg(val) from sch_3_n_level where ts > '2019-10-15 00:00:00' and ts < '2019-11-15 00:00:00' interval(20M);
最新數據顯示
在現在的(de)監測系統(tong)中(zhong),需要大(da)屏(ping)實時顯示液(ye)位計的(de)最新讀數。這(zhe)里(li)正好用上(shang)TDengine自帶(dai)的(de)緩存(cun)功能。TDengine為每張表在內存(cun)中(zhong)分(fen)配了(le)一定的(de)緩存(cun)空間(jian),來(lai)存(cun)儲最熱的(de)記錄(lu),實時查(cha)詢(xun)效率非常高。查(cha)詢(xun)語法(fa)用到了(le)last和last_row。
select last_row(*) from rtdata group by sncode;
進而用VUE和hightopo的(de)(de)構建(jian)組態可視(shi)化(hua)界面,實時顯示最(zui)新液(ye)位數據。網關輸出(chu)最(zui)新液(ye)位,后端(duan)推送給(gei)前端(duan),三維頁面用hightopo展示液(ye)位。做出(chu)來的(de)(de)效果也是非常酷的(de)(de)。


低內存、高壓縮比
在使用中,發(fa)現TDengine處理13個設備、百(bai)萬量(liang)級的數據量(liang)的寫入任務,內(nei)(nei)存(cun)開銷(xiao)只有1.5GB。查(cha)詢(xun)時,內(nei)(nei)存(cun)增長(chang)覺察不出來(lai)。整體內(nei)(nei)存(cun)開銷(xiao)比SQLServer降低了50%。
在數(shu)(shu)據(ju)(ju)落盤后,查看/var/lib/taos下的(de)(de)數(shu)(shu)據(ju)(ju)文(wen)件大(da)小,原(yuan)來5GB的(de)(de)原(yuan)始數(shu)(shu)據(ju)(ju),經TDengine壓縮后只有80MB,壓縮比為1.6%。
未來的展望
整體來講,TDengine Database對于處理高頻采集的結構化時序數(shu)據吞吐(tu)量、資源開銷和壓縮都非常優秀。但目前TDengine還不能(neng)(neng)像Redis那樣(yang)做去重以及報警,這塊后(hou)面(mian)也(ye)(ye)會(hui)嘗試使(shi)用TDengine自帶(dai)的流式計算和訂閱來嘗試實現報警,看(kan)能(neng)(neng)否(fou)進一步簡化架(jia)構省(sheng)掉Redis和SQL Server的工作。希望TDengine官方也(ye)(ye)能(neng)(neng)在這方面(mian)有更多(duo)支持(chi),能(neng)(neng)越來越棒!
作者簡介:朱佳偉(wei),鼎藍水務高(gao)級全(quan)棧研發工程師,開源社區愛好者(zhe),目(mu)前主要負責(ze)鼎藍水務智慧排水系統中(zhong)水位實時監(jian)測(ce)系統的開發與(yu)維護。
原文首發于:


























