劉堅(jiān) 陳曉琳
摘 要:針對(duì)關(guān)系型數(shù)據(jù)庫(kù)無法滿足海量活斷層探測(cè)文件入庫(kù)效率要求與存儲(chǔ)無法橫向線性擴(kuò)展的問題,基于MongoDB非關(guān)系型數(shù)據(jù)庫(kù)的海量活斷層探測(cè)文件存儲(chǔ)入庫(kù)方法,充分利用MongoDB內(nèi)存文件映射方式,可動(dòng)態(tài)增加節(jié)點(diǎn)以擴(kuò)展性能、提高負(fù)載。以南水北調(diào)中線核心水源區(qū)活斷層管理系統(tǒng)為例進(jìn)行測(cè)試,與傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)入庫(kù)文件方式進(jìn)行性能對(duì)比試驗(yàn)分析,結(jié)果表明:該方法顯著提高了海量活斷層探測(cè)文件的存儲(chǔ)入庫(kù)與查詢效率,能有效解決關(guān)系數(shù)據(jù)庫(kù)存取非結(jié)構(gòu)化數(shù)據(jù)時(shí)的性能瓶頸問題。
關(guān)鍵詞:MongoDB;活斷層;非關(guān)系型數(shù)據(jù)庫(kù);南水北調(diào)
DOI:10.11907/rjdk.171390
中圖分類號(hào):TP301 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-7800(2017)009-0004-03
Abstract:In a relational database can not meet the massive active fault detection and storage file storage efficiency requirements can not be horizontal linear expansion of the problem, try to use non relational database MongoDB massive active fault detection method based on file storage, which makes full use of MongoDB memory file mapping, dynamically add nodes to extend and improve the performance. Taking water source area core active fault management system as an example for testing, analysis, performance comparison test with the traditional relational database storage file results show that this method significantly improved the massive file active fault detection in storage and query efficiency, effectively solved the bottleneck problem of relational database access to unstructured data.
Key Words:MongoDB; active fault; non relational database; the south-to-north water diversion project
0 引言
活斷層突發(fā)性錯(cuò)動(dòng)是引起地震災(zāi)害的主要原因,確定活斷層滑動(dòng)速度、位置等參數(shù),建立相應(yīng)數(shù)據(jù)庫(kù)可幫助社會(huì)有效降低震害損失。美國(guó)地質(zhì)調(diào)查局(USGS)公布了全美范圍內(nèi)第四紀(jì)活斷層與褶皺匯編數(shù)據(jù)庫(kù);新西蘭地質(zhì)與核科學(xué)院(GNS)建成了新西蘭活動(dòng)斷層數(shù)據(jù)庫(kù);1996年中國(guó)已初步建成了第1個(gè)活動(dòng)構(gòu)造數(shù)據(jù)庫(kù)[1],僅存儲(chǔ)了活斷層幾何學(xué)與運(yùn)動(dòng)學(xué)基本信息,信息單一且不具備開放性。隨著多種先進(jìn)技術(shù)探測(cè)手段的運(yùn)用,面對(duì)獲取目標(biāo)區(qū)域最全、最新、精細(xì)化海量探測(cè)文件數(shù)據(jù),怎樣保證數(shù)據(jù)高效分類入庫(kù)及提供高性能查詢服務(wù),是建立開放性活斷層探測(cè)信息管理系統(tǒng)的關(guān)鍵環(huán)節(jié)。
傳統(tǒng)活斷層探測(cè)信息系統(tǒng)采用關(guān)系型數(shù)據(jù)庫(kù)(RDBMS)管理[2]??紤]到多種探測(cè)數(shù)據(jù),特別是地形地貌等遙感數(shù)據(jù)的多時(shí)態(tài)、大數(shù)據(jù)量,且隨時(shí)間推移數(shù)據(jù)量指數(shù)增長(zhǎng)的特點(diǎn),RDBMS難以支撐海量數(shù)據(jù)的存儲(chǔ)擴(kuò)展與高效查詢時(shí)遇到的性能瓶頸問題。非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL)具有高效存儲(chǔ)與訪問、高并發(fā)讀寫、高可用性、高可擴(kuò)展性等特點(diǎn),能極大提高數(shù)據(jù)庫(kù)讀寫性能與系統(tǒng)擴(kuò)展能力,而MongoDB是NoSQL的典型代表。鑒于此,本文提出一種基于MongoDB的海量活斷層探測(cè)文件存儲(chǔ)入庫(kù)方法。
1 MongoDB簡(jiǎn)介
MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù),由C++語言編寫,旨在為應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案[3]。數(shù)據(jù)分不同類型存儲(chǔ)在同一個(gè)數(shù)據(jù)集中,成為一個(gè)集合,支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似JSON的BSON格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型。MongoDB最大的特點(diǎn)是支持的查詢語言非常強(qiáng)大,其語法類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫(kù)單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。
它的特點(diǎn)是高性能、易使用、易部署,存儲(chǔ)數(shù)據(jù)快捷方便。主要功能特性有:①面向集合存儲(chǔ)易存儲(chǔ)對(duì)象類型的數(shù)據(jù);②模式自由;③支持動(dòng)態(tài)查詢;④支持完全索引,包含內(nèi)部對(duì)象;⑤支持查詢;⑥支持復(fù)制與故障恢復(fù);⑦使用高效的二進(jìn)制數(shù)據(jù)存儲(chǔ),包括大型對(duì)象(如視頻等);⑧自動(dòng)處理碎片,以支持云計(jì)算層次的擴(kuò)展性;⑨支持RUBY、PYTHON、JAVA、C++、PHP、C#等多種語言;⑩文件存儲(chǔ)格式為BSON(一種JSON的擴(kuò)展);可通過網(wǎng)絡(luò)訪問。
2 基于MongoDB的存儲(chǔ)原理
2.1 存儲(chǔ)原理
以南水北調(diào)中線核心水源區(qū)活斷層管理系統(tǒng)為例,活斷層數(shù)據(jù)庫(kù)包括的數(shù)據(jù)成果類型比較多,具體包括基礎(chǔ)地理信息(GIS)、地球化學(xué)類探測(cè)數(shù)據(jù)成果、電磁探測(cè)數(shù)據(jù)成果、探地雷達(dá)探測(cè)數(shù)據(jù)成果、深層/淺層地震探測(cè)數(shù)據(jù)成果、地震危害性評(píng)估成果等專業(yè)庫(kù)。
根據(jù)以上文件類型,按文件大小大致分為兩類:第一類,對(duì)于小文件(小于等于16MB),MongoDB使用BSON對(duì)象進(jìn)行文件存儲(chǔ),這類存儲(chǔ)比較簡(jiǎn)單,不贅述;第二類,針對(duì)大于16MB的大文件是采用GridFS規(guī)范進(jìn)行存儲(chǔ)。其中將文件名作為鍵 (Key),具體內(nèi)容數(shù)據(jù)作為值 (Value)[4],GridFS規(guī)范是將大文件分割成許多小塊文件進(jìn)行存儲(chǔ),每塊文件存儲(chǔ)的信息包括兩部分:第一部分存儲(chǔ)自己以及相鄰兩小塊文件的位置信息,第二部分存儲(chǔ)具體數(shù)據(jù)信息,塊與塊之間用塊序號(hào)連接[5]。文件分塊后,信息被存于兩個(gè)集合里,分別是Files(元數(shù)據(jù)對(duì)象)集合與chunks(相關(guān)信息的二進(jìn)制格式)集合。兩子集存儲(chǔ)結(jié)構(gòu)格式如下所示:endprint
Files={
_ID:ObjectId(“2016071500232”),
filename:”test.png”,∥文件名
length:1543,∥文件大?。▎挝蛔止?jié))
ChunkSize:165,∥chunks大小
uploadDate:ISODate(“2016071508351234”),
md5:“XXX”
}
Chunks集合中的file_id與files集合中的_ID相同,chunks集合的文檔格式如下:
chunks={
_ID:ObjectId(“201607234678”),
file_id:ObjectId(“2016071500232”)
n:NumberInt(2),//代表chunks序號(hào),從0開始
data:BinaData(“…”)//數(shù)據(jù)
}
_ID默認(rèn)情況下是MongoDB用時(shí)間戳、進(jìn)程標(biāo)識(shí)(PID)、機(jī)器名等組合關(guān)鍵字計(jì)算獲得的ObjectID,它具有很高的唯一性與很強(qiáng)的辨識(shí)度[6]。
2.2 存儲(chǔ)入庫(kù)方法
各類探測(cè)數(shù)據(jù)不僅涉及文件的存儲(chǔ),還有相關(guān)各類屬性(時(shí)間、大小、備注等)信息需要存儲(chǔ),且文件探測(cè)數(shù)據(jù)的類型不一樣,所需存儲(chǔ)的屬性信息也不同。MongoDB文檔型存儲(chǔ),基于GridFS的大文件型存儲(chǔ)方式都有各自的不足:一方面,文檔型存儲(chǔ)方式雖然能存儲(chǔ)探測(cè)數(shù)據(jù)的屬性信息,但對(duì)于大于16 M的探測(cè)數(shù)據(jù)卻無法有效存儲(chǔ);另一方面,基于GridFS的大文件存儲(chǔ)方式能有效存儲(chǔ)探測(cè)數(shù)據(jù),但不能存儲(chǔ)探測(cè)數(shù)據(jù)的各種屬性信息。
因此,筆者設(shè)計(jì)了一種新的存儲(chǔ)方法,將以上兩種存儲(chǔ)模式優(yōu)勢(shì)互補(bǔ)進(jìn)行有效結(jié)合,以發(fā)揮更大的存儲(chǔ)優(yōu)勢(shì)。首先,將探測(cè)數(shù)據(jù)以GridFS大文件存儲(chǔ)方式寫入保存至數(shù)據(jù)庫(kù)中。其次,利用GridFS提供相應(yīng)的接口自動(dòng)或手動(dòng)錄入來獲取探測(cè)數(shù)據(jù)的相關(guān)屬性信息。第三,將該屬性信息以一條文檔信息形式,通過MongoDB傳統(tǒng)的文檔型存儲(chǔ)模式插入數(shù)據(jù)庫(kù)。此過程中最關(guān)鍵一步是將該探測(cè)數(shù)據(jù)_ID號(hào)作為一條記錄存入文檔信息中,并以此關(guān)聯(lián)探測(cè)數(shù)據(jù)的_ID編號(hào)與文檔的id編號(hào),該方法實(shí)現(xiàn)了用一條文檔中記錄的探測(cè)數(shù)據(jù)_ID編號(hào)即可快速檢索到與該文檔記錄信息對(duì)應(yīng)的探測(cè)數(shù)據(jù)[7]。
3 存儲(chǔ)方法實(shí)現(xiàn)
分兩類實(shí)現(xiàn):一類是大文件利用GridFS方式實(shí)現(xiàn),另一類是屬性數(shù)據(jù)通過BSON方式實(shí)現(xiàn)。第一類GridFS方式讀寫實(shí)現(xiàn)函數(shù)代碼如下:
采用 C#語言開發(fā)的存儲(chǔ)文件函數(shù)如下:
private void UpLoadFile(IMongoDatabase database, string sourceFilename)
{ //建立GridFS 存取對(duì)象
IGridFSBucket bucket = new GridFSBucket(database);
//以流的方式上傳文件
using (var stream = bucket.OpenUploadStream(sourceFilename))
{ var id = stream.Id;
stream.Close();
}
}
讀取文件的函數(shù)如下:
private void DownloadFile(IMongoDB database,string sourceFilename,string targetFilename)
{ //建立GridFS 存取對(duì)象
IGridFSBucket bucket = new GridFSBucket(database);
//建立下載文件目的地
FileStream destination = new FileStream(targetFilename, FileMode.Create);
//以流的方式下載文件
bucket.DownloadToStreamByName(sourceFilename, destination);
using (var stream = bucket.OpenDownloadStreamByName(sourceFilename))
{stream.Close();}
}
對(duì)于屬性數(shù)據(jù),具體存儲(chǔ)的部分實(shí)現(xiàn)代碼如下:
BsonDocument T = new BsonDocument{
{“編號(hào)”,_id},
{“名字”,name},
……
};
Col.Insert(T)
4 應(yīng)用分析
4.1 測(cè)試環(huán)境與實(shí)例
為測(cè)試檢驗(yàn)MongoDB數(shù)據(jù)庫(kù)存取海量探測(cè)文件與屬性信息的性能,在測(cè)試代碼的關(guān)鍵處設(shè)置秒表起止時(shí)間點(diǎn),以統(tǒng)計(jì)所耗時(shí)間。將MongoDB數(shù)據(jù)庫(kù)與Mysql數(shù)據(jù)庫(kù)在讀寫性能方面進(jìn)行比較,目前Mysql支持幾乎所有數(shù)據(jù)類型,且在開源關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)中被認(rèn)為功能是較強(qiáng)大的。
采用的測(cè)試平臺(tái)為:Intel Core i7處理器、8G內(nèi)存、2TB硬盤、Windows10 64位操作系統(tǒng)、C#編程語言、MongoDB版本為3.0、Mysql版本為5.1.48。測(cè)試平臺(tái)軟、硬件環(huán)境如表1所示。
該測(cè)試分兩類,分別測(cè)試大文件插入數(shù)據(jù)庫(kù)性能及從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)效率。以南水北調(diào)中線核心水源區(qū)的探測(cè)文件批量入庫(kù)為例,如圖1所示,進(jìn)行測(cè)試分析。endprint
4.2 存儲(chǔ)性能對(duì)比
分別對(duì)MongoDB3.0與Mysql-5.1.48做30、70、150、300、800、10 000次文件寫入試驗(yàn),文件大小約為30MB/個(gè),兩者的二進(jìn)制文件存儲(chǔ)耗時(shí)(單位:ms)性能對(duì)比結(jié)果如圖2所示。Mysql所耗時(shí)間隨文件個(gè)數(shù)增多而劇增,而MongoDB耗時(shí)變化不大,可以看出,當(dāng)存儲(chǔ)寫入數(shù)據(jù)庫(kù)文件數(shù)量越來越多時(shí),MongoDB的性能優(yōu)勢(shì)越來越明顯。
4.3 查詢性能對(duì)比
分別對(duì)MongoDB3.0與Mysql-5.1.48做數(shù)據(jù)量MB為50、100、200、300、500的查詢性能測(cè)試,從圖3可以看出,MongoDB耗時(shí)(單位:ms)比較小,而Mysql查詢耗時(shí)隨數(shù)據(jù)量增長(zhǎng)變化幅度陡然增大。
5 結(jié)論
本文提出一種基于MongoDB的海量活斷層探測(cè)文件存儲(chǔ)入庫(kù)方法,并與傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)Mysql在存取效率上進(jìn)行性能比對(duì)分析測(cè)試,結(jié)果表明:該方法在數(shù)據(jù)存儲(chǔ)與查詢等性能方面具有顯著優(yōu)勢(shì),特別是數(shù)據(jù)量大時(shí)更加明顯。為更進(jìn)一步深入研究,體現(xiàn)該方法在海量文件數(shù)據(jù)入庫(kù)存儲(chǔ)的優(yōu)勢(shì),同時(shí)為更高層次的應(yīng)用提供有益參考,未來將繼續(xù)開展與其它典型關(guān)系數(shù)據(jù)庫(kù)對(duì)比測(cè)試工作。
參考文獻(xiàn):
[1] 于貴華,鄧起東,鄔倫.利用GIS系統(tǒng)建立中國(guó)活動(dòng)斷裂信息咨詢分析系統(tǒng)[J].地震地質(zhì),1996,18(2):156-160.
[2] 于貴華,徐錫偉,孫怡,等.城市活斷層探測(cè)信息系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)——以福州市活斷層信息管理系統(tǒng)為例[J].地震地質(zhì),2006,28(4):655-662.
[3] ELOISE GIEGERICH. MongoDB certified professional spotlight: may mascenik[EB/OL].http:// blog.mongodb.org.
[4] 霍多羅夫,迪洛爾夫.MongoDB權(quán)威指南[M].北京:人民郵電出版社,2011.
[5] 張艷霞,豐繼林,郝偉,等.基于NoSQL的文件型大數(shù)據(jù)存儲(chǔ)技術(shù)研究[J].制造業(yè)自動(dòng)化,2014,36(3):27-30.
[6] SATTAR ABDUL, LORENZEN, TORBEN, NALLAMADDI, et al. Incorporating NoSQL into a database course[J].ACM Inroads,2013,4(2):50-53.
[7] 劉堅(jiān),李盛樂,戴苗,等.基于Hbase的地震大數(shù)據(jù)存儲(chǔ)研究[J].大地測(cè)量與地球動(dòng)力學(xué),2015,35(5):890-893.
(責(zé)任編輯:何 麗)endprint