今天看了mongodb的官方文檔中的WiredTiger Storage Engine ,說說我對(duì)WiredTiger Storage Engine 的理解!

  在mongodb3.2版本以后,wiredTiger 存儲(chǔ)引擎為默認(rèn)的儲(chǔ)存引擎。

Document Level Concurrency

  WiredTiger 的寫操作使用了Document 級(jí)別的并發(fā)控制,因此多個(gè)clients可以同時(shí)同一個(gè)collection 中的不同的document  進(jìn)行修改。

  為了盡可能多的讀和寫操作,WiredTiger 使用了optimistic  concurrency control(樂觀的并發(fā)控制),相當(dāng)于樂觀鎖,WiredTiger的全局的專一的鎖,僅僅存在于database 和 collections 級(jí)別,例如:drop 一個(gè)collections,需要一個(gè)database級(jí)別的鎖。當(dāng)存儲(chǔ)引擎在database 和collection的鎖之間發(fā)生沖突時(shí),其中的一個(gè)將會(huì)引發(fā)數(shù)據(jù)庫(kù)寫的沖突導(dǎo)致mongdb 去重新進(jìn)行此操作。

Snapshots and Checkpoints

  WiredTiger 使用 多版本并發(fā)控制(MVCC)。再開始的操作中,WiredTiger 為這個(gè)事務(wù)提供一個(gè)數(shù)據(jù)的時(shí)間點(diǎn)的快照(snapshot),一個(gè)快照呈現(xiàn)一組在內(nèi)存中的數(shù)據(jù)的視圖。

  當(dāng)寫進(jìn)磁盤時(shí),WiredTiger 把所有的在snapshot中的數(shù)據(jù)通過相同的方法傳遞到磁盤中的數(shù)據(jù)文件。把在數(shù)據(jù)文件中的久經(jīng)耐用的數(shù)據(jù)作為一個(gè)檢查站(checkpoint),這個(gè)檢查站確保數(shù)據(jù)文件和上一個(gè)檢查站的數(shù)據(jù)是一致的,包括最后一個(gè)檢查站。eg:檢查站可以作為數(shù)據(jù)的恢復(fù)的點(diǎn)。mongodb配置的WiredTiger 去創(chuàng)建的站點(diǎn)是在間隔60秒或者2 GB的日志數(shù)據(jù)。

  在寫一個(gè)新的站點(diǎn)期間,如果前面一個(gè)站點(diǎn)仍然是有效的,就這點(diǎn)而論,如果mongodb 意外結(jié)束或者突然遇到一個(gè)錯(cuò)誤,再重新開始之前,mongodb 可以從上一個(gè)有效的checkpoint恢復(fù)數(shù)據(jù)。

  當(dāng)WiredTiger 元數(shù)據(jù)的表被原子性的更新到新的檢查站點(diǎn)的說明文檔時(shí),這個(gè)新的站點(diǎn)變得可用和穩(wěn)定,一但新的站點(diǎn)變的可用,WiredTiger會(huì)釋放pages從舊的檢查站點(diǎn)。

Journal

  WiredTiger 使用一個(gè)write-ahead 處理log, 并且結(jié)合檢查站點(diǎn)去確保數(shù)據(jù)的耐久性。

  WiredTiger 日志呈現(xiàn)了所有的數(shù)據(jù)在檢查站點(diǎn)之間的變化,如果mongodb在檢查站點(diǎn)之間退出,它使用日志去重新從上一個(gè)檢查站點(diǎn)更新所有的被修改的數(shù)據(jù),信息更新的頻率和mongodb把日志數(shù)據(jù)寫到磁盤的頻率相同。WiredTiger 的日志是使用了快速壓縮庫(kù)被壓縮,如果自己想指定一個(gè)混合的壓縮運(yùn)算或者不壓縮使用 storage.wiredTiger.engineConfig.journalCompressor 

  WiredTiger的最小的log 記錄大小是128 bytes。如果一個(gè)log 記錄小于等于128 bytes, WiredTiger 不會(huì)壓縮這個(gè)log 記錄。

Compression

  在mongodb中,使用WiredTiger ,mongodb 支持壓縮為所有的collection 和index ,壓縮是使用額外CPU的開支減少存儲(chǔ)空間。默認(rèn)的情況下,WiredTiger使用塊級(jí)別的壓縮,所有的collections 被使用快速壓縮庫(kù),所有的索引(index)被使用前綴壓縮。在壓縮collections 的時(shí)候 ,塊級(jí)別的壓縮用 zlib  也是可用的,去指定一個(gè)輪流的壓縮運(yùn)算或者不壓縮,使用storage.wiredTiger.collectionConfig.blockCompressor ,假如你不想去壓縮index,你可以看下storage.wiredTiger.indexConfig.prefixCompression 

  對(duì)于大多數(shù)工作的負(fù)載,默認(rèn)的壓縮設(shè)置平衡了存儲(chǔ)效率和處理要求。

Memory Use

  mongodb 使用WiredTiger,mongodb 利用WiredTiger內(nèi)部的cache和文件系統(tǒng)的cache。

  在mongdb 3.4 的版本以后,WiredTiger 內(nèi)部的cache將變得更大:50%內(nèi)存減去1GB 或者是256MG,通過文件系統(tǒng)的cache ,mongodb 自動(dòng)的使用所有的空閑的內(nèi)存,這些內(nèi)存是不被WiredTiger cache 或者其他進(jìn)程使用的。數(shù)據(jù)是在文件系統(tǒng)的cache里被壓縮的。去調(diào)整WiredTiger內(nèi)部cache 的大小可以看storage.wiredTiger.engineConfig.cacheSizeGB。

切記 ,不要調(diào)整WiredTiger內(nèi)部cache的大小超過默認(rèn)值。

 

分類: mongodb