1.簡述
MongDB是一個強大、靈活而可擴展的數據存儲系統,其將強大的可擴展特性與關系庫最有用的特性進行了整合,像:次級索引,范圍查詢和排序等特性。而MongDB也內建了類似MapReduce匯聚和地理空間索引等有用特性。
歷經艱苦的努力,MongDB也擁有了易操作和用戶友好等特性,同時,其還具備開發友好的模型、管理友好的配置選項及用起來感覺輕松自然的API和數據庫shell。MongDB盡力讓使用者省心,從而可以專注於編程而不用擔心數據存儲方面的問題。
2.特性
1)豐富的數據模型
MongDB是一個面向文檔的數據庫,而不是關系數據庫。其之所以放棄關系模型的原因是為了易於擴展,當然,還有其他的優勢方面的考慮。MongDB的理念是用一個更靈活的模型——“文檔”,去替代關系庫中行的概念。通過文檔中嵌入文檔和數組,其可以實現通過一條記錄來表示復雜的層級關系,這點非常適合使用現代面向對象語言的開發者考慮數據的方式。
MongDB中沒有模式的概念,一個文檔的鍵無需通過任何方式預先定義或固定。通常,沒有模式發生改變,就無需進行大量數據的遷移。新增或刪除鍵可以在應用層面進行處理,而無需強制他們都適應固定且同樣的格式。這在處理數據模型演化時給予了開發者許多靈活性。
2)易擴展性
現代應用的數據規模正以難以置信的速度增長。高級傳感技術、可用帶寬的增長以及互聯網上手持設備的流行,這都將創建一個場景,其中哪怕小規模的應用都將產生前所未有的大量數據,TB級的數據,是之前聞所未聞的數據量,而現在卻隨處可見。
開發者數據量增長的同時,導致其將會面臨一個困難的決定,他們將如何擴展他們的數據庫?如果擴展數據庫,將會面臨縱向擴展(服務器硬件升級的更為強大)或橫向擴展(將數據分布到多台服務器上)。縱向擴展通常是最容易的方法,但它也帶來諸多缺陷,比如:更強大的服務器通常會很昂貴,當買不起更強大的服務器時,這種方法將到達一個物理上的硬性限制。對於人們最想建的大型web應用來說,通過一台服務器來實現不太可能,其成本也是難以承受的。
而橫向擴展則兼具擴展性和經濟性,為了增加存儲空間和提升性能,你可以另外購買一台服務器,並將其加入你目前的集群。MongDB一開始就設計為橫向擴展,其面向文檔的數據模型允許它將數據在多個服務器間自動拆分,數據和負載能在集群內進行平衡,文檔可以自動重新分布,這使得開發者專注應用開發,而非擴展數據庫。當需要更多容量時,只需將一台新服務器加入現有集群,並讓數據庫自己想辦法完成后續的一切。
3)維持高性能
卓越性能是MongDB的主要目標,並且,這也已經導致了有關它的很多設計決定。MongDB用二進制線性協議作為和服務器交互的主模式,其動態填補文檔並預先分配數據文件以額外空間換取穩定的性能。MongDB默認存儲引擎中使用內存映射文件,並將內存管理的任務交給操作系統。此外,其還具有動態查詢優化器的特點,這使得它能記住執行查詢的最快方式。簡而言之MongDB幾乎每個方面都是為維持高性能而設計。
雖然,MongDB足夠強大且盡力試圖保留關系庫的很多特性,但其並非被設計來完成關系庫的所有事情。任何時候,MongDB都盡量將處理和邏輯交給客戶端的驅動或代碼,保持這種流線設計是MongDB能獲得如此高性能的原因之一。
4)易於管理
MongDB通過服務器自我管理來盡可能的簡化數據庫的管理。除了啟動數據庫服務器,很少需要人工管理。如果主庫宕掉了,MongDB能自動切換到備庫並將這個備庫提升為主庫。分布式環境中,集群只需要被告知一個新節點的加入,然后,MongDB將自動對其進行集成和配置。
5)其他特點
i)索引:MongDB支持通常的次級索引,允許各種快速查詢,且支持唯一、復合及地理空間索引等。
ii)存儲java腳本:開發者能在服務器端存儲和使用java函數,以替代存儲過程功能。
iii)匯聚:MongDB支持MapReduce和其他匯聚工具。
iv)固定大小集合:封頂集合大小固定,且其適用於類似日志的某些數據類型。
v)文件存儲:MongDB支持存儲大文件和文件元數據的易於使用的協議。
此外,MongDB並不支持關系庫的某些常見特點,特別是連接(join)和復雜的多行事務。這些也是允許強大擴展特性的架構所決定的,因為分布式系統中難以支持關系庫的那些特點。
3.架構
1)單庫:如果單個MongDB庫能承擔所有數據和負載,且不考慮數據冗余和高可用,單節點沒問題,研發和測試環境,這個架構比較常見,也比較容易部署,這里就不再多說了。
2)主從復制:主從復制架構是MongDB支持的最常見的復制環境。這種架構非常靈活,且能被用於備份、故障切換、讀擴展及更多其他用途,這種架構至少需要兩台服務器配置成一主一備,也可以用多台服務器配置成一主多備,當然,也可以通過同一服務器上的多個實例配置成一主一備或一主多備,結果就是,同一服務器上的多個實例實現的這種架構,無論在其靈活性、備份、高可用還是讀擴展等方面,其作用都會大打折扣,生產環境中還是多個硬件服務器配置成的主備庫架構更常見。
3)復制集:復制集基本就是一個可以自動故障切換的主備庫集群。其和前述的主備庫架構之間的最大差別就是復制集並沒有一個固定的主庫,而是由集群選出一個主庫,當前的主庫宕掉后,另外一個服務器上的備庫會轉變為主庫。另外,兩種架構都總是有一個主庫和一個或多個從庫。復制集的好處是一切都是自動的,集群自己會自己完成很多管理任務,將從庫提升為主庫並確保數據的一致性。對開發者來說,這種架構的易用性也很好,只需確定集群中的服務器,驅動程序將自動發現所有的服務器,如果當前服務器宕掉后會自動完成故障切換。
4)分片:所謂分片,就是將數據拆分並將拆分后的不同部分數據存儲到不同的服務器,這樣,在沒有升級為更強大硬件服務器的情況下,才可能存儲更多數據和處理更多負載。分片分為手工分片和自動分片。
i)手工分片:幾乎針對任何數據庫系統,都可以進行手工分片。其中,每個應用都保持到幾個不同數據庫服務器的連接,這些數據庫服務器是相互完全獨立的,應用代碼負責管理將不同的數據存儲到不同的服務器上,以及查詢相應的服務器以獲取到正確的結果數據。手工分片會運行的很好,但服務器的增減以及數據的分布和負載平衡模式發生改變時,相應工作人工維護起來會越來越困難。
ii)自動分片:MongDB支持自動分片,這消除了人工分片中管理維護工作的困難,MongDB負責維護數據的自動拆分和再平衡,同時,開發者也不用關心數據分布和負載均衡問題。MongDB自動分片時,會將其集合分散成小的數據塊,這些數據塊分布到不同的分片(服務器),其中的每個分片負責總數據集合中的一部分子集。通過mongos路由進程,MongDB實現了數據分片對用戶應用程序的透明,應用程序無需關心什么分片存儲什么數據,甚至數據被分散到多個分片服務器上。所有數據分片工作,都是通過所有分片前端的mongos路由進程來完成。應用的工作只是知道mongos進程的連接方式,並像連接MongDB一樣成功
連接它就可以了。