張明,羅云峰
(華中科技大學(xué)自動(dòng)化學(xué)院,湖北武漢430074)
?
基于MongoDB的海量電能質(zhì)量數(shù)據(jù)存儲(chǔ)方案設(shè)計(jì)與實(shí)現(xiàn)
張明,羅云峰
(華中科技大學(xué)自動(dòng)化學(xué)院,湖北武漢430074)
電能質(zhì)量監(jiān)測(cè)系統(tǒng)是發(fā)現(xiàn)和解決電能質(zhì)量問題的重要手段和工具。近年來,我國部分省市開展了電能質(zhì)量監(jiān)測(cè)系統(tǒng)的建設(shè)工作,實(shí)現(xiàn)了電能質(zhì)量的在線監(jiān)測(cè),這些系統(tǒng)大部分是基于關(guān)系型數(shù)據(jù)庫建立的[1]。電能質(zhì)量的實(shí)時(shí)監(jiān)測(cè)會(huì)產(chǎn)生大量的數(shù)據(jù),隨著智能電網(wǎng)建設(shè)進(jìn)程的加快,監(jiān)測(cè)節(jié)點(diǎn)不斷增多,數(shù)據(jù)采集頻率不斷提升,電能質(zhì)量數(shù)據(jù)顯現(xiàn)海量化趨勢(shì)。海量的電能質(zhì)量數(shù)據(jù),對(duì)系統(tǒng)的數(shù)據(jù)存儲(chǔ)、查詢以及擴(kuò)展性等方面提出了更高的要求。
為了滿足海量數(shù)據(jù)的存儲(chǔ)和訪問需求,人們提出了NoSQL數(shù)據(jù)庫系統(tǒng),采用更加靈活的存儲(chǔ)模式管理數(shù)據(jù),并打破了數(shù)據(jù)模式的限制,大幅提升了數(shù)據(jù)庫的讀寫性能。NoSQL自概念提出就得到了迅猛發(fā)展,而在眾多的NoSQL數(shù)據(jù)庫中,MongoDB一經(jīng)推出,便成為了該領(lǐng)域的一大熱門,在行業(yè)中得到了廣泛的應(yīng)用,創(chuàng)造了巨大的研究和應(yīng)用價(jià)值[2-3]。
1MongoDB概述
MongoDB是用C++語言實(shí)現(xiàn)的面向文檔存儲(chǔ)的非關(guān)系型數(shù)據(jù)庫,文檔是其存儲(chǔ)數(shù)據(jù)的基本單元,類似于關(guān)系型數(shù)據(jù)庫數(shù)據(jù)表中的一行[4]。文檔采用BSON(binary serialized document format)格式存儲(chǔ)數(shù)據(jù),方便靈活,可以隨意地添加和修改字段信息,可以支持基礎(chǔ)數(shù)據(jù)類型和復(fù)雜的數(shù)據(jù)類型,還可以實(shí)現(xiàn)數(shù)據(jù)類型的嵌套,這在關(guān)系型數(shù)據(jù)庫中是難以做到的。MongoDB還具有數(shù)據(jù)庫自動(dòng)分片功能,即將數(shù)據(jù)庫中的集合數(shù)據(jù)按照一定的規(guī)則劃分為若干小塊,這樣可以方便快速地實(shí)現(xiàn)數(shù)據(jù)庫的水平擴(kuò)展。
和關(guān)系型數(shù)據(jù)庫相比,MongoDB有著許多優(yōu)點(diǎn),包括靈活自由的存儲(chǔ)模式、豐富的數(shù)據(jù)類型支持、完全的索引支持、豐富的語言和平臺(tái)支持、完善的數(shù)據(jù)復(fù)制和故障恢復(fù)機(jī)制以及良好的擴(kuò)展性,能夠?yàn)楹A侩娔苜|(zhì)量數(shù)據(jù)的管理提供良好的平臺(tái)支撐。
2數(shù)據(jù)存儲(chǔ)方案設(shè)計(jì)與實(shí)現(xiàn)
本文提出的基于MongoDB的海量電能質(zhì)量數(shù)據(jù)存儲(chǔ)方案的總體架構(gòu)如圖1所示。
圖1 方案總體架構(gòu)
數(shù)據(jù)接口服務(wù)是連接電能質(zhì)量監(jiān)測(cè)終端、MongoDB數(shù)據(jù)庫以及終端用戶的樞紐,它接收來自監(jiān)測(cè)終端的電能質(zhì)量數(shù)據(jù),將數(shù)據(jù)存儲(chǔ)到MongoDB數(shù)據(jù)庫中,同時(shí)也為電能質(zhì)量監(jiān)測(cè)管理中心以及上層電能質(zhì)量監(jiān)測(cè)管理中心的用戶提供數(shù)據(jù)查詢與管理服務(wù),這些服務(wù)均是通過數(shù)據(jù)接口的方式發(fā)布,可以供監(jiān)測(cè)中心的客戶端程序調(diào)用。MongoDB數(shù)據(jù)庫主要實(shí)現(xiàn)電能質(zhì)量數(shù)據(jù)的存儲(chǔ)與查詢,根據(jù)電能質(zhì)量數(shù)據(jù)的內(nèi)容建立索引以滿足電能質(zhì)量數(shù)據(jù)的快速查詢需求,并通過自動(dòng)分片技術(shù)和復(fù)本集配置實(shí)現(xiàn)高擴(kuò)展性的數(shù)據(jù)集群服務(wù)以適應(yīng)電能質(zhì)量數(shù)據(jù)的不斷增長(zhǎng)。
為了充分利用服務(wù)器資源,這里選擇2臺(tái)配置相同的機(jī)器做服務(wù)器,1臺(tái)作為主節(jié)點(diǎn),負(fù)責(zé)電能質(zhì)量數(shù)據(jù)的存儲(chǔ),另1臺(tái)作為副本節(jié)點(diǎn)和仲裁節(jié)點(diǎn),其中副本節(jié)點(diǎn)負(fù)責(zé)電能質(zhì)量數(shù)據(jù)的查詢,而仲裁節(jié)點(diǎn)負(fù)責(zé)在主節(jié)點(diǎn)不能正常工作之后選舉新的主節(jié)點(diǎn),本身并不存儲(chǔ)數(shù)據(jù)。
主節(jié)點(diǎn)、副本節(jié)點(diǎn)以及仲裁節(jié)點(diǎn)分別包括3個(gè)分片shard、1個(gè)配置節(jié)點(diǎn)config和1個(gè)路由mongos。整個(gè)MongoDB數(shù)據(jù)庫集群的配置如圖2所示。
圖2 MongoDB數(shù)據(jù)庫集群配置
下面詳細(xì)描述MongoDB數(shù)據(jù)庫的配置過程。
①配置分片和副本集。對(duì)于每1組分片,其配置過程基本是一樣的。下面以shard1-1為例,其配置命令如下。
mongod --dbpath d:/pqdata/data1 --port 20002 --logpath d:/pqdata/log/data1.log --logappend --shardsvr --replSet shard1 --rest --oplogSize 100 --install
②初始化副本集。每一組副本集的初始化操作基本一致,下面是在主節(jié)點(diǎn)上初始化副本集的操作命令,其中arbiterOnly參數(shù)指定了仲裁節(jié)點(diǎn)。
config={_id:′shard1′,members:[{_id:0,host:′172.16.122.1:20002′},{_id:1,host:′172.16.122.2:20002′},{_id:2,host:′172.16.122.2:21002′,arbiterOnly:true}]};rs.initiate(config)
③啟動(dòng)3個(gè)配置節(jié)點(diǎn),以配置節(jié)點(diǎn)1為例。
mongod --configsvr --logpath d:/pqdata/log/configsvr/config1.log --logappend --dbpath d:/pqdata/data1/configsvr --port 20001 --shardsvr
④啟動(dòng)3個(gè)路由節(jié)點(diǎn),以路由節(jié)點(diǎn)1為例。
mongos --configdb 172.16.122.1:20001,172.16.122.2:20001,172.16.122.2:21001 --logpath d:/pqdata/log/mongos.log --logappend --port 20000
⑤添加分片到集群。以分片1為例,在主節(jié)點(diǎn)命令窗口中連接路由,輸入如下命令。
db.runCommand({addshard:″shard1/172.16.122.1:20002,172.16.122.2:20002,172.16.122.2:21002″,name:″shard1″})
⑥指定分片規(guī)則并激活。要對(duì)1個(gè)集合的進(jìn)行分片,還需要指定分片規(guī)則并且激活。下面以foo數(shù)據(jù)庫的bar集合為例。在節(jié)點(diǎn)1上連接路由,輸入如下命令。
db.runCommand({shardcollection:″foo.bar″,key:{id:1}})
db.runCommand({enablesharding:″foo″});
數(shù)據(jù)接口服務(wù)是一個(gè)中間層次的應(yīng)用程序,為了構(gòu)建一套跨平臺(tái)的通用數(shù)據(jù)接口方案,本方案首先將數(shù)據(jù)庫的通用操作進(jìn)行封裝。
圖3 通用操作UML類圖
DBManager是MongoDB的通用操作類,提供了數(shù)據(jù)庫連接、關(guān)閉、獲取集合、添加數(shù)據(jù)、批量添加數(shù)據(jù)、刪除數(shù)據(jù)、批量刪除數(shù)據(jù)、獲取數(shù)據(jù)、編輯數(shù)據(jù)以及查詢數(shù)據(jù)這些基本操作,如圖3所示。數(shù)據(jù)接口采用JSON(JavaScript Object Notation)作為數(shù)據(jù)傳輸格式,并且符合Rest的設(shè)計(jì)思想。JSON是由Douglas Crockford提出并創(chuàng)造的數(shù)據(jù)交換格式,并且得到了許多企業(yè)和開發(fā)者的支持[5]。JSON格式簡(jiǎn)單,減少了數(shù)據(jù)的冗長(zhǎng)性,可提高數(shù)據(jù)的傳輸效率,是實(shí)現(xiàn)跨平臺(tái)數(shù)據(jù)交換的理想數(shù)據(jù)格式[6]。
REST(Representational State Transfer)最早是由Roy Feilding[7]在其博士論文中提出來的,它描述了Web系統(tǒng)體系架構(gòu)的約束條件和原則,強(qiáng)調(diào)了Web應(yīng)用的簡(jiǎn)單性和資源性。每種資源對(duì)應(yīng)一個(gè)特定的URI(Uniform Resource Identifier,即統(tǒng)一資源定位符),客戶端通過GET(獲取)、POST(添加)、PUT(編輯)、DELETE(刪除)這4個(gè)動(dòng)作來操作資源。采用RESTful架構(gòu),可以開發(fā)出更容易使用、交互性更好、伸縮性強(qiáng)的Web服務(wù)[8]。以電能質(zhì)量基礎(chǔ)數(shù)據(jù)為例,其接口設(shè)計(jì)如表1所示。這些接口都有特定的URI,面向的都是資源,而非功能。通過對(duì)資源傳遞某種動(dòng)作,來實(shí)現(xiàn)需要的功能,而具體功能的實(shí)現(xiàn)邏輯,都在DBManager通用操作類的基礎(chǔ)上實(shí)現(xiàn)的。
例如對(duì)電能質(zhì)量基礎(chǔ)數(shù)據(jù)來說,通過向”/pqdata”接口傳遞POST動(dòng)作和數(shù)據(jù)對(duì)象,即可實(shí)現(xiàn)電能質(zhì)量基礎(chǔ)數(shù)據(jù)的入庫。
表1 電能質(zhì)量基礎(chǔ)數(shù)據(jù)接口
3方案測(cè)試與分析
本文對(duì)基于MongoDB、開源關(guān)系型數(shù)據(jù)庫MySQL以及商業(yè)關(guān)系型數(shù)據(jù)庫SQL Server的存儲(chǔ)方案的數(shù)據(jù)讀寫性能進(jìn)行測(cè)試。
選用2種配置的機(jī)器(其中機(jī)器1的性能比機(jī)器2好),分別按照20、50、100、200、500、1 000萬條的數(shù)據(jù)規(guī)模對(duì)3個(gè)測(cè)試方案進(jìn)行數(shù)據(jù)存儲(chǔ)和查詢測(cè)試。測(cè)試結(jié)果如圖4所示。
圖4 各方案測(cè)試對(duì)比圖
由實(shí)驗(yàn)結(jié)果可知,在不同的機(jī)器上MongoDB在數(shù)據(jù)存儲(chǔ)和查詢上都體現(xiàn)出了較好的性能。隨著數(shù)據(jù)規(guī)模的增大,這種優(yōu)勢(shì)越明顯,即使在配置較差的機(jī)器2上,也能達(dá)到配置較高的機(jī)器1上的MySQL和SQL Server相當(dāng)甚至更好的性能。這表明基于MongoDB的數(shù)據(jù)存儲(chǔ)方案能夠更充分地利用計(jì)算機(jī)資源,提供更好數(shù)據(jù)存儲(chǔ)和查詢功能。
4結(jié)語
隨著智能電網(wǎng)建設(shè)進(jìn)程的加快,電能質(zhì)量監(jiān)測(cè)點(diǎn)不斷增多,采樣頻率不斷提高,電能質(zhì)量監(jiān)測(cè)數(shù)據(jù)呈現(xiàn)海量化趨勢(shì)。現(xiàn)有的大部分電能質(zhì)量監(jiān)測(cè)系統(tǒng)是基于關(guān)系型數(shù)據(jù)庫建立的,難以滿足海量數(shù)據(jù)的存儲(chǔ)和訪問需求。
摘要:在研究非關(guān)系型數(shù)據(jù)庫MongoDB的基礎(chǔ)上,設(shè)計(jì)實(shí)現(xiàn)了基于MongoDB的海量電能質(zhì)量數(shù)據(jù)存儲(chǔ)方案,并與基于關(guān)系型數(shù)據(jù)庫的存儲(chǔ)方案進(jìn)行了性能比較測(cè)試。測(cè)試結(jié)果表明:該存儲(chǔ)方案具有更好的數(shù)據(jù)存儲(chǔ)和查詢性能,可為海量電能質(zhì)量數(shù)據(jù)的存儲(chǔ)與處理提供借鑒。
關(guān)鍵詞:電能質(zhì)量;海量數(shù)據(jù);MongoDB;數(shù)據(jù)存儲(chǔ)方案
Design and Implementation of Massive Power Quality Data Storage Scheme Based on MongoDBZHANG Ming,LUO Yunfeng
(School of Automation,Huazhong University of Science and Technology,Wuhan 430074)
Abstract:Based on a study of the NoSQL database MongoDB,this paper designed and implemented a massive power quality data storage scheme,and compared its performance with relational database-based storage scheme.The results show that the proposed storage scheme has better data storage and query performance,which can provide reference for massive power quality data storage and processing.
Key words:power quality;massive data;MongoDB;data storage scheme
中圖分類號(hào):TP392
文獻(xiàn)標(biāo)志碼:A
文章編號(hào):1671-0436(2015)03-0023-04
作者簡(jiǎn)介:張明(1989—),男,碩士研究生。
收稿日期:2015-04-05
doi:10.3969/j.issn.1671-0436.2015.03.006