MongoDB--三、儲存引擎

chenside2002發表於2020-09-28

名詞解析:

page:作業系統頁面檔案,磁碟資料組成單位

checkpoint:

3.1、mongoDB儲存引擎檢視

mongoDB3.2版本之後選擇了wiredTiger作為預設儲存引擎(不是inMemory引擎),檢視資料庫儲存引擎語句如下:

db.serverStatus()

在這裡插入圖片描述

3.2、儲存引擎解析

官網:http://source.wiredtiger.com/2.0.1/

wiredTiger通過Btree管理資料,B樹的資料結構如下圖。

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

在這裡插入圖片描述
(1)Wiredtiger的Cache採用Btree的方式組織,每個Btree節點為一個page,root page是btree的根節點,internal page是btree的中間索引節點,leaf page是真正儲存資料的葉子節點;btree的資料以page為單位按需從磁碟載入或寫入磁碟。

在這裡插入圖片描述

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

(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即可

    (4) 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

在這裡插入圖片描述

一次Checkpoint的大致流程如下

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

3.3、記憶體調整

官網1:https://docs.mongodb.com/v4.2/reference/configuration-options/#storage.wiredTiger.engineConfig.cacheSizeGB

官網2:https://docs.atlas.mongodb.com/sizing-tier-selection/

WiredTiger資料引擎記憶體快取限制,推薦大於8(GB)

storage:
	wiredTiger:
		engineConfig:
			cacheSizeGB: 8

官網:https://docs.mongodb.com/v4.2/reference/parameters/#param.maxIndexBuildMemoryUsageMegabytes

索引記憶體限制,推薦大於300(MB)

setParameter:
	maxIndexBuildMemoryUsageMegabytes: 300

相關文章