1. 程式人生 > >Wiredtiger 儲存引擎概述

Wiredtiger 儲存引擎概述

儲存引擎在任何的資料庫裡面都是非常重要的模組, 它主要負責資料的寫入, 讀取以及管理。Mongodb 從3.2之後, 採用WiredTiger 作為預設的儲存引擎,其主要的特性如下:

btree、page

WiredTiger 採用了b-tree來組織管理資料, 一個集合的Namespace, 來關聯到該集合的索引, 通過索引可以有效地將感興趣的部分資料載入到記憶體中, 通常會放進Cache裡面, 以備後續使用。 將資料從磁碟讀入記憶體或者從記憶體flush到磁碟的基本操作單位是一個記憶體頁。

transaction

Mongodb 對於事物的支援是逐漸迭代的, 在3.2版本它支援了單個collect的單文件的事務性, 在3.6版支援了多文件的事務性, 到4.0版本我們會得到跨collect的事務性。
事物的語義和使用方法和其他的資料庫很類似:

begin_transaction;
    insert/update/delete/query
tranaction_commit or transaction_rollback

事物的語義可以保證在事物開始到結束的過程中的一系列操作, 要麼成功, 要麼回滾到第一條操作之前, 這對於資料的一致性是非常有用的。

journal

Journal是儲存引擎用來輔助儲存的一種機制, 它通常和checkpoint配合使用, 在系統發生異常的時候, 儘可能確保使用者的資料不丟失。
在dbpath目錄下面的journal目錄用來存放journal檔案,該檔案用來記錄write-ahead redo日誌。該目錄下還包含一個用來儲存最近佇列數的檔案。一次正常的shutdown會刪除journal目錄下的所有檔案,而非正常的shutdown(比如崩潰)則不會刪除檔案。當mongod程序重啟時,這些檔案用來自動恢復資料庫保證資料的一致性。
當MongoDB重新整理journal檔案的寫操作到資料檔案時,會記錄哪些journal寫操作已經被重新整理過。一旦journal檔案中只包含被重新整理過的寫操作時,這個檔案就不會再起到恢復資料的作用,MongoDB會刪除它,或者將其回收用作新的journal檔案

block manager

block manager是Cache和磁碟相互互動的一個模組, 主要負責開啟、關閉檔案(包含索引檔案、資料檔案以及元資料等)以及page的讀寫等。

cache

資料庫的資料通常是很大的, 而可用的記憶體容量是有限的, 通常需要吧重要的資料以及讀取過的資料放進記憶體裡面, 以備後續使用。 隨著系統的使用, 越來越多的記憶體頁被放進了記憶體, 記憶體容量吃緊的時候, 需要將一部分資料移出記憶體。
WiredTiger的Cache採用b-tree的方式組織,每個b-tree節點為一個page,root page是b-tree的根節點,internal page是b-tree的中間索引節點,leaf page是真正儲存資料的葉子節點;b-tree的資料以page為單位按需從磁碟載入或寫入磁碟。

checkpoint

checkpoint是每隔一定的時間, 將集合的所有修改寫入到磁碟, 在記憶體中, 將資料的修改寫入到一個extent 裡面, 多個extent組成一個page, 一個或者多個page構成了一個checkpoint。 這裡要注意的是, 對於資料的update操作, 並不是直接在原來的資料頁進行修改, 而是寫入到新分配的page。