?小 T 導讀:伴隨工業(ye)物聯(lian)網的(de)熱度,涉足云組(zu)態(tai)的(de)企(qi)業(ye)越(yue)(yue)來越(yue)(yue)多(duo)。云組(zu)態(tai)是工業(ye)物聯(lian)網平(ping)臺的(de)數(shu)據(ju)(ju)展示終端形式(shi)之一,是可以(yi)一站(zhan)式(shi)完成終端設備數(shu)據(ju)(ju)采集、實時控制、報警(jing)推(tui)送、分組(zu)管(guan)理(li)、組(zu)態(tai)設計等(deng)功(gong)能的(de)物聯(lian)網系統(tong)。一個強大的(de)云組(zu)態(tai)平(ping)臺,必須具備強大的(de)數(shu)據(ju)(ju)處(chu)理(li)能力(li),上海繁易是一家設備智(zhi)能化產品及服務提供商,在其工業(ye)物聯(lian)網云組(zu)態(tai)的(de)數(shu)據(ju)(ju)庫選型中,先后對比(bi)測試了4種(zhong)方案,最終選擇了TDengine Database。
繁易云組態(tai)(tai)是基于(yu)B\S架構的(de)數(shu)據采集與監視(shi)控制系統,為客戶提供了(le)如下方(fang)便的(de)功能:隨時隨地查看(kan)設(she)備運(yun)行(xing)數(shu)據和(he)狀(zhuang)態(tai)(tai),遠程設(she)置重要參數(shu);及時收到(dao)設(she)備報警(jing)信(xin)(xin)息,查看(kan)設(she)備歷史數(shu)據;對設(she)備進行(xing)遠程管理,記(ji)錄并(bing)查詢設(she)備檔(dang)案和(he)維護(hu)信(xin)(xin)息;終端客戶提供手機APP,實現遠程設(she)備監控。

業務場景
云組(zu)態需(xu)要做到按照時間段(duan)對采(cai)集到的指標(云組(zu)態稱作變(bian)(bian)(bian)量(liang),下(xia)文全(quan)部用變(bian)(bian)(bian)量(liang)替代)進(jin)行降采(cai)樣(yang)展示變(bian)(bian)(bian)量(liang)的值曲線圖。不同的云組(zu)態用戶會(hui)有(you)不同的變(bian)(bian)(bian)量(liang)需(xu)要監(jian)測,比如電力(li)行業用戶的場景(jing)中,C相(xiang)、B相(xiang)電壓就(jiu)是一個(ge)十分重要的變(bian)(bian)(bian)量(liang)。云組(zu)態要保證用戶能夠快(kuai)速(su)查詢出任意時間段(duan)內的電壓變(bian)(bian)(bian)化(hua)曲線,如下(xia)圖所示:

數據庫方案選型
方案一:Apache Imapla + Kudu
Kudu是(shi)一(yi)個(ge)分(fen)布式(shi)列式(shi)存(cun)儲(chu)庫,Impala負責通過sql的方式(shi)查(cha)詢Kudu 的數據(ju)做匯總。Impala和kudu都是(shi)集群部署(shu),至少需(xu)要4臺服務器,這個(ge)方案(an)的缺陷如下。
1)比(bi)較耗費服(fu)務器資源(yuan),Kudu數(shu)據落盤(pan)后(hou)也存在Compaction策略,導致(zhi)cpu會比(bi)較高。
2)寫(xie)入速度比(bi)較慢(3節(jie)點(dian)2C8G配置(zhi)目(mu)前每秒寫(xie)入條目(mu)不到2萬)。
3)數據(ju)要先從kudu讀(du)取到impala中再做計算,一旦(dan)數據(ju)過多,查詢緩(huan)慢,用戶無法忍(ren)受。
方案二:OpenTSDB + HBase
這個方案目前(qian)已經使用的人比較多。但(dan)此方案仍有缺陷(xian):
1)HBase集(ji)群配置要求高(gao),需(xu)要很好的(de)調優。
2)OpenTSDB默認的(de)compaction策略每到整點都會(hui)對上(shang)一(yi)(yi)小時(shi)的(de)數據查詢出來compact成一(yi)(yi)行(xing),寫(xie)入到HBase,刪(shan)除原始數據,這個(ge)相當耗費cpu。即使關閉compaction,修改tsd.storage.enable_appends = true 啟用append的(de)方式低配機器 cpu也是相當高。
方案三:Cassandra
Cassandra是一(yi)套開源分(fen)布式(shi)NoSQL數(shu)據(ju)(ju)庫系(xi)統(tong)。從其他團隊使用(yong)的情況(kuang)來(lai)看(kan),cassandra比較適合查詢小部分(fen)連續原始(shi)數(shu)據(ju)(ju),不太適合做分(fen)析,沒有降采樣(yang)等(deng)功能(neng),要出統(tong)計表(biao)只(zhi)能(neng)取一(yi)部分(fen)少(shao)量數(shu)據(ju)(ju)數(shu)據(ju)(ju)查詢出來(lai)后(hou)再在內存處理出結果。這樣(yang)用(yong)戶只(zhi)能(neng)看(kan)短時(shi)間內的數(shu)據(ju)(ju)曲線(xian),實(shi)用(yong)性不高(gao)。
方案四:TDengine
TDengine是一個簡單快捷高性能的時序數據庫(Time-Series Database),提供高性能的(de)同時(shi)大大降低了安裝(zhuang)、部(bu)署、維護的(de)成本,是當(dang)前繁易云組態底層采用的(de)變量(liang)數(shu)據存儲(chu)引擎。TDengine解決(jue)了我(wo)們幾個之前較為頭(tou)疼(teng)的(de)問題。
1)安(an)裝簡單(dan)。下(xia)載rpm包,一個(ge)(ge)命令安(an)裝完畢即(ji)可(ke)運行。2)性能(neng)強(qiang)勁。測(ce)(ce)(ce)試(shi)(shi)(shi)場景:十萬張點(dian)表,每(mei)個(ge)(ge)點(dian)表1s需要存(cun)儲(chu)1條記錄。在(zai)(zai)實際測(ce)(ce)(ce)試(shi)(shi)(shi)過程(cheng)中,使用(yong)http接口,采用(yong)單(dan)機4C16G的配(pei)置,8線程(cheng)每(mei)次(ci)寫(xie)500條記錄,10萬條記錄寫(xie)入只(zhi)需要300ms(如(ru)果使用(yong)java客戶(hu)端(duan)更快);單(dan)變量采樣查詢(xun)基本在(zai)(zai)2ms內(nei)完成(cheng)。整個(ge)(ge)測(ce)(ce)(ce)試(shi)(shi)(shi)持續了48小時(shi),測(ce)(ce)(ce)試(shi)(shi)(shi)期間cpu在(zai)(zai)20%-30%之間,內(nei)存(cun)維持在(zai)(zai)6G左右,寫(xie)入相當穩定(ding),沒有出現超(chao)時(shi)。
綜合(he)考慮,使(shi)用TDengine硬件(jian)成本和開發維護成本大(da)大(da)降低,寫入(ru)和查(cha)詢速(su)度還比(bi)opentsdb等高(gao)一個級別。
下(xia)圖(tu)是(shi)TDengine Database官方性(xing)能對比圖(tu),優(you)勢還(huan)是(shi)很明顯的:

