聲明:該文章主要來自《MongoDB實戰》1書內容,主要想通過該書學習MongoDB的相應知識,加深理解,故寫在自己的博文當中,作為記錄在最后的章節中,會有1個自己集合MongoDB數據庫利用的JavaEE的web利用。
第1章 走進MongoDB
MongoDB是1個高性能、開源、無模式的文檔型數據庫,是當前NoSQL數據庫產品中最熱門的1種,它在許多場景下可用于替換關系型數據庫或鍵/值存儲方式,MongoDB使用C++開發,MongoDB的官網是地址是:http://www.mongodb.org/,可以在此取得更多的詳細信息。
1.1、為何要用NoSQL
1.1.1、NoSQL簡介
NoSQL,全程Not Only SQL,指的是非關系型的數據庫,這類數據庫主要有這些特點:非關系型的、散布式的、開源的、水平可擴大的,原始的目的是為了大范圍web利用,這場全新的數據庫革命運動初期就有人提出,發展至2009年趨勢越發高漲,NoSQL的擁戴者們提倡應用非關系型的數據存儲,通常的利用如:模式自由、支持建議復制、簡單的API、終究的1致性(非ACID)、大容量數據等,NoSQL被我們用得最多得當數key-value存儲,固然還有其他的文檔、列存儲、圖型數據庫、xml數據庫等,相對目前遮天蔽日的關系型數據庫應用,這1概念無疑是1種全新思惟的注入。
1.1.2、發展現狀
當今的計算機體系結構在數據存儲方法要求利用架構具有龐大的水平擴大性,而NoSQL正在致力于改變這1現狀,目前新浪微博的Redis和Google的Bitable和Amazon的SimpleDB使用的就是NoSQL型的數據庫,NoSQL項目的名字上看不出甚么相同的地方,但是它們通常在某些方面相同:它們可以處理超大量的數據。
這場革命目前仍需等待,NoSQL對大型企業來講還不是主流,但是1兩年以后就會變個模樣,在NoSQL運動的最新1次集會中,來自世界各地的150人,擠滿了CBS Interactive的1間會議室,分享他們如何顛覆緩慢昂貴的關系數據庫的暴政,怎樣使用有效和更便宜的方法來管理數據。
關系型數據庫給你強加了太多的東西,它們要你強行修改對象數據,以滿足數據庫新系統的需要,在NoSQL擁戴者們來看,基于NoSQL的數據庫替換方案,只是給你所需要的。
1.1.3、為何是NoSQL
隨著互聯網web2.0網站的興起,非關系型數據庫現在成了1個及其熱門的新領域,非關系型數據庫產品的發展非常迅速,而傳統的關系型數據庫在應付web2.0網站,特別是超大范圍和高并發的SNS類型的web2.0純動態網站已顯得力不從心,暴露了難以克服的問題,比如:
1、High performance 對數據庫高并發寫的需求。
web2.0網站要根據用戶個性化信息來實時生成動態頁面和提供動態信息,所以基本上沒法使用動態網頁靜態化技術,因此數據庫并發負載非常高,常常要到達每秒上萬次讀寫要求,關系型數據庫應付上萬次的SQL查詢還委曲頂得住,但是應付上萬次的SQL寫數據要求,硬盤IO就已沒法承受了,其實對普通的BBS網站,常常也存在對高并發寫要求的需求。
2、Huge Storage 對海量數據的高效存儲和訪問的需求。
對大型的SNS網站,每天用戶產生海量的用戶動態信息,以國外的Friend feed為例子,1個月就到達了2.5億條用戶動態,對關系型數據庫來講,在1張2.5億條記錄的表里進行SQL查詢,效力是極為低下乃至不可忍耐的,再如大型web網站用戶登錄系統,比如騰訊、盛大、動輒數億計的賬號、關系數據庫也很難以應付。
3、High Scalability && High Availability 對數據庫的高擴大性和高可用性的需求。
在基于web的架構當中,數據庫是最難進行橫向擴大的,當1個利用系統的用戶量和訪問量與日俱增時,你的數據庫卻沒有辦法像web server和app server那樣簡單的通過添加更多的硬件和服務節點來擴大性能和負載能力,對很多需要提供24小時不中斷服務的網站來講,對數據庫系統進行升級和擴大是非常痛苦的事情,常常需要停機保護和數據遷移,可是停機保護隨之帶來的就是公司收入的減少。
在上面提高的3高需求眼前,關系數據庫遇到難以克服的障礙,而對web2.0網站來講,關系數據庫的很多主要特性卻常常無用武之地。比如:
1、數據庫事務1致性需求
很多web實時系統其實不要求嚴格的數據庫事務,對讀1致性的要求很低,有些場合對寫1致性要求也不高,因此數據庫事務管理成了數據庫高負載下1個沉重的負擔。
2、數據庫的寫實時性和讀實時性需求。
對關系數據庫來講,插入1條數據以后立刻查詢,是肯定可以讀出來這條數據的,但是對很多web利用來講,其實不 高俅這么高的實時性。
3、對復雜的SQL查詢,特別是奪標關聯查詢的需求。
任何大量數據的web系統,都非常忌諱多個大表的關聯查詢,和復雜的數據分析類型的復雜SQL報表查詢,特別是SNS類型的網站,從需求和產品設計角度,就避免了這類情況的產生,常常更多的只是單表的主鍵查詢,和單表條件分頁查詢,SQL功能的被極大的弱化了。
因此關系數據庫在這些愈來愈多的利用場景下顯得不那末適合了,為了解決這1問題的NoSQL數據庫應運而生。
NoSQL是非關系型數據存儲的廣義定義,它打破了久長以來關系型數據庫與ACID理論大1統的局面,NoSQL數據存儲不需要固定的表結構,通常也不存在連接操作,在大數據存取上具有關系型數據庫沒法比擬的性能優勢,該概念在2009年初得到廣泛的認可?!?/p>
現今的利用體系結構需要數據存儲在橫向伸縮性上能滿足需求,而NoSQL存儲就是為了實現這個需求。Google的BigTable與Amazon的Dynamo是非常成功的商業NoSQL實現,1些開源的NoSQL體系,如Fackbook的Cassandra,Aapche的HBase,也得到廣泛的認可,從這NoSQL項目的名字看不出甚么相同的地方:hadoop、Voldemort、Dynomite還有其他很多,但是它們有1個共同點:就是改變大家對數據庫在傳統意義上的理解。
1.1.4、NoSQL特點:
1、它可以處理超大量的數據。
2、它運行在便宜的PC服務器集群上。
PC集群擴充起來非常方便并且本錢很低,避免了傳統商業數據庫的sharding操作的復雜性和本錢。
3、它擊碎了性能瓶頸。
NoSQL的支持者稱,通過NoSQL架構可以省去將web或java利用和數據轉成SQL格式時間,履行速度變的更快。
SQL并不是適用于所有的程序代碼,對那些沉重的重復操作的數據,SQL值得花錢,但是當數據結構非常簡單時,SQL可能沒有太大的用途。
4、它沒有過量的操作
雖然NoSQL的支持者也承認關系型數據庫提供無可比擬的功能集合,而且在數據完全性上也發揮絕對穩定,他們同時也表示,企業的具體需求可能沒有那末復雜。
5、它的支持者源于社區。
由于NoSQL項目都是開源的,因此它們缺少供應商提供的正式支持,這1點它們與大多數開源項目1樣,不能不從社區中需求支持。
NoSQL發展至今,出現了好幾種非關系型數據庫,本書以NoSQL中目前表現最好的MongoDB來進行說明。
1.2、初始MongoDB
MongoDB是1個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系型數據庫的,它支持的數據結構非常疏松,是類似于json的bjson格式,因此而已存儲比較復雜的數據類型,MongoDB最大的特點是它支持查詢語言非常強大,其語法有點類似于面向對象的查詢語言,幾近可以實現類似于關系數據庫單表查詢的絕大部份功能,而且還支持對數據建立索引,它是1個面向集合的、模式自由的文檔性數據庫。
1、面向集合(collection-Orented)
意思是數據被分組存儲在數據集中,被稱為1個集合(Collection)。每一個集合在數據庫中都有1個唯1的標示名,并且可以包括無線數目的文檔,集合的概念類似于關系型數據庫里的表,不同的是它不需要定義任何模式(Schema)
2、模式自由(schema-free)
意味著對存儲在MongoDB數據庫中的文件,我們不需要知道它的任何結構定義,提額這么屢次無模式或模式自由,它們究竟是1個甚么概念呢?比如,下面兩個記錄可以存儲到同1個集合里面:
{"welcome":"beijing"}
{"age":25}
3、文檔型
意思是我們存儲的數據是鍵值對的集合,鍵是字符串,值可以是數據類型集合里的任何類型,包括數組和文檔、我們把這個數據格式稱作BSON,即Binary Serialized Document Notation。
1.2.1、特點
面向集合存儲,易于存儲對象類型的數據
模式自由
支持動態查詢
支持完全索引,包括內部對象
支持查詢
支持復制和故障恢復
使用高效的2進制數據存儲,包括大型對象(如視頻等)
自動處理碎片,以支持云計算層次的擴大性。
支持Python、PHP、Ruby、Java、C、C#、javaScript、Perl和C++語言的驅動程序,社區中也提供了對Erlang和.net平臺的驅動程序。
文件存儲格式為BSON
可以通過網絡訪問。
1.2.2、功能
面向集合的存儲:合適存儲對象和JSON情勢的數據。
動態查詢:mongoDB支持豐富的查詢表達式,查詢指令使用JSON情勢的標記,可輕易查詢文檔中內嵌的對象和數組。
完全的索引支持:包括文檔內嵌對象和數據,MongoDB的查詢優化器會分析查詢表達式,并生成1個高效的查詢計劃。
查詢監視:MongoDB包括1系列監視工具用于分析數據庫操作的性能。
復制和自動故障轉移:MongoDB數據庫支持服務器之間的數據復制,支持主從模式及服務器之間的相互復制,復制的主要目標是提供冗余和自動故障轉移。
高效的傳統存儲方式:支持2進制數據和大型對象(如照片或圖片)
自動分片以支持云級別的伸縮性:自動分片功能支持水平的數據庫集群,可動態添加額外的機器。
1.2.3、使用處合
網站數據:MongoDB非常合適實時的插入,更新與查詢,并具有網站實時數據存儲所需要的復制和高度伸縮性。
緩存:由于性能很高,MongoDB也合適作為信息基礎實行的緩存層,在系統重啟以后,由于MongoDB搭建的持久化緩存可以免下層的數據源過載。
大尺寸,低價值的數據:使用傳統的關系型數據庫存儲1些數據時可能會比較昂貴在此之前,很多時候程序員常常會選擇傳統的文件進行存儲。
高伸縮性的場景:MongoDB非常合適由數10或數百臺服務器組成的數據庫,MongoDB的線路圖中已包括對MapReduce引擎的內置支持。
用于對象和JSON數據的存儲:MongoDB的BSON數據格式非常合適文檔化格式的存儲和查詢。