小T導(dǎo)讀:鼎藍(lán)水務(wù)是一家致力于城市水環(huán)境綜合整治與規(guī)劃的專業(yè)環(huán)境服務(wù)公司,為國(guó)家高新技術(shù)認(rèn)證企業(yè)。公司創(chuàng)立于2005年,為國(guó)內(nèi)最早從事城市排水管網(wǎng)運(yùn)維技術(shù)和裝備引進(jìn)、推廣及實(shí)踐的技術(shù)型企業(yè)。如今鼎藍(lán)水務(wù)精耕細(xì)作十余年,已發(fā)展成為集規(guī)劃咨詢、裝備制造、技術(shù)研發(fā)、系統(tǒng)集成和運(yùn)營(yíng)維護(hù)全流程個(gè)性化菜單式服務(wù)的智慧水務(wù)企業(yè)。
業(yè)務(wù)場(chǎng)景
智慧排水系統(tǒng)中需要對(duì)排水設(shè)備中的液位進(jìn)行監(jiān)測(cè)。通常會(huì)在被監(jiān)測(cè)區(qū)域部署電流液位傳感器,采集電流液位頻率。傳感器采集的信息通過(guò)MQTT協(xié)議傳到網(wǎng)關(guān),網(wǎng)關(guān)收集到信息后會(huì)定時(shí)推送到業(yè)務(wù)后臺(tái)服務(wù),由服務(wù)層來(lái)做數(shù)據(jù)存儲(chǔ)和實(shí)時(shí)分析。設(shè)備運(yùn)行數(shù)據(jù)放在SQL Server里面,液位電流頻率等不重要又特別多的數(shù)據(jù)放在TDengine Database里面。
智慧排水系統(tǒng)整體處理流程
整個(gè)智慧排水系統(tǒng)包含數(shù)據(jù)采集層、數(shù)據(jù)傳輸層、數(shù)據(jù)平臺(tái)層和業(yè)務(wù)處理層幾個(gè)模塊,具體的處理流程如下圖所示:

在目前的應(yīng)用場(chǎng)景中,海量的數(shù)據(jù)來(lái)自攔蓄盾檢測(cè)設(shè)備上報(bào)的數(shù)據(jù)。在這些監(jiān)測(cè)數(shù)據(jù)的處理流程上,數(shù)據(jù)從網(wǎng)關(guān)推送過(guò)來(lái)后會(huì)有一個(gè)判斷是否實(shí)時(shí)數(shù)據(jù)。對(duì)于非實(shí)時(shí)數(shù)據(jù),則會(huì)流經(jīng)Redis去重,做報(bào)警判斷然后寫(xiě)入SQL Server。對(duì)于實(shí)時(shí)數(shù)據(jù)則直接寫(xiě)入TDengine Database,不需要再經(jīng)過(guò)Redis。之后前端需要的一些類似液位電流數(shù)據(jù)等就可以直接從TDengine訪問(wèn)。在這之前,所有數(shù)據(jù)都是使用SQL Server存儲(chǔ),發(fā)現(xiàn)數(shù)據(jù)量達(dá)到2000萬(wàn)后SQL Server的查詢時(shí)延已經(jīng)非常慢,不得不做分庫(kù)分表操作來(lái)提高查詢速度,但這個(gè)解決方法遇到跨庫(kù)跨表的查詢非常不便。
TDengine中的數(shù)據(jù)建模
TDengine是一個(gè)專門(mén)為物聯(lián)網(wǎng)結(jié)構(gòu)化數(shù)據(jù)流設(shè)計(jì)的時(shí)序數(shù)據(jù)庫(kù)(Time-Series Database),其建庫(kù)、建表的思路與關(guān)系庫(kù)完全不同,遵循一個(gè)數(shù)據(jù)流隔離的原則。物聯(lián)網(wǎng)設(shè)備產(chǎn)生的數(shù)據(jù)是按照時(shí)間順序產(chǎn)生的數(shù)據(jù)流。在智慧排水系統(tǒng),我們往往關(guān)心某一個(gè)液位計(jì)在一段時(shí)間范圍內(nèi)的變化趨勢(shì)或最大、最小值這些統(tǒng)計(jì)量。
用關(guān)系型數(shù)據(jù)庫(kù)比如SQL Server存儲(chǔ)時(shí)序數(shù)據(jù)時(shí),做法通常是所有同類設(shè)備的數(shù)據(jù)都進(jìn)同一張表,每條記錄會(huì)包含設(shè)備ID、數(shù)據(jù)采集(或入庫(kù))時(shí)間戳、采集到的值,并按照時(shí)間范圍來(lái)分表提速。
這種做法的弊端在于查詢麻煩且效率低。從關(guān)系型數(shù)據(jù)庫(kù)中查詢某一個(gè)設(shè)備的數(shù)據(jù),就需要通過(guò)設(shè)備ID把其他設(shè)備的數(shù)據(jù)從大表中過(guò)濾掉,且每查詢一個(gè)設(shè)備,就要面臨過(guò)濾其他設(shè)備數(shù)據(jù)的開(kāi)銷。
TDengine的設(shè)計(jì)思路是一個(gè)數(shù)據(jù)源(設(shè)備)一個(gè)表,每個(gè)數(shù)據(jù)源按照時(shí)間順序產(chǎn)生的消息流可以流入一個(gè)表中,不與其他數(shù)據(jù)流混合。表的主鍵是數(shù)據(jù)記錄采集或入庫(kù)的時(shí)間戳,其他字段是采集的值。
這樣在TDengine中查詢某個(gè)設(shè)備的指定時(shí)間段數(shù)據(jù)時(shí),查詢就簡(jiǎn)化為找到該設(shè)備的表并按照主鍵(時(shí)間戳)過(guò)濾搜索數(shù)據(jù)記錄,效率大大提升。
此外,在TDengine中,我們?yōu)榱朔奖愎芾碓O(shè)備的靜態(tài)信息,也創(chuàng)建了超級(jí)表,并將設(shè)備ID和分組等作為標(biāo)簽定義好。
具體到我們的場(chǎng)景中,我們的建庫(kù)、建表思路如下:
- 數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)創(chuàng)建主要依據(jù)業(yè)務(wù)模塊來(lái),把泵站、泵閘等上報(bào)數(shù)據(jù)分開(kāi)存儲(chǔ)。
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>
- 超級(jí)表
超級(jí)表的結(jié)構(gòu)非常簡(jiǎn)單,采集字段就是時(shí)間戳ts和采集值val。但此處定義了兩個(gè)標(biāo)簽,用于描述具體的點(diǎn)位靜態(tài)信息。
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的優(yōu)勢(shì)
高寫(xiě)入速度
用下來(lái)感受是TDengine的數(shù)據(jù)寫(xiě)入性能非常高?,F(xiàn)在的接入網(wǎng)關(guān)的設(shè)備數(shù)是23個(gè)液位9個(gè)頻率計(jì)9個(gè)電流計(jì)??偣?0個(gè)攔蓄盾、3個(gè)泵站。3個(gè)截留井。 1個(gè)泵閘,總共有40張表,每張表每天新增6萬(wàn)條數(shù)據(jù),現(xiàn)在每張表的大約三百萬(wàn)條數(shù)據(jù)。使用TDengine帶來(lái)的最大好處是不用再考慮SQLServer中的分庫(kù)分表操作,數(shù)據(jù)不斷寫(xiě)入一個(gè)月后,查詢時(shí)延也沒(méi)有增加。
降采樣查詢
TDengine為監(jiān)控設(shè)備數(shù)據(jù)分析提供了一個(gè)非常有用的功能 — interval,即按照時(shí)間窗口進(jìn)行降采樣。比如在排水系統(tǒng)中,我們往往要計(jì)算攔蓄盾每隔20分鐘液位值,這種分析可以簡(jiǎn)單由下面這個(gè)SQL語(yǔ)句實(shí)現(xiàn)。
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);
最新數(shù)據(jù)顯示
在現(xiàn)在的監(jiān)測(cè)系統(tǒng)中,需要大屏實(shí)時(shí)顯示液位計(jì)的最新讀數(shù)。這里正好用上TDengine自帶的緩存功能。TDengine為每張表在內(nèi)存中分配了一定的緩存空間,來(lái)存儲(chǔ)最熱的記錄,實(shí)時(shí)查詢效率非常高。查詢語(yǔ)法用到了last和last_row。
select last_row(*) from rtdata group by sncode;
進(jìn)而用VUE和hightopo的構(gòu)建組態(tài)可視化界面,實(shí)時(shí)顯示最新液位數(shù)據(jù)。網(wǎng)關(guān)輸出最新液位,后端推送給前端,三維頁(yè)面用hightopo展示液位。做出來(lái)的效果也是非常酷的。


