MongoDB的內部構造

2021-08-27 10:51:19 字數 1974 閱讀 3936

對於大多數的mongodb的使用者來說,mongodb就像是乙個大黑盒,但是如果你能夠了解到mongodb內部一些構造的話,將有利於你更好地理解和使用mongodb。

bson

在mongodb中,文件是對資料的抽象,它被使用在client端和server端的互動中。所有的client端(各種語言的driver)都會使用這種抽象,它的表現形式就是我們常說的bson(binary json )。

bson是乙個輕量級的二進位制資料格式。mongodb能夠使用bson,並將bson作為資料的儲存存放在磁碟中。

當client端要將寫入文件,使用查詢等等操作時,需要將文件編碼為bson格式,然後再傳送給server端。同樣,server端的返回結果也是編碼為bson格式再放回給client端的。

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

效率

bson是為效率而設計的,它只需要使用很少的空間。即使在最壞的情況下,bson格式也比json格式再最好的情況下儲存效率高。

傳輸性

在某些情況下,bson會犧牲額外的空間讓資料的傳輸更加方便。比如,字串的傳輸的字首會標識字串的長度,而不是在字串的末尾打上結束的標記。這樣的傳輸形式有利於mongodb修改傳輸的資料。

效能

最後,bson格式的編碼和解碼都是非常快速的。它使用了c風格的資料表現形式,這樣在各種語言中都可以高效地使用。

更多關於bson的介紹,可以參考:

寫入協議

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 the definitive guide mongodb的官方文件基本是how to do的介紹,而關於how it worked卻少之又少,本人也剛買了 mongodb thedefinitive guide 的影印版,還沒來得及看,本文原作者將其書中一些...

MongoDB內部結構分析

對於大多數的mongodb的使用者來說,mongodb就像是乙個大黑盒但是如果你能夠了解到mongodb內部一些構造的話,將有利於你更好地理解和使用mongodb。bson 在mongodb中,文件是對資料的抽象,它被使用在client端和server端的互動中。所有的client端 各種語言的dr...

建構函式內部機制

1.建構函式內部原理 建構函式用new關鍵字呼叫時相當於在建構函式內部隱式的執行三步驟 1.var this 2.執行建構函式內部內容 3.return this 用new關鍵字呼叫時 function person name,age this name name this age age retu...