鄧開表同學實戰MongoDB系列文章,非常不錯,贊!大力推薦!
本文是第7篇,主要講述MongoDB存儲引擎的介紹的使用和配置的實戰經驗,非常值得一看。
前面系列文章:
MongoDB安全實戰之Kerberos認證
MongoDB Compass--MongoDB DBA必備的管理工具
MongoDB安全實戰之審計
MongoDB安全實戰之SSL協議加密
MongoDB安全實戰之網絡安全加固
MongoDB索引的介紹
1、前言
存儲引擎是數據庫的組成部分,負責管理數據存儲。
MongoDB支持的以下存儲引擎:
存儲引擎 | 描述 |
WiredTiger存儲引擎 | 從MongoDB 3.2開始默認的存儲引擎,新的版本MongoDB推薦使用WiredTiger存儲引擎。 |
MMAPv1存儲引擎 | MMAPv1是MongoDB 3.2之前版本默認的存儲引擎。 |
In-Memory存儲引擎 | MongoDB企業版支持In-Memory存儲引擎。 |
表1
2、WiredTiger存儲引擎
從MongoDB 3.2開始,MongoDB默認的存儲引擎為WiredTiger存儲引擎。WiredTiger存儲引擎提供文檔級的併發模型,檢查點、壓縮、加密等多項功能。基於這些功能,WiredTiger存儲引擎提供最全面的性能和存儲效率。
存儲引擎可以通過--storageEngine啟動項或在配置文件中storage.engine中設置。
2.1 WiredTiger存儲引擎的優勢:
·最大化可用緩存
WiredTiger最大限度地使用可用的內存作為緩存來減少I/O瓶頸。有兩個緩存被使用:WiredTiger緩存和文件系統緩存。WiredTiger緩存存儲未壓縮的數據和提供的內存性能。操作系統的文件系統緩存存儲壓縮數據。當數據不在WiredTiger緩存中找到時,WiredTiger將在文件系統緩存查找數據。
·WiredTiger緩存大小默認為50%RAM
沒有了文件系統緩存,最小的可用內存為20%,這對於任何較低的操作系統來說都可能受到資源的限制。而WiredTiger緩存大小默認為50%的RAM,將緩解資源限制的問題。
·高吞吐量
WiredTiger使用“寫時複製”,在文件更新時,WiredTiger將創建一個新的文檔副本,確定返回給用戶的是最新版本。這種方法允許多個客戶端同時修改集合中的不同文檔,從而提高併發和吞吐量。當使用多核服務器,多個線程正在寫入不同的文檔時,就實現了最佳的寫入性能。
·降低存儲空間和提高磁盤IOPS
WiredTiger使用壓縮算法來減少存儲在磁盤上的數據空間。不僅降低存儲壓力,而且提高磁盤讀寫效率。文本文件是高度可壓縮的,而二進制數據可能不可壓縮,因為它可能已經被編碼和壓縮。WiredTiger在壓縮時會消耗額外的CPU,但用戶可以配置壓縮方案優化CPU的開銷與壓縮比。Snappy是默認的壓縮引擎,提供了較低的CPU開銷高壓縮比之間的良好平衡。Zlib壓縮引擎可以實現更高的壓縮比,但會增加額外的CPU。
·壓縮索引和日誌
索引可以在內存中壓縮,也可以在磁盤上壓縮。WiredTiger利用前綴壓縮索引,節約內存的使用以及釋放存儲的IOPS。日誌是默認Snappy壓縮。
·多核的可擴展性
WiredTiger在多核架構提供的可擴展性下,利用風險指針、無鎖算法、快速鎖存等技術減少了線程間的爭用。線程可以在不阻塞彼此的情況下執行操作,從而減少線程爭用、提供更好的併發性和更高的吞吐量。
·文檔級併發
WiredTiger使用文檔級併發控制寫操作。使多個客戶端可以同時修改集合的不同的文檔。
對於大多數的讀寫操作,WiredTiger只使用數據庫和集合級的意向鎖。
一些全局操作,通常是涉及多個數據庫的短時間操作,仍然需要全局鎖(即實例範圍)。某些其他操作,如刪除集合,則需要獨佔數據庫鎖。
2.2 WiredTiger存儲引擎的配置
WiredTiger存儲引擎可以通過--storageEngine啟動項或在配置文件中storage.engine中設置。
例如:
mongod--storageEngine wiredTiger --dbpath
或,在配置文件設置如下:
storage:
wiredTiger:
engineConfig:
cacheSizeGB:
journalCompressor:
directoryForIndexes:
collectionConfig:
blockCompressor:
indexConfig:
prefixCompression:
cacheSizeGB:從MongoDB 3.4開始,值取值範圍為256MB至10TB,默認情況下,cacheSizeGB值為50%的RAM減去1GB或是256MB。
journalCompressor:WiredTiger採用預寫事務日誌聯合檢查站,保證數據的持久性。日誌壓縮算法默認為snappy。其他可選值有none或zlib。
directoryForIndexes:默認為false。當為true時,mongod會分別單獨以索引命名的子目錄存儲索引和以集合命令的子目錄存儲集合數據。
blockCompressor:默認值為snappy,用於壓縮集合數據的壓縮的默認類型。其他可選值為none或zlib。
prefixCompression:默認為true,即使用前綴壓縮索引數據。
3、In-Memory存儲引擎
在MongoDB企業版3.2.6開始,In-Memory存儲引擎作為通用性部分。除了一些元數據和診斷數據外,In-Memory存儲引擎只在內存中維護數據,包括配置數據、索引、用戶憑據等。
由於通過避免磁盤I/O,In-Memory存儲引擎的數據庫操作延遲更低。
3.1 In-Memory存儲引擎優勢
·低延遲
·應用可以將單獨的緩存和數據庫層合併成——所有的訪問和管理都使用相同的API、操作工具和安全控件。
3.2 In-Memory存儲引擎配置
mongod--storageEngine inMemory --dbpath
或,在配置文件中如下:
storage:
engine: inMemory
dbPath:
inMemory:
engineConfig:
inMemorySizeGB:
inMemorySizeGB: 類型float,表示In-Memory存儲引擎使用內存大小,默認是50%的物理RAM減去1GB,在3.4版本中,值範圍在256MB到10TB內。
4、MMAPv1存儲引擎
MMAPv1存儲引擎是3.2版本之前的默認存儲引擎。它利用集合級併發性和內存映射文件訪問底層數據存儲。內存管理委託給操作系統。MMAPv1不支持大端架構如s390x(IBM System z系列大型機硬件平臺)。
4.1 MMAPv1存儲引擎優勢
·大容量插入、讀取和更新
4.2 MMAPv1存儲引擎配置
mongod--storageEngine mmapv1 --dbpath
或,在配置文件做如下配置:
storage:
mmapv1:
preallocDataFiles:
nsSize:
quota:
enforced:
maxFilesPerDB:
smallFiles:
journal:
debugFlags:
commitIntervalMs:
preallocDataFiles:默認為True,表示預分配數據文件。
nsSize:默認為16,命名空間文件的默認大小,這些文件是以ns結尾的文件。每個集合和索引都算作名稱空間。此設置控制新創建的命名空間文件的大小。此項對現有文件沒有影響。命名空間文件的最大大小為2047MB。默認值為16MB,提供大約24000個名稱空間。
enforced: 默認為false,表示禁止對每個數據庫擁有的數據文件的最大限制。MongoDB每個數據庫最多有8個數據文件,可以通過maxFilesPerDB調整配額。
maxFilesPerDB: 默認為8,表示每個數據庫的數據文件數量的限制。需要設置enforced選項。
smallFiles: 默認為false,如果為true,MongoDB使用一個較小的默認文件大小。
debugFlags: 作用是提供功能性測試,在系統發生異常關閉時,影響的數據文件的完整性。
commitIntervalMs: 默認值100,表示MongoDB寫入日誌文件時間,單位毫秒。
5、MongoDB存儲引擎性能對比
WiredTIger存儲引擎 | In-Memory存儲引擎 | MMAPv1存儲引擎 | |
寫性能 | 高 | 高 | 中 |
文檔級併發控制 | 文檔級併發控制 | 集合級併發控制 | |
讀性能 | 高 | 高 | 中 |
低延遲 | 中 | 高 | 中 |
支持磁盤壓縮 | 是 | 否 | 否 |
MongoDB查詢語言支持 | 是 | 是 | 是 |
二級索引支持 | 是 | 是 | 是 |
副本集支持 | 是 | 是 | 是 |
分片支持 | 是 | 是 | 是 |
安全控制 | 是 | 是 | 是 |
大數據集的RAM | 是 | 否 | 是 |
表2
閱讀更多 大數據和雲計算技術 的文章