當(dāng)今已進(jìn)入大數(shù)據(jù)時(shí)代,特別是大規(guī)模互聯(lián)網(wǎng)web2.0應(yīng)用不斷發(fā)展及云計(jì)算所需要的海量存儲(chǔ)和海量計(jì)算發(fā)展,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)已無(wú)
【摘要】當(dāng)今已進(jìn)入大數(shù)據(jù)時(shí)代,特別是大規(guī)模互聯(lián)網(wǎng)web2.0應(yīng)用不斷發(fā)展及云計(jì)算所需要的海量存儲(chǔ)和海量計(jì)算發(fā)展,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)已無(wú)法滿足這方面的需求。隨著NoSQL數(shù)據(jù)庫(kù)的不斷發(fā)展和成熟,可以較好地解決海量存儲(chǔ)和海量計(jì)算方面的應(yīng)用需求。本文重點(diǎn)描述作為NoSQL之一MongoDB數(shù)據(jù)庫(kù)在海量數(shù)據(jù)存儲(chǔ)方面的應(yīng)用。
1 引言
NoSQL,全稱(chēng)是“Not Only Sql”,指的是非關(guān)系型的數(shù)據(jù)庫(kù)。這類(lèi)數(shù)據(jù)庫(kù)主要有這些特點(diǎn):非關(guān)系型的、分布式、開(kāi)源的、水平可擴(kuò)展的。原始目的是為了大規(guī)模web應(yīng)用,這場(chǎng)全新的數(shù)據(jù)庫(kù)革命運(yùn)動(dòng)早期就有人提出,發(fā)展至2009年趨勢(shì)越發(fā)高漲。非關(guān)系型的數(shù)據(jù)存儲(chǔ)通常的應(yīng)用如:模式自有、支持簡(jiǎn)易復(fù)制、簡(jiǎn)單的API、最終的一致性(非ACID)、大容量數(shù)據(jù)等。它的種類(lèi)繁多,如列式數(shù)據(jù)庫(kù)(Hadoop/HBase、Cassandra、Hypertable、Amazon SimpleDB等)、文檔型數(shù)據(jù)庫(kù)(MongoDB、CouchDB、OrientDB等)、鍵值數(shù)據(jù)庫(kù)(Azure Table Storage、MEMBASE、Redis、Berkeley DB、MemcacheDB等)、圖形數(shù)據(jù)庫(kù)(Neo4J、Infinite Graph、Sones、Bigdata等)、面向?qū)ο髷?shù)據(jù)庫(kù)(db4o、Versant、Objectivity、Starcounter等)、網(wǎng)格及云數(shù)據(jù)庫(kù)(GigaSpaces、Queplix、Hazelcast等)、XML數(shù)據(jù)庫(kù)(Mark Logic Server、EMC Documentum xDB、BaseX、Berkeley DB XML等)、多值數(shù)據(jù)庫(kù)(U2、OpenInsight、OpenQM等)及其他非關(guān)系型數(shù)據(jù)庫(kù)(如FileDB)等。
MongoDB屬于NoSQL數(shù)據(jù)的一種,是由10gen公司提供的一個(gè)開(kāi)源的、模式自由的、面向文檔存儲(chǔ)的、分布式的數(shù)據(jù)庫(kù),是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品。由C++語(yǔ)言編寫(xiě),旨在為Web應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類(lèi)似Json的Bson格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類(lèi)型。
他可以運(yùn)行在Solaris、Linux、Windows和OSX平臺(tái)上,支持32位和64位應(yīng)用,其中在32位應(yīng)用中單個(gè)數(shù)據(jù)庫(kù)最大容量為2G,在64位應(yīng)用中存儲(chǔ)容量大小只與實(shí)際存儲(chǔ)空間大小有關(guān),并且提供了Java、C#、PHP、C、C++、Javascript、Python、Ruby、Perl等多種語(yǔ)言的驅(qū)動(dòng)程序,最新的生產(chǎn)版本為2.0,官方下載地址:。目前正在使用他的網(wǎng)站和企業(yè)已超過(guò)了100家,如視覺(jué)中國(guó)、大眾點(diǎn)評(píng)網(wǎng)、淘寶網(wǎng)、盛大、Foursquare、Wordnik、OpenShift、SourceForge、Github等。
隨著企業(yè)數(shù)據(jù)不斷積累和增加及Web2.0應(yīng)用不斷向前發(fā)展,已進(jìn)入了個(gè)人信息時(shí)代,對(duì)于大中型企業(yè)來(lái)說(shuō),可能每天將產(chǎn)生大量的數(shù)據(jù),來(lái)之于各類(lèi)系統(tǒng),如各類(lèi)文檔(OA文檔、項(xiàng)目文檔等)、設(shè)計(jì)圖紙、高清圖片、視頻等,對(duì)于員工來(lái)說(shuō),更關(guān)心的是個(gè)人信息方面的存儲(chǔ)和計(jì)算,當(dāng)這些信息量足夠大時(shí),想要實(shí)時(shí)提取或分析數(shù)據(jù),傳統(tǒng)集中式方式難以滿足這方面的需求,因此采用分布式的存儲(chǔ)和計(jì)算成為必然的選擇,一方面主要解決海量存儲(chǔ)問(wèn)題,另一方面解決海量計(jì)算問(wèn)題。采用MongoDB的數(shù)據(jù)庫(kù)技術(shù)能有效地解決分布式方面的應(yīng)用,本文重點(diǎn)分析MongoDB在海量數(shù)據(jù)存儲(chǔ)方面的應(yīng)用。
2 概述
2.1 MongoDB的主要特點(diǎn)
(1)文件存儲(chǔ)格式為Bson,使用易于掌握和理解的Json風(fēng)格語(yǔ)法。相對(duì)Json來(lái)說(shuō),Bson擁有更好的性能,主要表現(xiàn)為更快的遍歷速度、操作更簡(jiǎn)易、增加了額外的
數(shù)據(jù)類(lèi)型。
(2)模式自由,支持嵌入子文檔和數(shù)組,無(wú)需事先創(chuàng)建數(shù)據(jù)結(jié)構(gòu),屬于逆規(guī)范化的數(shù)據(jù)模型,有利于提高查詢(xún)速度。
(3)動(dòng)態(tài)查詢(xún),支持豐富的查詢(xún)表達(dá)式,使用Json形式的標(biāo)記,可輕易查詢(xún)文檔中內(nèi)嵌的對(duì)象和數(shù)組及子文檔。
(4)完整的索引支持,包括文檔內(nèi)嵌對(duì)象和數(shù)據(jù),同時(shí)還提供了全文索引方式,MongoDB的查詢(xún)優(yōu)化器會(huì)分析查詢(xún)表達(dá)式,并生成一個(gè)高效的查詢(xún)計(jì)劃。
(5)使用高效的二進(jìn)制數(shù)據(jù)存儲(chǔ),適合存儲(chǔ)大型對(duì)象(如高清圖片、視頻等)。
(6)支持多種復(fù)制模式,提供冗余及自動(dòng)故障轉(zhuǎn)移。支持Master-Slave、Replica Pairs/Replica Sets、有限Master-Master模式。
(7)支持服務(wù)端腳本和Map/Reduce,可以實(shí)現(xiàn)海量數(shù)據(jù)計(jì)算,即實(shí)現(xiàn)云計(jì)算功能。
(8)性能高、速度快。在多數(shù)場(chǎng)合,其查詢(xún)速度對(duì)于MySQL要快的多,對(duì)于CPU占用非常小。部署很簡(jiǎn)單,幾乎是零配置。
(9)自動(dòng)處理碎片,支持自動(dòng)分片功能實(shí)現(xiàn)水平擴(kuò)展的數(shù)據(jù)庫(kù)集群,可以動(dòng)態(tài)添加或移除節(jié)點(diǎn)。
(10)內(nèi)置GridFS,支持海量存儲(chǔ)。
(11)可通過(guò)網(wǎng)絡(luò)訪問(wèn),采用高效的MongoDB網(wǎng)絡(luò)協(xié)議,在性能方面要優(yōu)于http或Rest協(xié)議。
(12)第三方支持豐富,MongoDB社區(qū)活躍,越來(lái)越多的公司和網(wǎng)站在生產(chǎn)環(huán)境中使用MongoDB進(jìn)行技術(shù)架構(gòu)優(yōu)化,同時(shí)由10gen公司官方提供強(qiáng)大技術(shù)支持。
2.2 MongoDB的適用場(chǎng)景
MongoDB的主要目標(biāo)是在鍵/值存儲(chǔ)方式(提供了高性能和高度伸縮性)以及傳統(tǒng)的RDBMS系統(tǒng)(豐富的功能)架起一座橋梁,集兩者的優(yōu)勢(shì)于一身。
(1)網(wǎng)站數(shù)據(jù):MongoDB非常適合實(shí)時(shí)的插入,更新與查詢(xún),并具備網(wǎng)站實(shí)時(shí)數(shù)據(jù)存儲(chǔ)所需的復(fù)制及高度伸縮性。
(2)緩存:由于性能很高,MongoDB也適合作為信息基礎(chǔ)設(shè)施的緩存層。在系統(tǒng)重啟之后,由MongoDB搭建的持久化緩存層可以避免下層的數(shù)據(jù)源過(guò)載。
(3)大尺寸,低價(jià)值的數(shù)據(jù):使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)一些數(shù)據(jù)時(shí)可能會(huì)比較昂貴,在此之前,很多時(shí)候程序員往往會(huì)選擇傳統(tǒng)的文件進(jìn)行存儲(chǔ)。
(4)高伸縮性的場(chǎng)景:MongoDB非常適合由數(shù)十或數(shù)百臺(tái)服務(wù)器組成的數(shù)據(jù)庫(kù)。MongoDB的路線圖中已經(jīng)包含對(duì)MapReduce
引擎的內(nèi)置支持。
(5)用于對(duì)象及JSON數(shù)據(jù)的存儲(chǔ):MongoDB的Bson數(shù)據(jù)格式非常適合文檔化格式的存儲(chǔ)及查詢(xún)。
2.3 MongoDB的體系結(jié)構(gòu)
MongoDB是由一系列物理文件(數(shù)據(jù)文件,日志文件等)的集合與之對(duì)應(yīng)的邏輯結(jié)構(gòu)(集合、文檔等)構(gòu)成的數(shù)據(jù)庫(kù)。
MongoDB的邏輯結(jié)構(gòu)實(shí)際是一種層次結(jié)構(gòu),由文檔(document,相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)中的row)、集合(collection,相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)中的table)、數(shù)據(jù)庫(kù)(database,相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)中的database)這三部分組成。
一個(gè)MongoDB實(shí)例支持多個(gè)數(shù)據(jù)庫(kù)。在MongoDB內(nèi)部,每個(gè)數(shù)據(jù)庫(kù)都包含一個(gè).ns文件和一些數(shù)據(jù)文件,采用預(yù)分配空間的機(jī)制,始終保持額外的空間和空余的數(shù)據(jù)文件,從而有效避免了由于數(shù)據(jù)暴增帶來(lái)的磁盤(pán)壓力過(guò)大問(wèn)題。每個(gè)預(yù)分配的文件都用0進(jìn)行填充,數(shù)據(jù)文件每新分配一次,他的大小都會(huì)是上一個(gè)數(shù)據(jù)文件大小的2倍,每個(gè)數(shù)據(jù)文件最大為2G。
2.4 MongoDB與MS SQL Server的語(yǔ)句對(duì)照
MongoDB提供了功能豐富的查詢(xún)表達(dá)式,可以實(shí)現(xiàn)絕大多數(shù)關(guān)系數(shù)據(jù)庫(kù)的sql語(yǔ)句功能,以表employee(id,name,age)舉例對(duì)照說(shuō)明,如下圖1所示。
圖1 MongoDB與MS SQL Server語(yǔ)句對(duì)照
3 過(guò)程分析與測(cè)試
3.1 GridFS概述
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com