今天看了mongodb的官方文檔中的WiredTiger Storage Engine ,說說我對WiredTiger Storage Engine 的理解!web
在mongodb3.2版本之後,wiredTiger 存儲引擎爲默認的儲存引擎。mongodb
Document Level Concurrency數據庫
WiredTiger 的寫操做使用了Document 級別的併發控制,所以多個clients能夠同時同一個collection 中的不一樣的document 進行修改。併發
爲了儘量多的讀和寫操做,WiredTiger 使用了optimistic concurrency control(樂觀的併發控制),至關於樂觀鎖,WiredTiger的全局的專注的鎖,僅僅存在於database 和 collections 級別,例如:drop 一個collections,須要一個database級別的鎖。當存儲引擎在database 和collection的鎖之間發生衝突時,其中的一個將會引起數據庫寫的衝突致使mongdb 去從新進行此操做。spa
Snapshots and Checkpoints日誌
WiredTiger 使用 多版本併發控制(MVCC)。再開始的操做中,WiredTiger 爲這個事務提供一個數據的時間點的快照(snapshot),一個快照呈現一組在內存中的數據的視圖。索引
當寫進磁盤時,WiredTiger 把全部的在snapshot中的數據經過相同的方法傳遞到磁盤中的數據文件。把在數據文件中的久經耐用的數據做爲一個檢查站(checkpoint),這個檢查站確保數據文件和上一個檢查站的數據是一致的,包括最後一個檢查站。eg:檢查站能夠做爲數據的恢復的點。mongodb配置的WiredTiger 去建立的站點是在間隔60秒或者2 GB的日誌數據。進程
在寫一個新的站點期間,若是前面一個站點仍然是有效的,就這點而論,若是mongodb 意外結束或者忽然遇到一個錯誤,再從新開始以前,mongodb 能夠從上一個有效的checkpoint恢復數據。事務
當WiredTiger 元數據的表被原子性的更新到新的檢查站點的說明文檔時,這個新的站點變得可用和穩定,一但新的站點變的可用,WiredTiger會釋放pages從舊的檢查站點。內存
Journal
WiredTiger 使用一個write-ahead 處理log, 而且結合檢查站點去確保數據的耐久性。
WiredTiger 日誌呈現了全部的數據在檢查站點之間的變化,若是mongodb在檢查站點之間退出,它使用日誌去從新從上一個檢查站點更新全部的被修改的數據,信息更新的頻率和mongodb把日誌數據寫到磁盤的頻率相同。WiredTiger 的日誌是使用了快速壓縮庫被壓縮,若是本身想指定一個混合的壓縮運算或者不壓縮使用 storage.wiredTiger.engineConfig.journalCompressor
WiredTiger的最小的log 記錄大小是128 bytes。若是一個log 記錄小於等於128 bytes, WiredTiger 不會壓縮這個log 記錄。
Compression
在mongodb中,使用WiredTiger ,mongodb 支持壓縮爲全部的collection 和index ,壓縮是使用額外CPU的開支減小存儲空間。默認的狀況下,WiredTiger使用塊級別的壓縮,全部的collections 被使用快速壓縮庫,全部的索引(index)被使用前綴壓縮。在壓縮collections 的時候 ,塊級別的壓縮用 zlib 也是可用的,去指定一個輪流的壓縮運算或者不壓縮,使用storage.wiredTiger.collectionConfig.blockCompressor ,假如你不想去壓縮index,你能夠看下storage.wiredTiger.indexConfig.prefixCompression
對於大多數工做的負載,默認的壓縮設置平衡了存儲效率和處理要求。
Memory Use
mongodb 使用WiredTiger,mongodb 利用WiredTiger內部的cache和文件系統的cache。
在mongdb 3.4 的版本之後,WiredTiger 內部的cache將變得更大:50%內存減去1GB 或者是256MG,經過文件系統的cache ,mongodb 自動的使用全部的空閒的內存,這些內存是不被WiredTiger cache 或者其餘進程使用的。數據是在文件系統的cache裏被壓縮的。去調整WiredTiger內部cache 的大小能夠看storage.wiredTiger.engineConfig.cacheSizeGB。
切記 ,不要調整WiredTiger內部cache的大小超過默認值。