鄭海清
(廣東南華工商職業(yè)學(xué)院,廣東 廣州 510507)
數(shù)據(jù)存儲是目前研究的熱門話題之一,比較常用的存儲方式有非結(jié)構(gòu)化存儲模式和半結(jié)構(gòu)化存儲模式兩種,當(dāng)前使用的傳感器、位置服務(wù)和社交網(wǎng)絡(luò)都會應(yīng)用許多半結(jié)構(gòu)化空間數(shù)據(jù),同時也會應(yīng)用非結(jié)構(gòu)化空間數(shù)據(jù)[1]。傳統(tǒng)的數(shù)據(jù)存儲系統(tǒng)采用的實(shí)現(xiàn)方式主要有兩種:從空間上擴(kuò)展關(guān)系型數(shù)據(jù)庫,在數(shù)據(jù)庫的上層增設(shè)空間引擎,從這兩種思路出發(fā),可以很好地改善數(shù)據(jù)庫存儲的一致性問題和完整性問題。但是,面對海量數(shù)據(jù),關(guān)系型數(shù)據(jù)庫很難完整地實(shí)現(xiàn)存儲、訪問、維護(hù)問題,更難以實(shí)現(xiàn)數(shù)據(jù)庫擴(kuò)展問題[2]。
NoSQL數(shù)據(jù)庫是一種新型模式,不僅能夠快速存儲數(shù)據(jù),同時也可以快速查詢數(shù)據(jù),除此之外,NoSQL數(shù)據(jù)庫的容錯性很高,靈活的分布方式更適合存儲海量數(shù)據(jù)[3]。MongoDB是NoSQL數(shù)據(jù)庫的一種,是文檔型數(shù)據(jù)庫系統(tǒng),每一個MongoDB實(shí)例都會包括多個數(shù)據(jù)庫,每個數(shù)據(jù)庫都是完全獨(dú)立的,由不同權(quán)限控制[4]。MongoDB的存儲引擎為內(nèi)存映射,內(nèi)嵌的方式不僅能夠提高I/O性能,內(nèi)嵌的方式可以將每一條記錄都轉(zhuǎn)化成復(fù)雜的層次結(jié)構(gòu),由于數(shù)據(jù)庫沒有固定模式,所以不會受到環(huán)境約束,即使在不同環(huán)境下也可以完成存儲[5]。
文中針對密集型數(shù)據(jù)存儲問題,利用MongoDB數(shù)據(jù)庫適應(yīng)能力強(qiáng)的特點(diǎn)在云平臺上提出了一種新的數(shù)據(jù)密集型云存儲系統(tǒng),該系統(tǒng)不僅能夠解決數(shù)據(jù)云存儲問題,同時也可以實(shí)現(xiàn)數(shù)據(jù)處理,從而滿足用戶對密集型數(shù)據(jù)的使用要求和網(wǎng)絡(luò)服務(wù)要求。
為了同時實(shí)現(xiàn)存儲系統(tǒng)的存儲、訪問、管理和處理功能,文中設(shè)計的系統(tǒng)包括3個層次,分別是數(shù)據(jù)層、業(yè)務(wù)層和表現(xiàn)層[6]。基于MongoDB的數(shù)據(jù)密集型云存儲系統(tǒng)硬件框架如圖1所示。
圖1 數(shù)據(jù)密集型云存儲系統(tǒng)硬件框架
數(shù)據(jù)層會將用戶上傳數(shù)據(jù)統(tǒng)一存儲到MongoDB數(shù)據(jù)庫,利用HDFS分布式文件系統(tǒng)計算存儲的數(shù)據(jù)[7]。數(shù)據(jù)的類型和結(jié)構(gòu)都擁有不同的特點(diǎn),因此數(shù)據(jù)層的存儲集合主要有兩類:第一類負(fù)責(zé)存放空間數(shù)據(jù),第二類負(fù)責(zé)存儲云數(shù)據(jù)。由于數(shù)據(jù)層會向不同的用戶提供存儲服務(wù),所以被存儲的數(shù)據(jù)必須進(jìn)行分類,共享數(shù)據(jù)和私人數(shù)據(jù)要清楚劃分,共享數(shù)據(jù)被存儲到統(tǒng)一數(shù)據(jù)庫后,啟動過濾器維護(hù)數(shù)據(jù)安全;私人數(shù)據(jù)被存儲到用戶單獨(dú)的數(shù)據(jù)庫中,啟動權(quán)限控制維護(hù)數(shù)據(jù)的安全[8]。數(shù)據(jù)層的存儲結(jié)構(gòu)如圖2所示。
圖2 云數(shù)據(jù)存儲結(jié)構(gòu)
通過空間數(shù)據(jù)集合存儲各種不同的數(shù)據(jù),用戶在進(jìn)行數(shù)據(jù)存儲時,既可以選擇已經(jīng)存在的存儲結(jié)構(gòu)內(nèi)部數(shù)據(jù)集,也可以重新建立數(shù)據(jù)集,為取得更好的存儲效果,每一個空間對象都會對應(yīng)一個json對象,同時在存儲時,還要增設(shè)“file”、“l(fā)ayer”屬性,方便用戶在查詢時,更好地確定該空間對象所屬的源文件和對應(yīng)的不同圖層。系統(tǒng)數(shù)據(jù)層通過元數(shù)據(jù)集合來記錄空間參考系、數(shù)據(jù)信息和用戶描述,從而確定文件和數(shù)據(jù)庫集合之間的關(guān)系[9]。當(dāng)數(shù)據(jù)集需要新字段時,用戶在上傳的文檔中直接添加就可以,不需要再次設(shè)計,這樣不僅能夠減少數(shù)據(jù)結(jié)構(gòu)的使用次數(shù),同時也可以防止大量數(shù)據(jù)集合,避免存儲冗余,利用分片副本架構(gòu)實(shí)現(xiàn)集群架構(gòu)設(shè)計[10]。
業(yè)務(wù)層位于存儲層上方,通過業(yè)務(wù)層來訪問數(shù)據(jù)。在業(yè)務(wù)層中,MongoDB數(shù)據(jù)庫都要封裝,只有這樣才能有效保障用戶日常需要的應(yīng)用功能能夠順利運(yùn)行[11]。為優(yōu)化系統(tǒng)工作效率,數(shù)據(jù)存儲層內(nèi)部的復(fù)雜邏輯運(yùn)算被隱藏,用戶數(shù)據(jù)的讀寫功能和管理流程同時被簡化,業(yè)務(wù)層僅包括輸入模塊、下載模塊、搜索模塊、更新模塊、處理模塊和刪除模塊,所有的數(shù)據(jù)模塊都利用MongoDB中的Java程序完成數(shù)據(jù)交互,在自身算法庫中不斷挖掘和分析數(shù)據(jù)[12]。業(yè)務(wù)層結(jié)構(gòu)如圖3所示。
表現(xiàn)層負(fù)責(zé)展示系統(tǒng)功能,選取B/S架構(gòu)作為表現(xiàn)層的整體架構(gòu),并在瀏覽器中存儲、更新、上傳各種不同的數(shù)據(jù),為方便用戶界面與后臺更好地交互,在設(shè)計系統(tǒng)表現(xiàn)層時還引用了HTML5、CSS3、AJAX等技術(shù),通過這些技術(shù)使系統(tǒng)更好地運(yùn)行[13]。
圖3 磁盤信息導(dǎo)入與導(dǎo)出模型圖
利用訪問接口將數(shù)據(jù)層和表現(xiàn)層連接到一起,訪問接口可以向客戶端提供必要的接口函數(shù),在獲得接口函數(shù)命令后,所有的服務(wù)程序完成刪減、更新、修改、查找等工作,獲得的結(jié)果要及時反饋給客戶端[14]。
系統(tǒng)選用MongoDB—Hadoop作為適配器,完成數(shù)據(jù)庫與外部計算框架的交互工作。適配器實(shí)物圖如圖4所示。
圖4 適配器實(shí)物圖
利用云端技術(shù)的強(qiáng)大處理能力分析不同數(shù)據(jù),同時使用存儲資源和計算資源,完成各項不同的任務(wù),讓數(shù)據(jù)可以大規(guī)模地傳輸,從而緩解網(wǎng)絡(luò)數(shù)據(jù)帶來的寬帶壓力,使客戶端能夠更好地處理數(shù)據(jù)[15]。
根據(jù)系統(tǒng)硬件設(shè)計軟件,不同的數(shù)據(jù)使用的轉(zhuǎn)換接口和存儲接口都不同,通過注冊驅(qū)動、獲取數(shù)據(jù)名、獲取數(shù)據(jù)信息、訪問數(shù)據(jù)要素來實(shí)現(xiàn)存儲流程?;贛ongoDB的數(shù)據(jù)密集型云存儲系統(tǒng)軟件存儲過程如圖5所示。
通過云計算獲得數(shù)據(jù)組信息,如式(1)所示。
式(1)中,x代表獲取到的數(shù)據(jù)組信息,?代表存儲層信息,?代表數(shù)據(jù)層信息[16]。
圖5 數(shù)據(jù)密集型云存儲系統(tǒng)存儲流程
存儲系統(tǒng)在MongoDB—Hadoop適配器中獲得相關(guān)參數(shù)后,會對這些數(shù)據(jù)分片處理,將得到的數(shù)據(jù)轉(zhuǎn)移到mapper,在MongoDB中處理數(shù)據(jù),通過讀取來定義得到的程序語言,不斷索引過濾新的數(shù)據(jù),通過云計算實(shí)現(xiàn)批量計算,批量計算工作流程如圖6所示。
圖6 批量計算工作流程
1)利用MongoDB—Hadoop適配器檢測得到的MongoDB數(shù)據(jù)集,并分割所有得到的數(shù)據(jù);
2)將得到的數(shù)據(jù)分割,分配在不同的計算節(jié)點(diǎn)中;
3)在Hadoop中計算節(jié)點(diǎn)中分割數(shù)據(jù),分析分割后的情況,在MongoDB中得到數(shù)據(jù),在Mapper中實(shí)現(xiàn)本地計算;
4)在Recuder中合并計算,計算的結(jié)果輸出到MongoDB數(shù)據(jù)中,最終實(shí)現(xiàn)批量計算。
在一個由3臺物理機(jī)構(gòu)成的集群環(huán)境下構(gòu)成操作系統(tǒng),通過分析基于MongoDB的云存儲系統(tǒng)和Sqlite的云存儲系統(tǒng)之間的區(qū)別來判定系統(tǒng)性能。實(shí)驗過程的應(yīng)用參數(shù)如表1所示。
數(shù)據(jù)批量存儲性能對比實(shí)驗結(jié)果如圖7所示。
表1 實(shí)驗參數(shù)
圖7 數(shù)據(jù)批量存儲性能對比實(shí)驗結(jié)果
根據(jù)圖7可知,文中基于MongoDB的云存儲系統(tǒng)對數(shù)據(jù)的整體集群效率都要優(yōu)于傳統(tǒng)的基于關(guān)系型數(shù)據(jù)庫Sqlite的云存儲系統(tǒng),多次統(tǒng)計下,文中系統(tǒng)的存儲性能是傳統(tǒng)系統(tǒng)存儲性能的2.8倍,集群效率不會隨著實(shí)驗樣本的增加而發(fā)生明顯波動。由此可見,基于MongoDB的云存儲系統(tǒng)與基于關(guān)系型數(shù)據(jù)庫Sqlite的云存儲系統(tǒng)相比,有著明顯的優(yōu)勢,即使數(shù)據(jù)量增大,系統(tǒng)的插入效率也能得到有效保障。
對1 000條擁有特定性能的數(shù)據(jù)進(jìn)行分析,根據(jù)數(shù)據(jù)層級信息和行列號信息顯示結(jié)果,對比不同系統(tǒng)的查詢性能,如圖8所示。
圖8 特定數(shù)據(jù)查詢性能實(shí)驗對比
當(dāng)數(shù)據(jù)量較小時,傳統(tǒng)的云存儲系統(tǒng)和文中研究的云存儲系統(tǒng)二者相差不大,但是隨著數(shù)據(jù)量的增加,基于關(guān)系型數(shù)據(jù)庫Sqlite的云存儲系統(tǒng)花費(fèi)的查詢時間越來越大,上升坡度十分明顯,相比之下,基于MongoDB的云存儲系統(tǒng)上升坡度比較平緩,由此可見,基于MongoDB的云存儲系統(tǒng)查詢性能更好。
進(jìn)一步分析圖8實(shí)驗結(jié)果可知,隨著數(shù)據(jù)量的增加,基于MongoDB的云存儲系統(tǒng)在數(shù)據(jù)存儲方面和檢索方面表現(xiàn)出的性能要明顯優(yōu)于基于Sqlite的云存儲系統(tǒng),能夠很好地適應(yīng)云平臺系統(tǒng)。
MongoDB具備降低客戶端、存儲服務(wù)端和各個站點(diǎn)耦合性的能力,基于MongoDB的云存儲系統(tǒng)不再將數(shù)據(jù)存成一體化結(jié)構(gòu),從邏輯上將共享數(shù)據(jù)和私人數(shù)據(jù)分離,使存儲服務(wù)端和客戶端不再完全依靠站點(diǎn),即使站點(diǎn)不能正常工作,存儲服務(wù)端和客戶端也能正常地執(zhí)行開發(fā)和存儲功能?;贛ongoDB的云存儲系統(tǒng)降低了服務(wù)站點(diǎn)的壓力,使服務(wù)站點(diǎn)能夠同時處理大量訂單,不同的存儲點(diǎn)同時工作,使系統(tǒng)的存儲空間更豐富,系統(tǒng)更加靈活,在數(shù)據(jù)庫工作時,系統(tǒng)可根據(jù)自身特點(diǎn)適當(dāng)調(diào)整MongoDB集群。除此之外,MongoDB還具備容錯性好的優(yōu)勢,從整體上強(qiáng)化系統(tǒng)性能。
通過分析MongoDB數(shù)據(jù)庫特點(diǎn),研究了一種適用密集數(shù)據(jù)的云存儲系統(tǒng),該系統(tǒng)硬件結(jié)構(gòu)包括輸出存儲層、業(yè)務(wù)展示層和表現(xiàn)功能層3個層次,針對不同用戶使用不同的訪問接口,系統(tǒng)更加靈活,能夠更高效地完成存儲任務(wù)。文中研究的云存儲系統(tǒng)雖然具備很好的云存儲和處理能力,但是讀取能力相對較差,未來需要在這一方面進(jìn)一步研究。