數據采集和查詢方案設計
物聯(lian)網(wang)設備(bei)采(cai)集的(de)數(shu)(shu)據會經(jing)過(guo)(guo)(guo)好幾道服(fu)務(wu)處(chu)理(li)放入消(xiao)息隊列,之(zhi)后經(jing)過(guo)(guo)(guo)過(guo)(guo)(guo)濾變(bian)量等業務(wu)邏(luo)輯處(chu)理(li)后,數(shu)(shu)據寫入TDengine Database。數(shu)(shu)據采(cai)集到(dao)存儲(chu)的(de)流程圖(tu)如下(xia)。

遵循(xun)TDengine Database一(yi)(yi)(yi)(yi)個數(shu)據源一(yi)(yi)(yi)(yi)張(zhang)表的設計思路,我們(men)認為每(mei)個變(bian)(bian)量(liang)(liang)就是一(yi)(yi)(yi)(yi)個數(shu)據源,因此對每(mei)個變(bian)(bian)量(liang)(liang)會(hui)建立一(yi)(yi)(yi)(yi)張(zhang)表。沒(mei)有(you)采(cai)用一(yi)(yi)(yi)(yi)個設備(bei)一(yi)(yi)(yi)(yi)張(zhang)表的原(yuan)因是由(you)(you)于(yu)工控(kong)行業中同一(yi)(yi)(yi)(yi)個采(cai)集設備(bei)內(nei)的變(bian)(bian)量(liang)(liang)采(cai)集周(zhou)期不一(yi)(yi)(yi)(yi)定會(hui)一(yi)(yi)(yi)(yi)致,另(ling)外一(yi)(yi)(yi)(yi)個設備(bei)的變(bian)(bian)量(liang)(liang)也很(hen)多(duo)(duo),超過(guo)(guo)100個是很(hen)普遍的現象,列過(guo)(guo)多(duo)(duo),有(you)些(xie)列又沒(mei)有(you)數(shu)據,會(hui)浪費空間。因此這里考慮(lv)使用一(yi)(yi)(yi)(yi)個變(bian)(bian)量(liang)(liang)一(yi)(yi)(yi)(yi)張(zhang)表,會(hui)靈活得多(duo)(duo)。由(you)(you)于(yu)TDengine表名(ming)(ming)不能包含中文,需要在(zai)寫入前的預處理(li)環節中,將變(bian)(bian)量(liang)(liang)名(ming)(ming)稱映射(she)成TDengine表名(ming)(ming)。具體做法(fa)是使用雪花算法(fa),每(mei)個設備(bei)id+變(bian)(bian)量(liang)(liang)名(ming)(ming)稱(云(yun)組態中這樣才能唯(wei)一(yi)(yi)(yi)(yi)確(que)定變(bian)(bian)量(liang)(liang))換(huan)一(yi)(yi)(yi)(yi)個雪花算法(fa)id,緩存(cun)在(zai)內(nei)存(cun)中,持久化存(cun)儲(chu)到mongodb。這樣做就確(que)保了變(bian)(bian)量(liang)(liang)id唯(wei)一(yi)(yi)(yi)(yi)、TDengine表名(ming)(ming)唯(wei)一(yi)(yi)(yi)(yi),映射(she)關系簡單。
我們使用(yong)TDengine時(shi),需(xu)求暫時(shi)沒有涉及(ji)到過多(duo)的標簽查詢,因(yin)此(ci)表的設計比較(jiao)簡單,1張(zhang)超(chao)級表和多(duo)張(zhang)子表即(ji)可滿(man)足。建(jian)立超(chao)級表的原因(yin)是方便后(hou)續多(duo)變量(liang)組合(he)查詢。具體建(jian)表思路(lu)是:
1. 首選創建超級表:
CREATE TABLE IF NOT EXISTS {_tsdbSettings.DbName}.variables (ts timestamp, val float) TAGS (vkey binary(200));
2. 創建子表:
CREATE TABLE IF NOT EXISTS {tableName} USING {_tsdbSettings.DbName}.variables TAGS ('{tag}');
一(yi)(yi)個(ge)變(bian)(bian)量(liang)(liang)一(yi)(yi)張表(biao)(biao),這樣(yang)做的優勢是(shi)非(fei)常明顯的。每張表(biao)(biao)里面只存一(yi)(yi)個(ge)變(bian)(bian)量(liang)(liang)的數(shu)據(ju)即使每秒(miao)寫入一(yi)(yi)次,1個(ge)月也只有260萬(wan)條,對其(qi)作指定時(shi)間范(fan)圍的查(cha)詢(xun),不用(yong)考慮其(qi)他(ta)變(bian)(bian)量(liang)(liang)的數(shu)據(ju),直(zhi)接從時(shi)間戳索引得到(dao)想要時(shi)間范(fan)圍的數(shu)據(ju),效率很高。云組態的需求(qiu)正是(shi)短(duan)時(shi)間內(nei)有很多變(bian)(bian)量(liang)(liang)按秒(miao)存儲,保存半年左右,并(bing)且在此情(qing)況下,用(yong)戶想查(cha)詢(xun)任意一(yi)(yi)個(ge)變(bian)(bian)量(liang)(liang)的歷史情(qing)況都能(neng)夠快速(su)得到(dao)響應。比如一(yi)(yi)開始截圖中展示的電(dian)壓(ya)變(bian)(bian)化曲線(xian)就是(shi)一(yi)(yi)個(ge)很好(hao)的例(li)子,這在之前的解決方案中是(shi)沒有實現的。由于(yu)有超級表(biao)(biao),變(bian)(bian)量(liang)(liang)名映射出來的表(biao)(biao)名也無需特意維護(hu),只需從超級表(biao)(biao)中查(cha)詢(xun)時(shi),通過標(biao)簽列對所感興(xing)趣的變(bian)(bian)量(liang)(liang)進行篩選過濾即可。
總結
繁易(yi)云組(zu)態采用了(le)TDengine Database后,節省了(le)其(qi)他方(fang)案搭建集(ji)群的(de)費用,并(bing)且在(zai)寫入速(su)度和查(cha)詢性能(neng)方(fang)面完全滿足了(le)業務(wu)的(de)需求,運維也(ye)是相(xiang)當(dang)簡(jian)單,沒(mei)有像(xiang)HBase之類相(xiang)當(dang)多的(de)調優(you)參數,cpu內存相(xiang)當(dang)穩定(ding)。對比市面上其(qi)他開源(yuan)方(fang)案,我們認為TDengine雖(sui)然(ran)開源(yuan)不到一(yi)年,但是在(zai)同類產品中名列前茅。希望在(zai)今后還(huan)能(neng)看(kan)到RESTful接口寫入速(su)度進(jin)一(yi)步提(ti)高(gao),文檔進(jin)一(yi)步豐富(fu)。
作者簡介:徐杰,八(ba)年.NET開發(fa)工程師(shi),在物聯(lian)網數據處理、時序數據庫使用有(you)深入研究。目前任職于上海(hai)繁易信息科技股份有(you)限公司,擔任軟件研發(fa)部云組態團(tuan)隊技術負責人。
公司介紹:上海繁易信息科技股份有(you)限公司是一(yi)家設(she)備(bei)智能化(hua)產(chan)品及服(fu)務提供商。面向工(gong)業自動化(hua)、環(huan)保、電力、新能源等(deng)領域,提供智能化(hua)產(chan)品及工(gong)業物聯網(wang)軟硬(ying)件一(yi)體化(hua)解決方案,為設(she)備(bei)制(zhi)造商和終端用戶挖掘更多設(she)備(bei)價值(zhi),提升效率、降低成本、優化(hua)管(guan)理,推動設(she)備(bei)制(zhi)造商服(fu)務轉(zhuan)型。
原文首發于


























