MongoDB 存儲引擎Wiredtiger原理剖析


今天開始看MongoDB 3.2的文檔,發現了這么兩句話

Support for Multiple Storage Engines

MongoDB supports multiple storage engines, such as:

WiredTiger Storage Engine and MMAPv1 Storage Engine.

可能閱讀的中文書籍太Low了,第一次看到這兩個存儲引擎,在中文社區看到對WiredTiger方面的介紹,轉載到此處

Mongodb-3.2已經WiredTiger設置為了默認的存儲引擎,最近通過閱讀wiredtiger源代碼(在不了解其內部實現的情況下,讀代碼難度相當大,代碼量太大,強烈建議官方多出些介紹文章),理清了wiredtiger的大致原理,並簡單總結,不保證內容都是正確的,如有問題請指出,歡迎討論交流。

按照Mongodb默認的配置,WiredTiger的寫操作會先寫入Cache,並持久化到WAL(Write ahead log),每60s或log文件達到2GB時會做一次Checkpoint,將當前的數據持久化,產生一個新的快照。Wiredtiger連接初始化時,首先將數據恢復至最新的快照狀態,然后根據WAL恢復數據,以保證存儲可靠性。
0102-zyd-MongoDB WiredTiger存儲引擎實現原理-1

Wiredtiger的Cache采用Btree的方式組織,每個Btree節點為一個page,root page是btree的根節點,internal page是btree的中間索引節點,leaf page是真正存儲數據的葉子節點;btree的數據以page為單位按需從磁盤加載或寫入磁盤。
0102-zyd-MongoDB WiredTiger存儲引擎實現原理-2

Wiredtiger采用Copy on write的方式管理修改操作(insert、update、delete),修改操作會先緩存在cache里,持久化時,修改操作不會在原來的leaf page上進行,而是寫入新分配的page,每次checkpoint都會產生一個新的root page。

0102-zyd-MongoDB WiredTiger存儲引擎實現原理-3

Checkpoint時,wiredtiger需要將btree修改過的PAGE都進行持久化存儲,每個btree對應磁盤上一個物理文件,btree的每個PAGE以文件里的extent形式(由文件offset + size標識)存儲,一個Checkpoit包含如下元數據:

  • root page地址,地址由文件offset,size及內容的checksum組成
    alloc extent list地址,存儲從上次checkpoint起新分配的extent列表
    discard extent list地址,存儲從上次checkpoint起丟棄的extent列表
    available extent list地址,存儲可分配的extent列表,只有最新的checkpoint包含該列表
    file size 如需恢復到該checkpoint的狀態,將文件truncate到file size即可

     

Mongodb里一個典型的Wiredtiger數據庫存儲布局大致如下:


$tree . ├── journal │   ├── WiredTigerLog.0000000003 │   └── WiredTigerPreplog.0000000001 ├── WiredTiger ├── WiredTiger.basecfg ├── WiredTiger.lock ├── WiredTiger.turtle ├── admin │   ├── table1.wt │   └── table2.wt ├── local │   ├── table1.wt │   └── table2.wt └── WiredTiger.wt
  • WiredTiger.basecfg存儲基本配置信息
  • WiredTiger.lock用於防止多個進程連接同一個Wiredtiger數據庫
  • table*.wt存儲各個tale(數據庫中的表)的數據
  • WiredTiger.wt是特殊的table,用於存儲所有其他table的元數據信息
  • WiredTiger.turtle存儲WiredTiger.wt的元數據信息
  • journal存儲Write ahead log

0102-zyd-MongoDB WiredTiger存儲引擎實現原理-4

一次Checkpoint的大致流程如下

對所有的table進行一次Checkpoint,每個table的Checkpoint的元數據更新至WiredTiger.wt
對WiredTiger.wt進行Checkpoint,將該table Checkpoint的元數據更新至臨時文件WiredTiger.turtle.set
將WiredTiger.turtle.set重命名為WiredTiger.turtle
上述過程如中間失敗,Wiredtiger在下次連接初始化時,首先將數據恢復至最新的快照狀態,然后根據WAL恢復數據,以保證存儲可靠性。

參考資料

Wiredtiger官方文檔
Mongodb internal
Wiredtiger Block Manager Overview

 

 

作者簡介

張友東,就職於阿里雲飛天技術部,主要關注分布式存儲、Nosql等技術領域,參與TFS(淘寶分布式文件系統)、AliCloudDB


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM