今天看了mongodb的官方文檔中的WiredTiger Storage Engine ,說說我對WiredTiger Storage Engine 的理解!
在mongodb3.2版本以后,wiredTiger 存儲引擎為默認(rèn)的儲存引擎。
Document Level Concurrency
WiredTiger 的寫操作使用了Document 級別的并發(fā)控制,因此多個clients可以同時同一個collection 中的不同的document 進(jìn)行修改。
為了盡可能多的讀和寫操作,WiredTiger 使用了optimistic concurrency control(樂觀的并發(fā)控制),相當(dāng)于樂觀鎖,WiredTiger的全局的專一的鎖,僅僅存在于database 和 collections 級別,例如:drop 一個collections,需要一個database級別的鎖。當(dāng)存儲引擎在database 和collection的鎖之間發(fā)生沖突時,其中的一個將會引發(fā)數(shù)據(jù)庫寫的沖突導(dǎo)致mongdb 去重新進(jìn)行此操作。
Snapshots and Checkpoints
WiredTiger 使用 多版本并發(fā)控制(MVCC)。再開始的操作中,WiredTiger 為這個事務(wù)提供一個數(shù)據(jù)的時間點的快照(snapshot),一個快照呈現(xiàn)一組在內(nèi)存中的數(shù)據(jù)的視圖。
當(dāng)寫進(jìn)磁盤時,WiredTiger 把所有的在snapshot中的數(shù)據(jù)通過相同的方法傳遞到磁盤中的數(shù)據(jù)文件。把在數(shù)據(jù)文件中的久經(jīng)耐用的數(shù)據(jù)作為一個檢查站(checkpoint),這個檢查站確保數(shù)據(jù)文件和上一個檢查站的數(shù)據(jù)是一致的,包括最后一個檢查站。eg:檢查站可以作為數(shù)據(jù)的恢復(fù)的點。mongodb配置的WiredTiger 去創(chuàng)建的站點是在間隔60秒或者2 GB的日志數(shù)據(jù)。
在寫一個新的站點期間,如果前面一個站點仍然是有效的,就這點而論,如果mongodb 意外結(jié)束或者突然遇到一個錯誤,再重新開始之前,mongodb 可以從上一個有效的checkpoint恢復(fù)數(shù)據(jù)。
當(dāng)WiredTiger 元數(shù)據(jù)的表被原子性的更新到新的檢查站點的說明文檔時,這個新的站點變得可用和穩(wěn)定,一但新的站點變的可用,WiredTiger會釋放pages從舊的檢查站點。
Journal
WiredTiger 使用一個write-ahead 處理log, 并且結(jié)合檢查站點去確保數(shù)據(jù)的耐久性。
WiredTiger 日志呈現(xiàn)了所有的數(shù)據(jù)在檢查站點之間的變化,如果mongodb在檢查站點之間退出,它使用日志去重新從上一個檢查站點更新所有的被修改的數(shù)據(jù),信息更新的頻率和mongodb把日志數(shù)據(jù)寫到磁盤的頻率相同。WiredTiger 的日志是使用了快速壓縮庫被壓縮,如果自己想指定一個混合的壓縮運算或者不壓縮使用 storage.wiredTiger.engineConfig.journalCompressor
WiredTiger的最小的log 記錄大小是128 bytes。如果一個log 記錄小于等于128 bytes, WiredTiger 不會