MongoDB的內部構造

2022-04-09 03:10:14 字數 2050 閱讀 8619

mongodb的內部構造《mongodb the definitive guide》

mongodb的官方文件基本是how to do的介紹,而關於how it worked卻少之又少,本人也剛買了《mongodb thedefinitive guide》的影印版,還沒來得及看,本文原作者將其書中一些關於mongodb內部現實方面的一些知識介紹如下,值得一看。

今天**了《mongodb the definitive guide》電子版,瀏覽了裡面的內容,還是挺豐富的。是官網文件實際應用方面的乙個補充。和官方文件類似,介紹mongodb的內部原理是少之又少,只有在附錄的乙個章節中介紹了相關內容。

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

在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風格的資料表現形式,這樣在各種語言中都可以高效地使用。

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

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...