mongoDB的儲存機制

2021-09-01 14:06:06 字數 1496 閱讀 8226

在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無法實現writeahead日誌的特性。所以,如果mongodb希望提供一種durability的特性(這一特性可以參考我寫的關於cassandra文章:

),需要實現另外一種儲存引擎。

* 32位系統的mongodb伺服器每乙個mongod例項只能使用2g的資料檔案。這是由於位址指標只能支援32位。

在《mongodb the definitive guide》中介紹的mongodb內部構造只有這麼多,如果真要把它說清楚,可能需要另外一本書來專門講述了。比如內部的js解析,查詢的優化,索引的建立等等。有興趣的朋友可以直接參考源**:)

mongoDB許可權機制

1.新增超級管理員 use admin db.createuser 新增超級管理員 退出mogodb命令模式,到mongodb bin目錄下執行 mongo localhost 27017 admin u admin p 123456 第二種登入方式 mongo db.auth admin 1234...

mongodb 9 mongodb分片機制

1 分片 作用 海量資料讀寫 2 分片架構 組成 mongos,config server,shard,replica set mongos 請求入口,是請求分發中心,把資料請求 到對應share伺服器上 config server 配置伺服器,儲存路由 分片的配置。載入時讀取這些資訊,讓mongo...

mongodb 的儲存結構

描述mongodb是如何儲存資料檔案的 解答為何實際使用的檔案系統空間比資料本身大很多 解釋db.stats 命令 datasize,storagesize,filesize的不同含義 日誌檔案 mongodb 缺省會建立3組100m 大小的journal日誌檔案 日誌檔案用來在故障時恢復沒有及時寫...