儲存引擎Wiredtiger原理剖析

2021-10-24 21:21:53 字數 1727 閱讀 9478

今天開始看mongodb 3.2的文件,發現了這麼兩句話

support for multiple storage engines

mongodb supports multiple storage engines, such as:

wiredtiger storage engine and

mmapv1 storage engine.

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

按照mongodb預設的配置,wiredtiger的寫操作會先寫入cache,並持久化到wal(write ahead log),每60s或log檔案達到2gb時會做一次checkpoint,將當前的資料持久化,產生乙個新的快照。wiredtiger連線初始化時,首先將資料恢復至最新的快照狀態,然後根據wal恢復資料,以保證儲存可靠性。

wiredtiger的cache採用btree的方式組織,每個btree節點為乙個page,root page是btree的根節點,internal page是btree的中間索引節點,leaf page是真正儲存資料的葉子節點;btree的資料以page為單位按需從磁碟載入或寫入磁碟。

wiredtiger採用copy on write的方式管理修改操作(insert、update、delete),修改操作會先快取在cache裡,持久化時,修改操作不會在原來的leaf page上進行,而是寫入新分配的page,每次checkpoint都會產生乙個新的root page。

checkpoint時,wiredtiger需要將btree修改過的page都進行持久化儲存,每個btree對應磁碟上乙個物理檔案,btree的每個page以檔案裡的extent形式(由檔案offset + size標識)儲存,乙個checkpoit包含如下元資料:

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
一次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

WiredTiger儲存引擎

儲存引擎是資料庫的一部分,負責管理如何在記憶體和磁碟上儲存資料。許多資料庫支援多個儲存引擎,其中不同的引擎對特定工作負載的效能會更好。例如,乙個儲存引擎可能為讀取繁重的工作負載提供更好的效能,另乙個可能支援更高的寫入操作吞吐量。也可以看看 儲存引擎 可以。您可以擁有使用不同儲存引擎的副本集成員。注意...

Mongo 儲存引擎 WiredTiger概覽

wiredtiger的寫操作會先寫入cache,並持久化到wal write ahead log 每60s或log檔案達到2gb時會做一次checkpoint,將當前的資料持久化,產生乙個新的快照。wiredtiger的cache採用btree的方式組織,每個btree節點為乙個page,root ...

ConcurrentHashMap儲存原理

concurrenthashmap是併發雜湊對映表的實現,它允許多執行緒環境完全併發讀取,並且支援16個執行緒併發更新。相對於hashtable和同步包包裝的hashmap collections.synchronizedmap new hashmap 具有更高的併發性。在hashtable和同步包...