MongoDB 第1章 MongoDB介紹
MongoDB是一個(gè)高性能、開(kāi)源、無(wú)模式的文檔型數(shù)據(jù)庫(kù),是當(dāng)前NoSQL數(shù)據(jù)庫(kù)產(chǎn)品中最熱門(mén)的一種,它在許多場(chǎng)景下可用于替代關(guān)系型數(shù)據(jù)庫(kù)或者鍵/值存儲(chǔ)方式,MongoDB使用C++開(kāi)發(fā),MongoDB的官網(wǎng)是地址是:http://www.mongodb.org/,可以在此獲得更多的詳細(xì)信息。
1.1、為什么要用NoSQL
1.1.1、NoSQL簡(jiǎn)介
NoSQL,全程N(yùn)ot 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ā)高漲,NoSQL的擁護(hù)者們提倡運(yùn)用非關(guān)系型的數(shù)據(jù)存儲(chǔ),通常的應(yīng)用如:模式自由、支持建議復(fù)制、簡(jiǎn)單的API、最終的一致性(非ACID)、大容量數(shù)據(jù)等,NoSQL被我們用得最多得當(dāng)數(shù)key-value存儲(chǔ),當(dāng)然還有其他的文檔、列存儲(chǔ)、圖型數(shù)據(jù)庫(kù)、xml數(shù)據(jù)庫(kù)等,相對(duì)于目前鋪天蓋地的關(guān)系型數(shù)據(jù)庫(kù)運(yùn)用,這一概念無(wú)疑是一種全新思維的注入。
1.1.2、發(fā)展現(xiàn)狀
現(xiàn)今的計(jì)算機(jī)體系結(jié)構(gòu)在數(shù)據(jù)存儲(chǔ)方法要求應(yīng)用架構(gòu)具備龐大的水平擴(kuò)展性,而NoSQL正在致力于改變這一現(xiàn)狀,目前新浪微博的Redis和Google的Bitable以及Amazon的SimpleDB使用的就是NoSQL型的數(shù)據(jù)庫(kù),NoSQL項(xiàng)目的名字上看不出什么相同之處,但是它們通常在某些方面相同:它們可以處理超大量的數(shù)據(jù)。
這場(chǎng)革命目前仍需等待,NoSQL對(duì)于大型企業(yè)來(lái)說(shuō)還不是主流,但是一兩年之后就會(huì)變個(gè)樣子,在NoSQL運(yùn)動(dòng)的最新一次聚會(huì)中,來(lái)自世界各地的150人,擠滿(mǎn)了CBS Interactive的一間會(huì)議室,分享他們?nèi)绾瓮品徛嘿F的關(guān)系數(shù)據(jù)庫(kù)的暴政,怎樣使用有效和更便宜的方法來(lái)管理數(shù)據(jù)。
關(guān)系型數(shù)據(jù)庫(kù)給你強(qiáng)加了太多的東西,它們要你強(qiáng)行修改對(duì)象數(shù)據(jù),以滿(mǎn)足數(shù)據(jù)庫(kù)新系統(tǒng)的需要,在NoSQL擁護(hù)者們來(lái)看,基于NoSQL的數(shù)據(jù)庫(kù)替代方案,只是給你所需要的。
1.1.3、為什么是NoSQL
隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,非關(guān)系型數(shù)據(jù)庫(kù)現(xiàn)在成為了一個(gè)及其熱門(mén)的新領(lǐng)域,非關(guān)系型數(shù)據(jù)庫(kù)產(chǎn)品的發(fā)展非常迅速,而傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)在應(yīng)付web2.0網(wǎng)站,特別是超大規(guī)模和高并發(fā)的SNS類(lèi)型的web2.0純動(dòng)態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了難以克服的問(wèn)題,比如:
1、High performance 對(duì)數(shù)據(jù)庫(kù)高并發(fā)寫(xiě)的需求。
web2.0網(wǎng)站要根據(jù)用戶(hù)個(gè)性化信息來(lái)實(shí)時(shí)生成動(dòng)態(tài)頁(yè)面和提供動(dòng)態(tài)信息,所以基本上無(wú)法使用動(dòng)態(tài)網(wǎng)頁(yè)靜態(tài)化技術(shù),因此數(shù)據(jù)庫(kù)并發(fā)負(fù)載非常高,往往要達(dá)到每秒上萬(wàn)次讀寫(xiě)請(qǐng)求,關(guān)系型數(shù)據(jù)庫(kù)應(yīng)付上萬(wàn)次的SQL查詢(xún)還勉強(qiáng)頂?shù)米。菓?yīng)付上萬(wàn)次的SQL寫(xiě)數(shù)據(jù)請(qǐng)求,硬盤(pán)IO就已經(jīng)無(wú)法承受了,其實(shí)對(duì)于普通的BBS網(wǎng)站,往往也存在對(duì)高并發(fā)寫(xiě)請(qǐng)求的需求。
2、Huge Storage 對(duì)海量數(shù)據(jù)的高效存儲(chǔ)和訪問(wèn)的需求。
對(duì)于大型的SNS網(wǎng)站,每天用戶(hù)產(chǎn)生海量的用戶(hù)動(dòng)態(tài)信息,以國(guó)外的Friend feed為例子,一個(gè)月就達(dá)到了2.5億條用戶(hù)動(dòng)態(tài),對(duì)于關(guān)系型數(shù)據(jù)庫(kù)來(lái)說(shuō),在一張2.5億條記錄的表里進(jìn)行SQL查詢(xún),效率是極其低下乃至不可忍受的,再如大型web網(wǎng)站用戶(hù)登錄系統(tǒng),比如騰訊、盛大、動(dòng)輒數(shù)億計(jì)的賬號(hào)、關(guān)系數(shù)據(jù)庫(kù)也很難以應(yīng)付。
3、High Scalability && High Availability 對(duì)數(shù)據(jù)庫(kù)的高擴(kuò)展性和高可用性的需求。
在基于web的架構(gòu)當(dāng)中,數(shù)據(jù)庫(kù)是最難進(jìn)行橫向擴(kuò)展的,當(dāng)一個(gè)應(yīng)用系統(tǒng)的用戶(hù)量和訪問(wèn)量與日俱增時(shí),你的數(shù)據(jù)庫(kù)卻沒(méi)有辦法像web server和app server那樣簡(jiǎn)單的通過(guò)添加更多的硬件和服務(wù)節(jié)點(diǎn)來(lái)擴(kuò)展性能和負(fù)載能力,對(duì)于很多需要提供24小時(shí)不間斷服務(wù)的網(wǎng)站來(lái)說(shuō),對(duì)數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行升級(jí)和擴(kuò)展是非常痛苦的事情,往往需要停機(jī)維護(hù)和數(shù)據(jù)遷移,可是停機(jī)維護(hù)隨之帶來(lái)的就是公司收入的減少。
在上面提高的三高需求面前,關(guān)系數(shù)據(jù)庫(kù)遇到難以克服的障礙,而對(duì)于web2.0網(wǎng)站來(lái)說(shuō),關(guān)系數(shù)據(jù)庫(kù)的很多主要特性卻往往無(wú)用武之地。比如:
1、數(shù)據(jù)庫(kù)事務(wù)一致性需求
很多web實(shí)時(shí)系統(tǒng)并不要求嚴(yán)格的數(shù)據(jù)庫(kù)事務(wù),對(duì)讀一致性的要求很低,有些場(chǎng)合對(duì)寫(xiě)一致性要求也不高,因此數(shù)據(jù)庫(kù)事務(wù)管理成了數(shù)據(jù)庫(kù)高負(fù)載下一個(gè)沉重的負(fù)擔(dān)。
2、數(shù)據(jù)庫(kù)的寫(xiě)實(shí)時(shí)性和讀實(shí)時(shí)性需求。
對(duì)關(guān)系數(shù)據(jù)庫(kù)來(lái)說(shuō),插入一條數(shù)據(jù)之后立刻查詢(xún),是肯定可以讀出來(lái)這條數(shù)據(jù)的,但是對(duì)于很多web應(yīng)用來(lái)說(shuō),并不 高俅這么高的實(shí)時(shí)性。
3、對(duì)于復(fù)雜的SQL查詢(xún),特別是奪標(biāo)關(guān)聯(lián)查詢(xún)的需求。
任何大量數(shù)據(jù)的web系統(tǒng),都非常忌諱多個(gè)大表的關(guān)聯(lián)查詢(xún),以及復(fù)雜的數(shù)據(jù)分析類(lèi)型的復(fù)雜SQL報(bào)表查詢(xún),特別是SNS類(lèi)型的網(wǎng)站,從需求以及產(chǎn)品設(shè)計(jì)角度,就避免了這種情況的產(chǎn)生,往往更多的只是單表的主鍵查詢(xún),以及單表?xiàng)l件分頁(yè)查詢(xún),SQL功能的被極大的弱化了。
因此關(guān)系數(shù)據(jù)庫(kù)在這些越來(lái)越多的應(yīng)用場(chǎng)景下顯得不那么合適了,為了解決這一問(wèn)題的NoSQL數(shù)據(jù)庫(kù)應(yīng)運(yùn)而生。
NoSQL是非關(guān)系型數(shù)據(jù)存儲(chǔ)的廣義定義,它打破了長(zhǎng)久以來(lái)關(guān)系型數(shù)據(jù)庫(kù)與ACID理論大一統(tǒng)的局面,NoSQL數(shù)據(jù)存儲(chǔ)不需要固定的表結(jié)構(gòu),通常也不存在連接操作,在大數(shù)據(jù)存取上具備關(guān)系型數(shù)據(jù)庫(kù)無(wú)法比擬的性能優(yōu)勢(shì),該概念在2009年初得到廣泛的認(rèn)可。‘
當(dāng)今的應(yīng)用體系結(jié)構(gòu)需要數(shù)據(jù)存儲(chǔ)在橫向伸縮性上能滿(mǎn)足需求,而NoSQL存儲(chǔ)就是為了實(shí)現(xiàn)這個(gè)需求。Google的BigTable與Amazon的Dynamo是非常成功的商業(yè)NoSQL實(shí)現(xiàn),一些開(kāi)源的NoSQL體系,如Fackbook的Cassandra,Aapche的HBase,也得到廣泛的認(rèn)可,從這NoSQL項(xiàng)目的名字看不出什么相同之處:hadoop、Voldemort、Dynomite還有其他很多,但是它們有一個(gè)共同點(diǎn):就是改變大家對(duì)數(shù)據(jù)庫(kù)在傳統(tǒng)意義上的理解。
1.1.4、NoSQL特點(diǎn):
1、它可以處理超大量的數(shù)據(jù)。
2、它運(yùn)行在便宜的PC服務(wù)器集群上。
PC集群擴(kuò)充起來(lái)非常方便并且成本很低,避免了傳統(tǒng)商業(yè)數(shù)據(jù)庫(kù)的sharding操作的復(fù)雜性和成本。
3、它擊碎了性能瓶頸。
NoSQL的支持者稱(chēng),通過(guò)NoSQL架構(gòu)可以省去將web或者java應(yīng)用和數(shù)據(jù)轉(zhuǎn)成SQL格式時(shí)間,執(zhí)行速度變的更快。
SQL并非適用于所有的程序代碼,對(duì)于那些繁重的重復(fù)操作的數(shù)據(jù),SQL值得花錢(qián),但是當(dāng)數(shù)據(jù)結(jié)構(gòu)非常簡(jiǎn)單時(shí),SQL可能沒(méi)有太大的用處。
4、它沒(méi)有過(guò)多的操作
雖然NoSQL的支持者也承認(rèn)關(guān)系型數(shù)據(jù)庫(kù)提供無(wú)可比擬的功能集合,而且在數(shù)據(jù)完整性上也發(fā)揮絕對(duì)穩(wěn)定,他們同時(shí)也表示,企業(yè)的具體需求可能沒(méi)有那么復(fù)雜。
5、它的支持者源于社區(qū)。
因?yàn)镹oSQL項(xiàng)目都是開(kāi)源的,因此它們?nèi)狈?yīng)商提供的正式支持,這一點(diǎn)它們與大多數(shù)開(kāi)源項(xiàng)目一樣,不得不從社區(qū)中需求支持。
NoSQL發(fā)展至今,出現(xiàn)了好幾種非關(guān)系型數(shù)據(jù)庫(kù),本書(shū)以NoSQL中目前表現(xiàn)最好的MongoDB來(lái)進(jìn)行說(shuō)明。
1.2、初始MongoDB
MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系型數(shù)據(jù)庫(kù)的,它支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類(lèi)似于json的bjson格式,因此而已存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類(lèi)型,MongoDB最大的特點(diǎn)是它支持查詢(xún)語(yǔ)言非常強(qiáng)大,其語(yǔ)法有點(diǎn)類(lèi)似于面向?qū)ο蟮牟樵?xún)語(yǔ)言,幾乎可以實(shí)現(xiàn)類(lèi)似于關(guān)系數(shù)據(jù)庫(kù)單表查詢(xún)的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引,它是一個(gè)面向集合的、模式自由的文檔性數(shù)據(jù)庫(kù)。
1、面向集合(collection-Orented)
意思是數(shù)據(jù)被分組存儲(chǔ)在數(shù)據(jù)集中,被稱(chēng)為一個(gè)集合(Collection)。每個(gè)集合在數(shù)據(jù)庫(kù)中都有一個(gè)唯一的標(biāo)示名,并且可以包含無(wú)線數(shù)目的文檔,集合的概念類(lèi)似于關(guān)系型數(shù)據(jù)庫(kù)里的表,不同的是它不需要定義任何模式(Schema)
2、模式自由(schema-free)
意味著對(duì)于存儲(chǔ)在MongoDB數(shù)據(jù)庫(kù)中的文件,我們不需要知道它的任何結(jié)構(gòu)定義,提額這么多次無(wú)模式或者模式自由,它們到底是一個(gè)什么概念呢?比如,下面兩個(gè)記錄可以存儲(chǔ)到同一個(gè)集合里面:
{"welcome":"beijing"}
{"age":25}
3、文檔型
意思是我們存儲(chǔ)的數(shù)據(jù)是鍵值對(duì)的集合,鍵是字符串,值可以是數(shù)據(jù)類(lèi)型集合里的任何類(lèi)型,包括數(shù)組和文檔、我們把這個(gè)數(shù)據(jù)格式稱(chēng)作BSON,即Binary Serialized Document Notation。
1.2.1、特點(diǎn)
面向集合存儲(chǔ),易于存儲(chǔ)對(duì)象類(lèi)型的數(shù)據(jù)
模式自由
支持動(dòng)態(tài)查詢(xún)
支持完全索引,包含內(nèi)部對(duì)象
支持查詢(xún)
支持復(fù)制和故障恢復(fù)
使用高效的二進(jìn)制數(shù)據(jù)存儲(chǔ),包括大型對(duì)象(如視頻等)
自動(dòng)處理碎片,以支持云計(jì)算層次的擴(kuò)展性。
支持Python、PHP、Ruby、Java、C、C#、javaScript、Perl以及C++語(yǔ)言的驅(qū)動(dòng)程序,社區(qū)中也提供了對(duì)Erlang以及.net平臺(tái)的驅(qū)動(dòng)程序。
文件存儲(chǔ)格式為BSON
可以通過(guò)網(wǎng)絡(luò)訪問(wèn)。
1.2.2、功能
面向集合的存儲(chǔ):適合存儲(chǔ)對(duì)象以及JSON形式的數(shù)據(jù)。
動(dòng)態(tài)查詢(xún):mongoDB支持豐富的查詢(xún)表達(dá)式,查詢(xún)指令使用JSON形式的標(biāo)記,可輕易查詢(xún)文檔中內(nèi)嵌的對(duì)象以及數(shù)組。
完整的索引支持:包括文檔內(nèi)嵌對(duì)象以及數(shù)據(jù),MongoDB的查詢(xún)優(yōu)化器會(huì)分析查詢(xún)表達(dá)式,并生成一個(gè)高效的查詢(xún)計(jì)劃。
查詢(xún)監(jiān)視:MongoDB包含一系列監(jiān)視工具用于分析數(shù)據(jù)庫(kù)操作的性能。
復(fù)制和自動(dòng)故障轉(zhuǎn)移:MongoDB數(shù)據(jù)庫(kù)支持服務(wù)器之間的數(shù)據(jù)復(fù)制,支持主從模式及服務(wù)器之間的相互復(fù)制,復(fù)制的主要目標(biāo)是提供冗余以及自動(dòng)故障轉(zhuǎn)移。
高效的傳統(tǒng)存儲(chǔ)方式:支持二進(jìn)制數(shù)據(jù)以及大型對(duì)象(如照片或者圖片)
自動(dòng)分片以支持云級(jí)別的伸縮性:自動(dòng)分片功能支持水平的數(shù)據(jù)庫(kù)集群,可動(dòng)態(tài)添加額外的機(jī)器。
1.2.3、使用場(chǎng)合
網(wǎng)站數(shù)據(jù):MongoDB非常適合實(shí)時(shí)的插入,更新與查詢(xún),并具備網(wǎng)站實(shí)時(shí)數(shù)據(jù)存儲(chǔ)所需要的復(fù)制和高度伸縮性。
緩存:由于性能很高,MongoDB也適合作為信息基礎(chǔ)實(shí)施的緩存層,在系統(tǒng)重啟之后,由于MongoDB搭建的持久化緩存可以避免下層的數(shù)據(jù)源過(guò)載。
大尺寸,低價(jià)值的數(shù)據(jù):使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)一些數(shù)據(jù)時(shí)可能會(huì)比較昂貴在此之前,很多時(shí)候程序員往往會(huì)選擇傳統(tǒng)的文件進(jìn)行存儲(chǔ)。
高伸縮性的場(chǎng)景:MongoDB非常適合由數(shù)十或者數(shù)百臺(tái)服務(wù)器組成的數(shù)據(jù)庫(kù),MongoDB的路線圖中已經(jīng)包含對(duì)MapReduce引擎的內(nèi)置支持。
用于對(duì)象以及JSON數(shù)據(jù)的存儲(chǔ):MongoDB的BSON數(shù)據(jù)格式非常適合文檔化格式的存儲(chǔ)以及查詢(xún)。
MongoDB 數(shù)據(jù)庫(kù)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。