有人在Quora上提問:MongoDB數據文件內部的組織結構是什麼樣的。隨後10gen的工程師Jared Rosoff出來作了簡短的回答。html
每個數據庫都有本身獨立的文件。若是你開啓了directoryperdb選項,那你每一個庫的文件會單獨放在一個文件夾裏。數據庫
數據庫文件在內部會被切分紅單個的塊,每一個塊只保存一個名字空間的數據。在MongoDB中,名字空間用於區分不一樣的存儲類別。好比每一個collection有一個獨立的名字空間,每一個索引也有本身的名字空間。ide
在一個塊中,會保存多條記錄,每條記錄是BSON格式的,記錄與記錄之間經過雙向鏈表進行鏈接。日誌
索引數據也存在數據文件中,不過索引是被組織成B-Tree結構,而不是雙向鏈表。htm
對每一個數據庫,有一個命名空間文件,用於保存每一個名字空間對應的元數據。咱們經過查詢這些元數據來找到對應的名字空間的存儲塊位置。索引
若是你開啓了jorunaling日誌,那麼還會有一些文件存儲着你全部的操做記錄。進程
下面圖片摘自10gen工程師Mathias Stearn在MongoSV2011大會上的發言稿,手繪的數據文件結構。圖片
每一個數據庫有相應的數據文件和命名空間文件內存
數據文件從16MB開始,新的數據文件比上一個文件大一倍,最大爲2GBget
文件使用MMAP進行內存映射,會將全部數據文件映射到內存中,可是隻是虛擬內存,只有訪問到這塊數據時纔會交換到物理內存。
MongoDB的數據文件映射到內存表中的位置
使用32位機器的話,內存地址最大能夠標識4GB內存
可是在32位機器上,4GB內存會有1GB被內核打敗,大約0.5GB會用於mongod進程的stack空間,只剩下大約2.5GB可用於映射數據文件。