MongoDB存儲數據

想要深刻了解MongoDB如何存儲數據以前,有一個概念必須清楚,那就是Memeory-Mapped Files。算法

 

Memeory-Mapped Files數據庫

 

下圖展現了數據庫是如何跟底層系統打交道的。app

 

  • 內存映射文件是OS經過mmap在內存中建立一個數據文件,這樣就把文件映射到一個虛擬內存的區域;優化

  • 虛擬內存對於進程來講,是一個物理內存的抽象,尋址空間大小爲2^64spa

  • 操做系統經過mmap來把進程所需的全部數據映射到這個地址空間(紅線),而後再把當前須要處理的數據映射到物理內存(灰線); (這能夠理解成,在數據聲明時數據是放在虛擬內存中的,數據聲明的做用就是說明進程中用哪些數據,但並不須要指定用到什麼樣的數據,這時只說明它的地址並不涉及到具體的數值,即並不進行實例化,而若是對象實例化,則會在虛擬內存中映射到物理內存中)
    操作系統

  • 當進程訪問某個數據時,若是數據不在虛擬內存裏,觸發page fault,而後OS從硬盤裏把數據加載進虛擬內存和物理內存;
    對象

  • 若是物理內存滿了,觸發swap-out操做,這時有些數據就須要寫回磁盤,若是是純粹的內存數據,寫回swap分區,若是不是就寫回磁盤。進程

 

MongoDB的存儲模型

 

  • 有了內存映射文件,要訪問的數據就好像都在內存裏面,簡單化了MongoDB訪問和修改數據的邏輯內存

  • MongoDB讀寫都只是和虛擬內存打交道,剩下都交給OS打理map

  • 虛擬內存大小=全部文件大小+其餘一些開銷(鏈接,堆棧)

  • 若是journal開啓,虛擬內存大小差很少翻番

 

  • 使用MMF的好處:

  • 1:不用本身管理內存和磁盤調度

  • 2:LRU策略

  • 3:重啓過程當中,Cache依然在

 

  • 使用MMF的壞處:

  • 1:RAM使用會受磁盤碎片的影響,高預讀也會影響

  • 2:沒法本身優化調度算法,只能使用LRU

相關文章
相關標籤/搜索