MongoDB儲存引擎-MMAPv1學習總結

chenfeng發表於2016-02-22
一.讀寫鎖
不支援MVCC
Version < 2.2 : 
只支援程式級鎖,一個Mongod例項一個鎖。
2.2 ≤ Version < 2.8 : 
支援庫級鎖,一個db一把鎖。
3.0.0 ≤ Version
支援 collection 級別的鎖。
記憶體
記憶體對映檔案
交由作業系統管理,不能
    手動配置管理
無強制記憶體量要求
快取索引、熱資料等


二.Journal日誌
Journal日誌,是MongoDB的預寫日誌WAL(類似Mysql的Redo log)。
journal就是一個預寫事務日誌,來確保資料的永續性,wiredTiger每隔60秒(預設)或者待寫入的資料達到2G時,mongodb將對journal檔案提交一個checkpoint(檢測點,將記憶體中的資料變更flush到磁碟中的資料檔案中,並做一個標記點,表示此前的資料表示已經持久儲存在了資料檔案中,此後的資料變更存在於記憶體和journal日誌)。對於write操作,首先被持久寫入journal,然後在記憶體中儲存變更資料,條件滿足後提交一個新的檢測點,即檢測點之前的資料只是在journal中持久儲存,但並沒有在mongodb的資料檔案中持久化,延遲持久化可以提升磁碟效率,如果在提交checkpoint之前,mongodb異常退出,此後再次啟動可以根據journal日誌恢復資料。journal預設使用了snappy壓縮,檢測點建立後,此前的journal日誌即可清除。mongod可以禁用journal,這在一定程度上可以降低它帶來的開支;對於單點mongod,關閉journal可能會在異常關閉時丟失checkpoint之間的資料(那些尚未提交到磁碟資料檔案的資料);對於replica set架構,永續性的保證稍高,但仍然不能保證絕對的安全。
因為Journal日誌檔案是磁碟上連續分配的空間,MongoDB在執行時透過順序追加的方式記錄,透過順序IO來改善寫效能。同時,後臺會定時刷寫Journal日誌檔案以將寫操作持久化到資料檔案。
透過這種兩次寫的方式,當Mongodb因為一次非正常退出(比如崩潰),重啟mongod程式後會根據journal下的檔案來恢復資料以達到資料一致,防止資料丟失。同時,一次正常的退出時MongoDB會
刷寫並刪除journal目錄下所有檔案。
journal除了故障恢復的作用之外,還可以提高寫入的效能,透過批次提交(batch-commit)的方式減少IO次數,一般預設100ms重新整理一次到journal,可透過下面引數修改:
storage.journal.commitIntervalMs
值越低,重新整理輸出頻率越高,journal的永續性也就越高(故障意外情況下丟失的資料越少),但同時意味著更多的磁碟IO。
2.0以上版本預設開啟的,可以透過nojournal = true 或--nojournal關閉,但建議開啟。
Journal檔案是以“j._”開頭命名的,且是append only的,如果1個journal檔案滿了1G大小,mongodb就會新建立一個journal檔案來使用,一旦某個journal檔案所記載的寫操作都被使用過了,
mongodb就會把這個journal檔案刪除。通常在journal檔案所在的資料夾下,只會存在2~3個journal檔案,除非你使用mongodb每秒都寫入大量的資料。
使用 smallfiles 這個執行時選項可以將journal檔案大小減至128M大小。

三.資料檔案
每個db有1個.ns(namespace)和若干個資料檔案(.n)構成
資料檔案隨著資料的增多而增多,預設從64M開始,資料檔案每新增一次,大小為上一個資料檔案的2倍,上限為2GB。這樣的設計有利於防止資料量較小的資料庫浪費過多的空間,同時又能保證資料量較
大的資料庫有相應的空間使用。
MongoDB會使用預分配方式來保證寫入效能的穩定(可透過–noprealloc關閉,但不建議)。預分配在後臺進行。預分配使得MongoDB始終保持額外的空間和空餘的資料檔案,從而避免了資料增長過快而
帶來的分配磁碟空間引起的阻塞。





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-1992470/,如需轉載,請註明出處,否則將追究法律責任。

相關文章