存儲引擎
存儲引擎是一個數據庫的核心,主要負責內存、磁盤里數據的管理和維護。
MongoBD的優勢,在于其數據模型定義的靈活性、以及可拓展性。但不要忽略,其存儲引擎也是插件式的存在,支持不同類型的存儲引擎,使用不同的引擎可以解決不同場景的問題,也支持用戶去自定義實現存儲引擎。
在設計之初,為了實現server與物理存儲的解耦,引入存儲引擎作為中間插件,類似于MySQL的:基于B+Tree的InnoDB引擎和基于LSM樹的RocketsDB引擎,還有快速寫入和讀取的MyISAM引擎。
目前MongoDB主要有倆種引擎
- WiredTiger 存儲引擎:默認的存儲引擎為 WiredTiger 存儲引擎,非常適合大多數工作負載,建議用于新部署。WiredTiger 提供文檔級并發模型、檢查點和數據壓縮等功能。
- In-Memory 存儲引擎:In-Memory 存儲引擎在 MongoDB Enterprise 中可用。它不是將文檔存儲在磁盤上,而是將它們保留在內存中以獲得更可預測的數據延遲。
此外,MongoDB 3.0 提供了 可插拔的存儲引擎 API ,允許第三方為 MongoDB 開發存儲引擎,這點和 MySQL 也比較類似。
WiredTiger
目前世面上主流的存儲引擎大多是基于B+Tree或者LSM Tree實現,類似LevelDB、RocketsDB,都是基于的LSM樹。
但WiredTiger引擎與InnoDB一樣,使用了B+樹作為索引存儲結構。
此外,WiredTiger 還支持 LSM(Log Structured Merge) 樹作為存儲結構,MongoDB 在使用 WiredTiger 作為存儲引擎時,默認使用的是 B+ 樹。
MongoDB在3.2之前是B樹,之后默認WiredTiger引擎后,便一直是B+樹
使用 B+ 樹時,WiredTiger 以 page 為基本單位往磁盤讀寫數據。
B+ 樹的每個節點為一個 page,共有三種類型的 page:
- root page(根節點):B+ 樹的根節點。
- internal page(內部節點):不實際存儲數據的中間索引節點。
- leaf page(葉子節點):真正存儲數據的葉子節點,包含一個頁頭(page header)、塊頭(block header)和真正的數據(key/value),其中頁頭定義了頁的類型、頁中實際載荷數據的大小、頁中記錄條數等信息;塊頭定義了此頁的 checksum、塊在磁盤上的尋址位置等信息。
借助 WiredTiger,MongoDB 支持所有集合和索引的壓縮。壓縮可以最大限度地減少存儲使用,但需要額外的 CPU。
In-Memory
從 MongoDB Enterprise 版本 3.2.6 開始,內存存儲引擎是 64 位版本中通用可用性 (GA) 的一部分。除了一些元數據和診斷數據外,內存存儲引擎不維護任何磁盤數據,包括配置數據、索引、用戶憑據等。
內存存儲引擎是非持久性的,不會將數據寫入持久性存儲。非持久性數據包括應用程序數據和系統數據,例如用戶、權限、索引、副本集配置、分片集群配置等。
因此,日志或等待數據 持久化的概念不適用于內存存儲引擎。
所以一般不會使用該引擎,其丟數據風險比較高。內存存儲引擎在進程關閉后不會保留數據。
但通過避免磁盤 I/O,內存存儲引擎可以實現更可預測的數據庫操作延遲。
要選擇內存存儲引擎,請指定:
- inMemory對于–storageEngine選項,或者 storage.engine如果使用配置文件則進行設置。
- –dbpath,或者storage.dbPath使用配置文件。雖然內存存儲引擎不會將數據寫入文件系統,但它會維護–dbpath小型元數據文件和診斷數據以及用于構建大型索引的臨時文件。
mongod --storageEngine inMemory --dbpath <path>