來自:軟件人生 - 博客園
出處:http://www.cnblogs.com/nbpowerboy/p/4325692.html(點擊尾部閱讀原文前往)
注: 這個是本人四年前研究測試情況,目前MongoDB最新版本為3.0,已有廣泛的企業(yè)實際應用!
【摘要】當今已進入大數(shù)據(jù)時代,特別是大規(guī)?;ヂ?lián)網(wǎng)web2.0應用不斷發(fā)展及云計算所需要的海量存儲和海量計算發(fā)展,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫已無法滿足這方面的需求。隨著NoSQL數(shù)據(jù)庫的不斷發(fā)展和成熟,可以較好地解決海量存儲和海量計算方面的應用需求。本文重點描述作為NoSQL之一MongoDB數(shù)據(jù)庫在海量數(shù)據(jù)存儲方面的應用。
1、引言
NoSQL,全稱是“Not Only Sql”,指的是非關(guān)系型的數(shù)據(jù)庫。這類數(shù)據(jù)庫主要有這些特點:非關(guān)系型的、分布式、開源的、水平可擴展的。原始目的是為了大規(guī)模web應用,這場全新的數(shù)據(jù)庫革命運動早期就有人提出,發(fā)展至2009年趨勢越發(fā)高漲。非關(guān)系型的數(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等)及其他非關(guān)系型數(shù)據(jù)庫(如FileDB)等。
MongoDB屬于NoSQL數(shù)據(jù)的一種,是由10gen公司提供的一個開源的、模式自由的、面向文檔存儲的、分布式的數(shù)據(jù)庫,是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品。由C 語言編寫,旨在為Web應用提供可擴展的高性能數(shù)據(jù)存儲解決方案。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似Json的Bson格式,因此可以存儲比較復雜的數(shù)據(jù)類型。
他可以運行在Solaris、Linux、Windows和OSX平臺上,支持32位和64位應用,其中在32位應用中單個數(shù)據(jù)庫最大容量為2G,在64位應用中存儲容量大小只與實際存儲空間大小有關(guān),并且提供了Java、C#、PHP、C、C 、Javascript、Python、Ruby、Perl等多種語言的驅(qū)動程序,最新的生產(chǎn)版本為2.0,官方下載地址:http://www.mongodb.org/downloads。目前正在使用他的網(wǎng)站和企業(yè)已超過了100家,如視覺中國、大眾點評網(wǎng)、淘寶網(wǎng)、盛大、Foursquare、Wordnik、OpenShift、SourceForge、Github等。
隨著企業(yè)數(shù)據(jù)不斷積累和增加及Web2.0應用不斷向前發(fā)展,已進入了個人信息時代,對于大中型企業(yè)來說,可能每天將產(chǎn)生大量的數(shù)據(jù),來之于各類系統(tǒng),如各類文檔(OA文檔、項目文檔等)、設(shè)計圖紙、高清圖片、視頻等,對于員工來說,更關(guān)心的是個人信息方面的存儲和計算,當這些信息量足夠大時,想要實時提取或分析數(shù)據(jù),傳統(tǒng)集中式方式難以滿足這方面的需求,因此采用分布式的存儲和計算成為必然的選擇,一方面主要解決海量存儲問題,另一方面解決海量計算問題。采用MongoDB的數(shù)據(jù)庫技術(shù)能有效地解決分布式方面的應用,本文重點分析MongoDB在海量數(shù)據(jù)存儲方面的應用。
2、概述
2.1 MongoDB的主要特點
(1)文件存儲格式為Bson,使用易于掌握和理解的Json風格語法。相對Json來說,Bson擁有更好的性能,主要表現(xiàn)為更快的遍歷速度、操作更簡易、增加了額外的數(shù)據(jù)類型。
(2)模式自由,支持嵌入子文檔和數(shù)組,無需事先創(chuàng)建數(shù)據(jù)結(jié)構(gòu),屬于逆規(guī)范化的數(shù)據(jù)模型,有利于提高查詢速度。
(3)動態(tài)查詢,支持豐富的查詢表達式,使用Json形式的標記,可輕易查詢文檔中內(nèi)嵌的對象和數(shù)組及子文檔。
(4)完整的索引支持,包括文檔內(nèi)嵌對象和數(shù)據(jù),同時還提供了全文索引方式,MongoDB的查詢優(yōu)化器會分析查詢表達式,并生成一個高效的查詢計劃。
(5)使用高效的二進制數(shù)據(jù)存儲,適合存儲大型對象(如高清圖片、視頻等)。
(6)支持多種復制模式,提供冗余及自動故障轉(zhuǎn)移。支持Master-Slave、Replica Pairs/Replica Sets、有限Master-Master模式。
(7)支持服務端腳本和Map/Reduce,可以實現(xiàn)海量數(shù)據(jù)計算,即實現(xiàn)云計算功能。
(8)性能高、速度快。在多數(shù)場合,其查詢速度對于MySQL要快的多,對于CPU占用非常小。部署很簡單,幾乎是零配置。
(9)自動處理碎片,支持自動分片功能實現(xiàn)水平擴展的數(shù)據(jù)庫集群,可以動態(tài)添加或移除節(jié)點。
(10)內(nèi)置GridFS,支持海量存儲。
(11)可通過網(wǎng)絡(luò)訪問,采用高效的MongoDB網(wǎng)絡(luò)協(xié)議,在性能方面要優(yōu)于http或Rest協(xié)議。
(12)第三方支持豐富,MongoDB社區(qū)活躍,越來越多的公司和網(wǎng)站在生產(chǎn)環(huán)境中使用MongoDB進行技術(shù)架構(gòu)優(yōu)化,同時由10gen公司官方提供強大技術(shù)支持。
2.2 MongoDB的適用場景
MongoDB的主要目標是在鍵/值存儲方式(提供了高性能和高度伸縮性)以及傳統(tǒng)的RDBMS系統(tǒng)(豐富的功能)架起一座橋梁,集兩者的優(yōu)勢于一身。
(1)網(wǎng)站數(shù)據(jù):MongoDB非常適合實時的插入,更新與查詢,并具備網(wǎng)站實時數(shù)據(jù)存儲所需的復制及高度伸縮性。
(2)緩存:由于性能很高,MongoDB也適合作為信息基礎(chǔ)設(shè)施的緩存層。在系統(tǒng)重啟之后,由MongoDB搭建的持久化緩存層可以避免下層的數(shù)據(jù)源過載。
(3)大尺寸,低價值的數(shù)據(jù):使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫存儲一些數(shù)據(jù)時可能會比較昂貴,在此之前,很多時候程序員往往會選擇傳統(tǒng)的文件進行存儲。
(4)高伸縮性的場景:MongoDB非常適合由數(shù)十或數(shù)百臺服務器組成的數(shù)據(jù)庫。MongoDB的路線圖中已經(jīng)包含對MapReduce
引擎的內(nèi)置支持。
(5)用于對象及JSON數(shù)據(jù)的存儲:MongoDB的Bson數(shù)據(jù)格式非常適合文檔化格式的存儲及查詢。
2.3 MongoDB的體系結(jié)構(gòu)
MongoDB是由一系列物理文件(數(shù)據(jù)文件,日志文件等)的集合與之對應的邏輯結(jié)構(gòu)(集合、文檔等)構(gòu)成的數(shù)據(jù)庫。
MongoDB的邏輯結(jié)構(gòu)實際是一種層次結(jié)構(gòu),由文檔(document,相當于關(guān)系數(shù)據(jù)庫中的row)、集合(collection,相當于關(guān)系數(shù)據(jù)庫中的table)、數(shù)據(jù)庫(database,相當于關(guān)系數(shù)據(jù)庫中的database)這三部分組成。
一個MongoDB實例支持多個數(shù)據(jù)庫。在MongoDB內(nèi)部,每個數(shù)據(jù)庫都包含一個.ns文件和一些數(shù)據(jù)文件,采用預分配空間的機制,始終保持額外的空間和空余的數(shù)據(jù)文件,從而有效避免了由于數(shù)據(jù)暴增帶來的磁盤壓力過大問題。每個預分配的文件都用0進行填充,數(shù)據(jù)文件每新分配一次,他的大小都會是上一個數(shù)據(jù)文件大小的2倍,每個數(shù)據(jù)文件最大為2G。
2.4 MongoDB與MS SQL Server的語句對照
MongoDB提供了功能豐富的查詢表達式,可以實現(xiàn)絕大多數(shù)關(guān)系數(shù)據(jù)庫的sql語句功能,以表employee(id,name,age)舉例對照說明,如下圖1所示。
圖1 MongoDB與MS SQL Server語句對照
3、過程分析與測試
3.1 GridFS概述
由于MongoDB中的Bson對象大小是有限制的,在1.7版本以前單個Bson對象最大容量為4M,1.7版本以后單個Bson對象最大容量為16M[5]。對于一般的文件存儲,單個對象的4到16M的存儲容量能夠滿足需求,但無法滿足對于一些大文件的存儲,如高清圖片、設(shè)計圖紙、視頻等,因此在海量數(shù)據(jù)存儲方面,MongoDB提供了內(nèi)置的Grid
FS,可以將一個大文件分割成為多個較小的文檔,可以指定文件分塊標準,對用戶是透明的。GridFS使用兩個數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù):files(包含元數(shù)據(jù)對象)、chunks(包含其他一些相關(guān)信息的二進制塊)。為了使多個GridFS命名為一個單一的數(shù)據(jù)庫,文件和塊都有一個前綴,默認前綴為fs,用戶有權(quán)改變這個前綴。
GridFS對Java、C#、Perl、PHP、Python、Ruby等程序言語均支持,且提供了良好的API接口。
3.2 基于GridFS的海量數(shù)據(jù)存儲測試
本文主要采用MongoDB最新版2.0及官方提供的C#語言驅(qū)動進行測試,C#驅(qū)動下載地址:https://github.com/mongodb/Mongo-csharp-driver。
MongoDB在bin目錄下提供了一系列有用的工具,可以很方便的進行運維管理:
(1)bsondump:將Bson格式的文件轉(zhuǎn)儲為Json格式的數(shù)據(jù)。
(2)mongo:客戶端命令行工具,支持js語法。
(3)mongod:數(shù)據(jù)庫服務端,每個實例啟動一個進程,可以fork為后臺運行。
(4)mongodump:數(shù)據(jù)庫備份工具。
(5)mongorestore:數(shù)據(jù)庫恢復工具。
(6)mongoexport:數(shù)據(jù)導出工具。
(7)mongoimport:數(shù)據(jù)導入工具。
(8)mongofiles:GridFS管理工具,可實現(xiàn)二進制文件的存取。
(9)mongos:分片路由,如果使用了sharding功能,則應用程序連接的是mongos,而非mongod。
(10)mongosniff:這一工具的作用類似于tcpdump,不同的是他只監(jiān)控MongoDB相關(guān)包請求,并且是以指定的可讀性的形式輸出。
(11)mongostat:實時性能監(jiān)控工具。
同時有好幾個第三方提供的客戶端圖形工具,如MongoVUE、RockMongo、MongoHub等,方便管理和維護。
GridFS結(jié)合自動分片及自動復制技術(shù),可以實現(xiàn)高性能的分布式數(shù)據(jù)庫集群架構(gòu),從而進行海量數(shù)據(jù)存儲,如下圖2所示。
圖2 高性能的分布式數(shù)據(jù)庫集群架構(gòu)
MongoDB Sharding Cluster需要三種角色:
(1)Shard Server:即存儲實際數(shù)據(jù)的分片,每個Shard可以是一個mongod實例,也可以是一組mongod實例構(gòu)成的Replica Set。
key范圍、chunk在各shard的分布情況、該集群中所有DB和collection的sharding配置信息。
(3)Route Process:這是一個前端路由,客戶端由此接入,然后詢問Config Servers需要到哪個shard上查詢或保存記錄,再連接相應的shard進行操作,最后將結(jié)果返回給客戶端,而這一切對客戶端是透明的,客戶端不用關(guān)心所操作的記錄存儲在哪個shard上。
為了測試方便,下面在同一臺物理機器上構(gòu)建一個簡單的Sharding Cluster,如下圖3所示。
圖3 簡單的Sharding Cluster架構(gòu)圖
配置測試環(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。
啟動相關(guān)服務進程:
c:\mongodb 2.0.0\bin>mongod --shardsvr --dbpath 'c:\mongodb 2.0.0\db' --port 27020
d:\mongodb 2.0.0\bin>mongod --shardsvr --dbpath 'd:\mongodb 2.0.0\db' --port 27021
e:\mongodb 2.0.0\bin>mongod --configsvr --dbpath 'e:\mongodb 2.0.0\db' --port 27022
e:\mongodb 2.0.0\bin>mongos --configdb 127.0.0.1:27022
配置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轉(zhuǎn)/分)。
由于本機是32位操作系統(tǒng),因此單個服務實例只支持GridFS的文件容量大小為0.9G左右,由于采用了兩臺Shard服務實例,可以支持存儲的文件總?cè)萘看笮?.8G左右,如果是64位操作系統(tǒng)就沒有此限制。
本文主要測試GridFS采用循環(huán)插入大容量文件的性能和分片容量大小,測試結(jié)果,如下圖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ù)存儲的應用需求。
圖5 GridFS大容量文件測試結(jié)果
圖6 GridFS大容量文件分片信息
4、結(jié)論
隨著企業(yè)和個人數(shù)據(jù)的不斷擴大,隨著云計算的高速發(fā)展,越來越多的應用需要存儲海量數(shù)據(jù),并且對高并發(fā)和處理海量數(shù)據(jù)提出了更高的要求,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫對于這些應用場景難以滿足應用需求,而作為NoSQL數(shù)據(jù)庫之一的MongoDB數(shù)據(jù)庫能夠完全滿足和解決在海量數(shù)據(jù)存儲方面的應用,越來越多的大網(wǎng)站和企業(yè)選擇MongoDB代替Mysql進行存儲。
注: 這個是本人四年前研究測試情況,目前MongoDB最新版本為3.0,已有廣泛的企業(yè)實際應用!
●本文編號171,以后想閱讀這篇文章直接輸入171即可。
●輸入m可以獲取到文章目錄
聯(lián)系客服