1. 程式人生 > >MongoDB存儲引擎(中)——WiredTiger

MongoDB存儲引擎(中)——WiredTiger

日誌 nal point eas 持久化 journal 可靠性 混合 com

  上一篇博文介紹了MongoDBMMAPv1存儲引擎,本文接著介紹MongoDB另一個存儲引擎——WiredTigerWiredTiger是在MongoDB3.0版本引入的,並且在MongoDB3.2版本開始成為MongoDB默認的存儲引擎。相比較MMAPv1WiredTiger功能更強大,而且具有更高的性能。

  相對於MMAPv1WiredTiger進行了一系列改進:

1. 文件空間分配方式改進

  MMAPv1存儲引擎是在數據庫級別分配文件的,將每個數據庫中所有的集合和索引都混合存儲在數據庫文件中,即使刪除了某個集合或索引,其占用的磁盤空間也很難及時自動回收。WiredTIger

則在集合和索引級別分配文件,將每個數據庫中所有的集合和索引都存儲在單獨的文件中,集合或索引刪除後,其對應文件即可刪除,磁盤空間回收方便。

WiredTiger的一些數據文件:

mongod.lock:用於防止多個進程連接同一個WiredTiger數據庫

.wt文件:存儲各個集合的數據,每個文件100MB

WiredTiger.wt:用於存儲所有集合的元數據信息

WiredTiger.turtle:用於存儲WiredTiger.wt的元數據信息

journal文件夾:用於存儲日誌文件(Write ahead log

2. 文檔級別的並發控制

  WiredTiger存儲引擎使用文檔級別鎖,同一時刻多個寫操作可以修改同一個集合中不同的文檔,但不能修改同一個文檔。這使得

WiredTiger存儲引擎的並發處理能力比MMAPv1更好。

3. 通過檢查點和預寫日誌實現數據持久化

  按照MongoDB默認的配置,WiredTiger的寫操作會先寫入CacheBTree構),Cache大小達到128KB時便將其久化到預寫日誌文件(Write ahead log)WiredTiger60s或日誌文件大小達到2GB時會做一次檢查點Checkpoint,產生指定時間點的數據庫快照(內存中數據的一致性視圖),將快照中的所有數據以一致性方式持久化到數據文件中,保證數據文件和內存數據是一致的。Wiredtiger連接初始化時,首先將數據恢復至最新的快照狀態,然後根據預寫日誌文件恢復數據,以保證存儲可靠性。

4. 內存使用上限可配置

  使用WiredTiger存儲引擎時,MongoDB數據緩存分兩部分:內部緩存和文件系統緩存。內部緩存大小可以使用--wiredTigerCacheSizeGB參數來設置,默認值為:1GBRAM60%1GB之間,取兩值中較大者。文件系統緩存大小則不固定,MongoDB自動使用系統空閑的內存,且數據在文件系統緩存中是壓縮存儲的。

5. 數據壓縮

  使用WiredTiger存儲引擎時,數據庫的集合與索引、日誌文件都是壓縮存儲的,節省了磁盤空間。WiredTiger默認情況下,集合數據使用塊壓縮算法,索引數據則使用前綴壓縮算法。這使得數據占用磁盤空間少,讀寫速度快,花費I/O時間少。

  集合中數據比較少時,壓縮和無壓縮的寫性能相單,無壓縮讀性能反而比壓縮讀性能好。當集合數據很多時,壓縮的讀寫性能則都要比無壓縮的讀寫性能好。

一篇剖析WiredTiger數據組織結構的文章:http://mini.eastday.com/mobile/160630190233714.html。

MongoDB存儲引擎(中)——WiredTiger