MongoDB的基本特性與內部構造

來源:互聯網
上載者:User

標籤:http   os   使用   io   java   ar   for   檔案   資料   

MongoDB是一個介於關聯式資料庫和非關聯式資料庫之間的產品,是非關聯式資料庫當中功能最豐富,最像關聯式資料庫的。他支援的資料結構非常鬆散,是類似json的bjson格式,因此可以儲存比較複雜的資料類型。Mongo最大的特點是他支援的查詢語言非常強大,其文法有點類似於物件導向的查詢語言,幾乎可以實作類別似關聯式資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。

對於大多數的MongoDB的使用者來說,MongoDB就像是一個大黑盒。但是如果你能夠瞭解到MongoDB一些內部構造的話,將有利於你更好地理解和使用MongoDB。博e百娛樂城

BSON

在MongoDB中,文檔是對資料的抽象,它被使用在Client端和Server端的互動中。所有的Client端(各種語言的Driver)都會使用這種抽象,它的表現形式就是我們常說的BSON(Binary JSON)。

BSON 是一個輕量級的位元據格式。MongoDB能夠使用BSON,並將BSON作為資料的儲存存放在磁碟中。

當Client端要將寫入文檔,使用查詢等操作時,需要將文檔編碼為BSON格式,然後再發送給Server端。同樣,Server端的返回結果也是編碼為BSON格式再返回給Client端的。

使用BSON格式出於以下3種目的:

  1. 效率。BSON是為效率而設計的,它只需要使用很少的空間。即使在最壞的情況下,BSON格式也比JSON格式在最好的情況下儲存效率高。
  2. 傳輸性。在某些情況下,BSON會犧牲額外的空間讓資料的傳輸更加方便。比如,字串的傳輸的首碼會標識字串的長度,而不是在字串的末尾打上結束的標記。這樣的傳輸形式有利於MongoDB修改傳輸的資料。
  3. 效能。最後,BSON格式的編碼和解碼都是非常快速的。它使用了C風格的資料表現形式,這樣在各種語言中都可以高效地使用。
寫入協議

Client端訪問Server端使用了輕量級的TCP/IP寫入協議。這種協議在MongoDB Wiki中有詳細介紹,它其實是在BSON資料上面做了一層簡單的封裝。比如說,寫入資料的命令中包含了1個20位元組的訊息頭(由訊息的長度和寫入命令標識組成),需要寫入的Collection名稱和需要寫入的資料。

資料檔案

在MongoDB的資料檔案夾中(預設路徑是/data/db)由構成資料庫的所有檔案。每一個資料庫都包含一個.ns檔案和一些資料檔案,其中資料檔案會隨著資料量的增加而變多。所以如果有一個資料庫名字叫做foo,那麼構成foo這個資料庫的檔案就會由foo.ns,foo.0,foo.1,foo.2等等組成。

資料檔案每新增一次,大小都會是上一個資料檔案的2倍,每個資料檔案最大2G。這樣的設計有利於防止資料量較小的資料庫浪費過多的空間,同時又能保證資料量較大的資料庫有相應的空間使用。

MongoDB會使用預分配方式來保證寫入效能的穩定(這種方式可以使用–noprealloc關閉)。預分配在後台進行,並且每個預分配的檔案都用0進行填充。這會讓MongoDB始終保持額外的空間和空餘的資料檔案,從而避免了資料增長過快而帶來的分配磁碟空間引起的阻塞。

名字空間和盤區

每一個資料庫都由多個名字空間組成,每一個名字空間儲存了相應類型的資料。資料庫中的每一個Collection都有各自對應的名字空間,索引檔案同樣也有名字空間。所有名字空間的中繼資料都儲存在.ns檔案中。

名字空間中的資料在磁碟中分為多個區間,這個叫做盤區。在中,foo這個資料庫包含3個資料檔案,第三個資料檔案屬於空的預分配檔案。頭兩個資料檔案被分為了相應的盤區對應不同的名字空間。

顯示了名字空間和盤區的相關特點。每一個名字空間可以包含多個不同的盤區,這些盤區並不是連續的。與資料檔案的增長相同,每一個名字空間對應的盤區大小的也是隨著分配的次數不斷增長的。這樣做的目的是為了平衡名字空間浪費的空間與保持某一個名字空間中資料的連續性。中還有一個需要注意的名字空間:$freelist,這個名字空間用於記錄不再使用的盤區(被刪除的Collection或索引)。每當名字空間需要分配新的盤區的時候,都會先查看$freelist是否有大小合適的盤區可以使用。

記憶體映射儲存引擎

MongoDB目前支援的儲存引擎為記憶體映射引擎。當MongoDB啟動的時候,會將所有的資料檔案映射到記憶體中,然後作業系統會託管所有的磁碟操作。這種儲存引擎有以下幾種特點:

  • MongoDB中關於記憶體管理的代碼非常精簡,畢竟相關的工作已經有作業系統進行託管。
  • MongoDB伺服器使用的虛擬記憶體將非常巨大,並將超過整個資料檔案的大小。不用擔心,作業系統會去處理這一切。要注意的是,MongoDB自己是不管理記憶體的,無法指定記憶體大小,完全交給作業系統來管理,因此有時候是不可控的,在生產環境使用必須在OS層面監控記憶體使用量情況。
  •  MongoDB無法控制資料寫入磁碟的順序,這樣將導致MongoDB無法實現writeahead日誌的特性。所以,如果MongoDB希望提供一種durability的特性,需要實現另外一種儲存引擎。
  • 32位系統的MongoDB伺服器每一個Mongod執行個體只能使用2G的資料檔案。這是由於地址指標只能支援32位。
特性

它的特點是高效能、易部署、易使用,儲存資料非常方便。主要功能特性有:

  • 面向集合儲存,易儲存物件類型的資料。
  • 模式自由。
  • 支援動態查詢。
  • 支援完全索引,包含內部對象。
  • 支援查詢。
  • 支援複製和故障恢複。
  • 使用高效的位元據儲存,包括大型物件(如視頻等)。
  • 自動處理片段,以支援雲端運算層次的擴充性
  • 支援RUBY,PYTHON,JAVA,C++,PHP等多種語言。
  • 檔案儲存體格式為BSON(一種JSON的擴充)
  • 可通過網路訪問

所謂“面向集合”(Collenction-Orented),意思是資料被分組儲存在資料集中,被稱為一個集合(Collenction)。每個 集合在資料庫中都有一個唯一的標識名,並且可以包含無限數目的文檔。集合的概念類似關係型資料庫(RDBMS)裡的表(table),不同的是它不需要定 義任何模式(schema)。

模式自由(schema-free),意味著對於儲存在mongodb資料庫中的檔案,我們不需要知道它的任何結構定義。如果需要的話,你完全可以把不同結構的檔案儲存體在同一個資料庫裡。

儲存在集合中的文檔,被儲存為鍵-值對的形式。鍵用於唯一標識一個文檔,為字串類型,而值則可以是各中複雜的檔案類型。我們稱這種儲存形式為BSON(Binary Serialized dOcument Format)。

其它

在《MongoDB The Definitive Guide》中介紹的MongoDB內部構造只有這麼多,如果真要把它說清楚,可能需要另外一本書來專門講述了。比如內部的JS解析,查詢的最佳化,索引的建立等等。有興趣的朋友可以直接參考原始碼:)

MongoDB的基本特性與內部構造

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.