注: 這個是本人四年前研究測試情況,目前MongoDB最新版本為3.0,已有廣泛的企業(yè)實際應用! 【摘要】當今已進入大數(shù)據(jù)時代,特別是大規(guī)?;ヂ?lián)網(wǎng)web2.0應用不斷發(fā)展及云計算所需要的海量存儲和海量計算發(fā)展,傳統(tǒng)的關系型數(shù)據(jù)庫已無法滿足這方面的需求。隨著NoSQL數(shù)據(jù)庫的不斷發(fā)展和成熟,可以較好地解決海量存儲和海量計算方面的應用需求。本文重點描述作為NoSQL之一MongoDB數(shù)據(jù)庫在海量數(shù)據(jù)存儲方面的應用。 1、引言 NoSQL,全稱是“Not Only Sql”,指的是非關系型的數(shù)據(jù)庫。這類數(shù)據(jù)庫主要有這些特點:非關系型的、分布式、開源的、水平可擴展的。原始目的是為了大規(guī)模web應用,這場全新的數(shù)據(jù)庫革命運動早期就有人提出,發(fā)展至2009年趨勢越發(fā)高漲。非關系型的數(shù)據(jù)存儲通常的應用如:模式自有、支持簡易復制、簡單的API、最終的一致性(非ACID)、大容量數(shù)據(jù)等。它的種類繁多,如列式數(shù)據(jù)庫(Hadoop/HBase、Cassandra、Hypertable、Amazon SimpleDB等)、文檔型數(shù)據(jù)庫(MongoDB、CouchDB、OrientDB等)、鍵值數(shù)據(jù)庫(Azure Table Storage、MEMBASE、Redis、Berkeley DB、MemcacheDB等)、圖形數(shù)據(jù)庫(Neo4J、Infinite Graph、Sones、Bigdata等)、面向?qū)ο髷?shù)據(jù)庫(db4o、Versant、Objectivity、Starcounter等)、網(wǎng)格及云數(shù)據(jù)庫(GigaSpaces、Queplix、Hazelcast等)、XML數(shù)據(jù)庫(Mark Logic Server、EMC Documentum xDB、BaseX、Berkeley DB XML等)、多值數(shù)據(jù)庫(U2、OpenInsight、OpenQM等)及其他非關系型數(shù)據(jù)庫(如FileDB)等。
2、概述 2.1 MongoDB的主要特點 (1)文件存儲格式為Bson,使用易于掌握和理解的Json風格語法。相對Json來說,Bson擁有更好的性能,主要表現(xiàn)為更快的遍歷速度、操作更簡易、增加了額外的數(shù)據(jù)類型。
(5)使用高效的二進制數(shù)據(jù)存儲,適合存儲大型對象(如高清圖片、視頻等)。
2.2 MongoDB的適用場景
(3)大尺寸,低價值的數(shù)據(jù):使用傳統(tǒng)的關系型數(shù)據(jù)庫存儲一些數(shù)據(jù)時可能會比較昂貴,在此之前,很多時候程序員往往會選擇傳統(tǒng)的文件進行存儲。
圖1 MongoDB與MS SQL Server語句對照 3、過程分析與測試 3.1 GridFS概述 由于MongoDB中的Bson對象大小是有限制的,在1.7版本以前單個Bson對象最大容量為4M,1.7版本以后單個Bson對象最大容量為16M[5]。對于一般的文件存儲,單個對象的4到16M的存儲容量能夠滿足需求,但無法滿足對于一些大文件的存儲,如高清圖片、設計圖紙、視頻等,因此在海量數(shù)據(jù)存儲方面,MongoDB提供了內(nèi)置的Grid FS,可以將一個大文件分割成為多個較小的文檔,可以指定文件分塊標準,對用戶是透明的。GridFS使用兩個數(shù)據(jù)結構來存儲數(shù)據(jù):files(包含元數(shù)據(jù)對象)、chunks(包含其他一些相關信息的二進制塊)。為了使多個GridFS命名為一個單一的數(shù)據(jù)庫,文件和塊都有一個前綴,默認前綴為fs,用戶有權改變這個前綴。
GridFS結合自動分片及自動復制技術,可以實現(xiàn)高性能的分布式數(shù)據(jù)庫集群架構,從而進行海量數(shù)據(jù)存儲,如下圖2所示。 圖2 高性能的分布式數(shù)據(jù)庫集群架構 MongoDB Sharding Cluster需要三種角色: (1)Shard Server:即存儲實際數(shù)據(jù)的分片,每個Shard可以是一個mongod實例,也可以是一組mongod實例構成的Replica Set。 key范圍、chunk在各shard的分布情況、該集群中所有DB和collection的sharding配置信息。 (3)Route Process:這是一個前端路由,客戶端由此接入,然后詢問Config Servers需要到哪個shard上查詢或保存記錄,再連接相應的shard進行操作,最后將結果返回給客戶端,而這一切對客戶端是透明的,客戶端不用關心所操作的記錄存儲在哪個shard上。 為了測試方便,下面在同一臺物理機器上構建一個簡單的Sharding Cluster,如下圖3所示。 圖3 簡單的Sharding Cluster架構圖
配置測試環(huán)境如下: 模擬2個Shard服務器和1個Config服務器,均運行在本機127.0.0.1上,只是端口不同: (1)Shard Server1:127.0.0.1:27020。 (2)Shard Server2:127.0.0.1:27021。 (3)Config Server:127.0.0.1:27022。 (4)Route Process:127.0.0.1:27017。 啟動相關服務進程:
配置Sharding: (1)e:\mongodb 2.0.0\bin>mongo (2)use admin (3)db.runCommand( { addshard : '127.0.0.1:27020', allowLocal : 1, maxSize:2 , minKey:1, maxKey:10 } ) (4)db.runCommand( { addshard : '127.0.0.1:27021', allowLocal : 1, minKey:100 } ) (5)config =connect('127.0.0.1:27022') (6)config = config.getSisterDB('config') (7)ecDocs=db.getSisterDB('ecDocs') (8)db.runCommand({enablesharding:'ecDocs'}) (9)db.runCommand( { shardcollection : 'ecDocs.filedocs.chunks', key : { files_id : 1 } } ) (10)db.runCommand( { shardcollection : 'ecDocs.filedocs.files', key : { _id : 1 } } ) 以上的ecDocs是指數(shù)據(jù)庫名,filedocs是指用戶自定義的GridFS的文件集合名,系統(tǒng)默認文件集合名為fs。 使用官方提供的C#驅(qū)動,需要在程序中引用 MongoDB.Driver.dllMongoDB.Bson.dll,循環(huán)添加同一文件到GridFS示例代碼,如下圖4所示。 圖4 循環(huán)添加同一文件到GridFS代碼
測試配置環(huán)境如下: 操作系統(tǒng):WindowsXP專業(yè)版32位SP3。 處理器(CPU):英特爾Xeon(至強)W3503@2.40GHz。 內(nèi)存:3567MB(DDR31333MHz/FLASH)。 硬盤:希捷ST3250318AS(250GB/7200轉/分)。 由于本機是32位操作系統(tǒng),因此單個服務實例只支持GridFS的文件容量大小為0.9G左右,由于采用了兩臺Shard服務實例,可以支持存儲的文件總容量大小為1.8G左右,如果是64位操作系統(tǒng)就沒有此限制。 本文主要測試GridFS采用循環(huán)插入大容量文件的性能和分片容量大小,測試結果,如下圖5所示。 從圖5可以看出,第1到3步驟,只添加單個文件時,Shard2并沒有產(chǎn)生分片數(shù)據(jù),只有測試到步驟4連續(xù)添加100個相同文件時Shard2才產(chǎn)生分片數(shù)據(jù),并且添加三四百兆的單個文件,只需11秒多就完成了操作,而即使通過文件拷貝方式這么大的文件也至少需要二三十秒才能完成,可見MongoDB在大容量文件存儲方面擁有非常高的性能。 通過在客戶端的mongo工具輸入db.printShardingStatus()命令可以查看詳細分片情況,如下圖6所示。 從圖6可以看出,在shard1中分配了6個chunks,在shard2中分配了7個chunks,分片數(shù)據(jù)相對還是比較均勻的。 從以上的測試可以得知,采用GridFS可以存儲海量數(shù)據(jù),并且可以通過廉價服務器進行大規(guī)模數(shù)據(jù)庫集群,非常容易擴展部署,程序編碼也非常容易,因此能夠有效支持云存儲的應用,能夠滿足大規(guī)模數(shù)據(jù)存儲的應用需求。
圖6 GridFS大容量文件分片信息 4、結論 隨著企業(yè)和個人數(shù)據(jù)的不斷擴大,隨著云計算的高速發(fā)展,越來越多的應用需要存儲海量數(shù)據(jù),并且對高并發(fā)和處理海量數(shù)據(jù)提出了更高的要求,傳統(tǒng)的關系型數(shù)據(jù)庫對于這些應用場景難以滿足應用需求,而作為NoSQL數(shù)據(jù)庫之一的MongoDB數(shù)據(jù)庫能夠完全滿足和解決在海量數(shù)據(jù)存儲方面的應用,越來越多的大網(wǎng)站和企業(yè)選擇MongoDB代替Mysql進行存儲。 注: 這個是本人四年前研究測試情況,目前MongoDB最新版本為3.0,已有廣泛的企業(yè)實際應用! ●本文編號171,以后想閱讀這篇文章直接輸入171即可。 ●輸入m可以獲取到文章目錄 |
|