聲明:該文章主要來(lái)自《MongoDB實(shí)戰(zhàn)》1書(shū)內(nèi)容,主要想通過(guò)該書(shū)學(xué)習(xí)MongoDB的相應(yīng)知識(shí),加深理解,故寫(xiě)在自己的博文當(dāng)中,作為記錄在最后的章節(jié)中,會(huì)有1個(gè)自己集合MongoDB數(shù)據(jù)庫(kù)利用的JavaEE的web利用。
第1章 走進(jìn)MongoDB
MongoDB是1個(gè)高性能、開(kāi)源、無(wú)模式的文檔型數(shù)據(jù)庫(kù),是當(dāng)前NoSQL數(shù)據(jù)庫(kù)產(chǎn)品中最熱門的1種,它在許多場(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ù),這類數(shù)據(jù)庫(kù)主要有這些特點(diǎn):非關(guān)系型的、散布式的、開(kāi)源的、水平可擴(kuò)大的,原始的目的是為了大范圍web利用,這場(chǎng)全新的數(shù)據(jù)庫(kù)革命運(yùn)動(dòng)初期就有人提出,發(fā)展至2009年趨勢(shì)越發(fā)高漲,NoSQL的擁戴者們提倡應(yīng)用非關(guān)系型的數(shù)據(jù)存儲(chǔ),通常的利用如:模式自由、支持建議復(fù)制、簡(jiǎn)單的API、終究的1致性(非ACID)、大容量數(shù)據(jù)等,NoSQL被我們用得最多得當(dāng)數(shù)key-value存儲(chǔ),固然還有其他的文檔、列存儲(chǔ)、圖型數(shù)據(jù)庫(kù)、xml數(shù)據(jù)庫(kù)等,相對(duì)目前遮天蔽日的關(guān)系型數(shù)據(jù)庫(kù)應(yīng)用,這1概念無(wú)疑是1種全新思惟的注入。
1.1.2、發(fā)展現(xiàn)狀
當(dāng)今的計(jì)算機(jī)體系結(jié)構(gòu)在數(shù)據(jù)存儲(chǔ)方法要求利用架構(gòu)具有龐大的水平擴(kuò)大性,而NoSQL正在致力于改變這1現(xiàn)狀,目前新浪微博的Redis和Google的Bitable和Amazon的SimpleDB使用的就是NoSQL型的數(shù)據(jù)庫(kù),NoSQL項(xiàng)目的名字上看不出甚么相同的地方,但是它們通常在某些方面相同:它們可以處理超大量的數(shù)據(jù)。
這場(chǎng)革命目前仍需等待,NoSQL對(duì)大型企業(yè)來(lái)講還不是主流,但是1兩年以后就會(huì)變個(gè)模樣,在NoSQL運(yùn)動(dòng)的最新1次集會(huì)中,來(lái)自世界各地的150人,擠滿了CBS Interactive的1間會(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ù),以滿足數(shù)據(jù)庫(kù)新系統(tǒng)的需要,在NoSQL擁戴者們來(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)在成了1個(gè)及其熱門的新領(lǐng)域,非關(guān)系型數(shù)據(jù)庫(kù)產(chǎn)品的發(fā)展非常迅速,而傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)在應(yīng)付web2.0網(wǎng)站,特別是超大范圍和高并發(fā)的SNS類型的web2.0純動(dòng)態(tài)網(wǎng)站已顯得力不從心,暴露了難以克服的問(wèn)題,比如:
1、High performance 對(duì)數(shù)據(jù)庫(kù)高并發(fā)寫(xiě)的需求。
web2.0網(wǎng)站要根據(jù)用戶個(gè)性化信息來(lái)實(shí)時(shí)生成動(dòng)態(tài)頁(yè)面和提供動(dòng)態(tài)信息,所以基本上沒(méi)法使用動(dòng)態(tài)網(wǎng)頁(yè)靜態(tài)化技術(shù),因此數(shù)據(jù)庫(kù)并發(fā)負(fù)載非常高,常常要到達(dá)每秒上萬(wàn)次讀寫(xiě)要求,關(guān)系型數(shù)據(jù)庫(kù)應(yīng)付上萬(wàn)次的SQL查詢還委曲頂?shù)米。菓?yīng)付上萬(wàn)次的SQL寫(xiě)數(shù)據(jù)要求,硬盤(pán)IO就已沒(méi)法承受了,其實(shí)對(duì)普通的BBS網(wǎng)站,常常也存在對(duì)高并發(fā)寫(xiě)要求的需求。
2、Huge Storage 對(duì)海量數(shù)據(jù)的高效存儲(chǔ)和訪問(wèn)的需求。
對(duì)大型的SNS網(wǎng)站,每天用戶產(chǎn)生海量的用戶動(dòng)態(tài)信息,以國(guó)外的Friend feed為例子,1個(gè)月就到達(dá)了2.5億條用戶動(dòng)態(tài),對(duì)關(guān)系型數(shù)據(jù)庫(kù)來(lái)講,在1張2.5億條記錄的表里進(jìn)行SQL查詢,效力是極為低下乃至不可忍耐的,再如大型web網(wǎng)站用戶登錄系統(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)1個(gè)利用系統(tǒng)的用戶量和訪問(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)講,對(duì)數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行升級(jí)和擴(kuò)大是非常痛苦的事情,常常需要停機(jī)保護(hù)和數(shù)據(jù)遷移,可是停機(jī)保護(hù)隨之帶來(lái)的就是公司收入的減少。
在上面提高的3高需求眼前,關(guān)系數(shù)據(jù)庫(kù)遇到難以克服的障礙,而對(duì)web2.0網(wǎng)站來(lái)講,關(guān)系數(shù)據(jù)庫(kù)的很多主要特性卻常常無(wú)用武之地。比如:
1、數(shù)據(jù)庫(kù)事務(wù)1致性需求
很多web實(shí)時(shí)系統(tǒng)其實(shí)不要求嚴(yán)格的數(shù)據(jù)庫(kù)事務(wù),對(duì)讀1致性的要求很低,有些場(chǎng)合對(duì)寫(xiě)1致性要求也不高,因此數(shù)據(jù)庫(kù)事務(wù)管理成了數(shù)據(jù)庫(kù)高負(fù)載下1個(gè)沉重的負(fù)擔(dān)。
2、數(shù)據(jù)庫(kù)的寫(xiě)實(shí)時(shí)性和讀實(shí)時(shí)性需求。
對(duì)關(guān)系數(shù)據(jù)庫(kù)來(lái)講,插入1條數(shù)據(jù)以后立刻查詢,是肯定可以讀出來(lái)這條數(shù)據(jù)的,但是對(duì)很多web利用來(lái)講,其實(shí)不 高俅這么高的實(shí)時(shí)性。
3、對(duì)復(fù)雜的SQL查詢,特別是奪標(biāo)關(guān)聯(lián)查詢的需求。
任何大量數(shù)據(jù)的web系統(tǒng),都非常忌諱多個(gè)大表的關(guān)聯(lián)查詢,和復(fù)雜的數(shù)據(jù)分析類型的復(fù)雜SQL報(bào)表查詢,特別是SNS類型的網(wǎng)站,從需求和產(chǎn)品設(shè)計(jì)角度,就避免了這類情況的產(chǎn)生,常常更多的只是單表的主鍵查詢,和單表?xiàng)l件分頁(yè)查詢,SQL功能的被極大的弱化了。
因此關(guān)系數(shù)據(jù)庫(kù)在這些愈來(lái)愈多的利用場(chǎng)景下顯得不那末適合了,為了解決這1問(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理論大1統(tǒng)的局面,NoSQL數(shù)據(jù)存儲(chǔ)不需要固定的表結(jié)構(gòu),通常也不存在連接操作,在大數(shù)據(jù)存取上具有關(guān)系型數(shù)據(jù)庫(kù)沒(méi)法比擬的性能優(yōu)勢(shì),該概念在2009年初得到廣泛的認(rèn)可。‘
現(xiàn)今的利用體系結(jié)構(gòu)需要數(shù)據(jù)存儲(chǔ)在橫向伸縮性上能滿足需求,而NoSQL存儲(chǔ)就是為了實(shí)現(xiàn)這個(gè)需求。Google的BigTable與Amazon的Dynamo是非常成功的商業(yè)NoSQL實(shí)現(xiàn),1些開(kāi)源的NoSQL體系,如Fackbook的Cassandra,Aapche的HBase,也得到廣泛的認(rèn)可,從這NoSQL項(xiàng)目的名字看不出甚么相同的地方:hadoop、Voldemort、Dynomite還有其他很多,但是它們有1個(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的支持者稱,通過(guò)NoSQL架構(gòu)可以省去將web或java利用和數(shù)據(jù)轉(zhuǎn)成SQL格式時(shí)間,履行速度變的更快。
SQL并不是適用于所有的程序代碼,對(duì)那些沉重的重復(fù)操作的數(shù)據(jù),SQL值得花錢,但是當(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ū)。
由于NoSQL項(xiàng)目都是開(kāi)源的,因此它們?nèi)鄙俟?yīng)商提供的正式支持,這1點(diǎn)它們與大多數(shù)開(kāi)源項(xiàng)目1樣,不能不從社區(qū)中需求支持。
NoSQL發(fā)展至今,出現(xiàn)了好幾種非關(guān)系型數(shù)據(jù)庫(kù),本書(shū)以NoSQL中目前表現(xiàn)最好的MongoDB來(lái)進(jìn)行說(shuō)明。
1.2、初始MongoDB
MongoDB是1個(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)非常疏松,是類似于json的bjson格式,因此而已存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型,MongoDB最大的特點(diǎn)是它支持查詢語(yǔ)言非常強(qiáng)大,其語(yǔ)法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z(yǔ)言,幾近可以實(shí)現(xiàn)類似于關(guān)系數(shù)據(jù)庫(kù)單表查詢的絕大部份功能,而且還支持對(duì)數(shù)據(jù)建立索引,它是1個(gè)面向集合的、模式自由的文檔性數(shù)據(jù)庫(kù)。
1、面向集合(collection-Orented)
意思是數(shù)據(jù)被分組存儲(chǔ)在數(shù)據(jù)集中,被稱為1個(gè)集合(Collection)。每一個(gè)集合在數(shù)據(jù)庫(kù)中都有1個(gè)唯1的標(biāo)示名,并且可以包括無(wú)線數(shù)目的文檔,集合的概念類似于關(guān)系型數(shù)據(jù)庫(kù)里的表,不同的是它不需要定義任何模式(Schema)
2、模式自由(schema-free)
意味著對(duì)存儲(chǔ)在MongoDB數(shù)據(jù)庫(kù)中的文件,我們不需要知道它的任何結(jié)構(gòu)定義,提額這么屢次無(wú)模式或模式自由,它們究竟是1個(gè)甚么概念呢?比如,下面兩個(gè)記錄可以存儲(chǔ)到同1個(gè)集合里面:
{"welcome":"beijing"}
{"age":25}
3、文檔型
意思是我們存儲(chǔ)的數(shù)據(jù)是鍵值對(duì)的集合,鍵是字符串,值可以是數(shù)據(jù)類型集合里的任何類型,包括數(shù)組和文檔、我們把這個(gè)數(shù)據(jù)格式稱作BSON,即Binary Serialized Document Notation。
1.2.1、特點(diǎn)
面向集合存儲(chǔ),易于存儲(chǔ)對(duì)象類型的數(shù)據(jù)
模式自由
支持動(dòng)態(tài)查詢
支持完全索引,包括內(nèi)部對(duì)象
支持查詢
支持復(fù)制和故障恢復(fù)
使用高效的2進(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ì)的數(shù)據(jù)。
動(dòng)態(tài)查詢:mongoDB支持豐富的查詢表達(dá)式,查詢指令使用JSON情勢(shì)的標(biāo)記,可輕易查詢文檔中內(nèi)嵌的對(duì)象和數(shù)組。
完全的索引支持:包括文檔內(nèi)嵌對(duì)象和數(shù)據(jù),MongoDB的查詢優(yōu)化器會(huì)分析查詢表達(dá)式,并生成1個(gè)高效的查詢計(jì)劃。
查詢監(jiān)視:MongoDB包括1系列監(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ǔ)方式:支持2進(jìn)制數(shù)據(jù)和大型對(duì)象(如照片或圖片)
自動(dòng)分片以支持云級(jí)別的伸縮性:自動(dòng)分片功能支持水平的數(shù)據(jù)庫(kù)集群,可動(dòng)態(tài)添加額外的機(jī)器。
1.2.3、使用處合
網(wǎng)站數(shù)據(jù):MongoDB非常合適實(shí)時(shí)的插入,更新與查詢,并具有網(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ǔ)1些數(shù)據(jù)時(shí)可能會(huì)比較昂貴在此之前,很多時(shí)候程序員常常會(huì)選擇傳統(tǒng)的文件進(jìn)行存儲(chǔ)。
高伸縮性的場(chǎng)景:MongoDB非常合適由數(shù)10或數(shù)百臺(tái)服務(wù)器組成的數(shù)據(jù)庫(kù),MongoDB的線路圖中已包括對(duì)MapReduce引擎的內(nèi)置支持。
用于對(duì)象和JSON數(shù)據(jù)的存儲(chǔ):MongoDB的BSON數(shù)據(jù)格式非常合適文檔化格式的存儲(chǔ)和查詢。