低內(nèi)存、高壓縮比
在使用中,發(fā)現(xiàn)TDengine處理13個(gè)設(shè)備、百萬(wàn)量級(jí)的數(shù)據(jù)量的寫(xiě)入任務(wù),內(nèi)存開(kāi)銷只有1.5GB。查詢時(shí),內(nèi)存增長(zhǎng)覺(jué)察不出來(lái)。整體內(nèi)存開(kāi)銷比SQLServer降低了50%。
在數(shù)據(jù)落盤(pán)后,查看/var/lib/taos下的數(shù)據(jù)文件大小,原來(lái)5GB的原始數(shù)據(jù),經(jīng)TDengine壓縮后只有80MB,壓縮比為1.6%。
未來(lái)的展望
整體來(lái)講,TDengine Database對(duì)于處理高頻采集的結(jié)構(gòu)化時(shí)序數(shù)據(jù)吞吐量、資源開(kāi)銷和壓縮都非常優(yōu)秀。但目前TDengine還不能像Redis那樣做去重以及報(bào)警,這塊后面也會(huì)嘗試使用TDengine自帶的流式計(jì)算和訂閱來(lái)嘗試實(shí)現(xiàn)報(bào)警,看能否進(jìn)一步簡(jiǎn)化架構(gòu)省掉Redis和SQL Server的工作。希望TDengine官方也能在這方面有更多支持,能越來(lái)越棒!
作者簡(jiǎn)介:朱佳偉,鼎藍(lán)水務(wù)高級(jí)全棧研發(fā)工程師,開(kāi)源社區(qū)愛(ài)好者,目前主要負(fù)責(zé)鼎藍(lán)水務(wù)智慧排水系統(tǒng)中水位實(shí)時(shí)監(jiān)測(cè)系統(tǒng)的開(kāi)發(fā)與維護(hù)。
原文首發(fā)于:https://blog.csdn.net/weixin_43999998/article/details/104019889



互聯(lián)網(wǎng).png)



-1.png)




.png)


證.png)


伙伴.png)
伙伴.png)
伙伴.png)



