MongoDB系列7:MongoDB儲存引擎
鄧開表同學實戰MongoDB系列文章,非常不錯,贊!大力推薦!
本文是第7篇,主要講述MongoDB儲存引擎的介紹的使用和配置的實戰經驗,非常值得一看。
前面系列文章:
1
1、前言
儲存引擎是資料庫的組成部分,負責管理資料儲存。
MongoDB支援的以下儲存引擎:
儲存引擎 | 描述 |
WiredTiger儲存引擎 | 從MongoDB 3.2開始預設的儲存引擎,新的版本MongoDB推薦使用WiredTiger儲存引擎。 |
MMAPv1儲存引擎 | MMAPv1是MongoDB 3.2之前版本預設的儲存引擎。 |
In-Memory儲存引擎 | MongoDB企業版支援In-Memory儲存引擎。 |
表1
2
2、WiredTiger儲存引擎
從MongoDB 3.2開始,
儲存引擎可以通過--storageEngine啟動項或在配置檔案中storage.engine中設定。
2.1
2.1 WiredTiger儲存引擎的優勢:
·最大化可用快取
WiredTiger最大限度地使用可用的記憶體作為快取來減少I/O瓶頸。有兩個快取被使用: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.1
2.2 WiredTiger儲存引擎的配置
WiredTiger儲存引擎可以通過--storageEngine啟動項或在配置檔案中storage.engine中設定。
例如:
mongod--storageEngine wiredTiger --dbpath <WiredTigerDBPath>
或,在配置檔案設定如下:
storage:
wiredTiger:
engineConfig:
cacheSizeGB:<number>
journalCompressor: <string>
directoryForIndexes:<boolean>
collectionConfig:
blockCompressor: <string>
indexConfig:
prefixCompression: <boolean>
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
3、In-Memory儲存引擎
在MongoDB企業版3.2.6開始,In-Memory儲存引擎作為通用性部分。除了一些元資料和診斷資料外,In-Memory儲存引擎只在記憶體中維護資料,包括配置資料、索引、使用者憑據等。
由於通過避免磁碟I/O,In-Memory儲存引擎的資料庫操作延遲更低。
3.1
3.1 In-Memory儲存引擎優勢
·低延遲
·應用可以將單獨的快取和資料庫層合併成——所有的訪問和管理都使用相同的API、操作工具和安全控制元件。
3.2
3.2 In-Memory儲存引擎配置
mongod--storageEngine inMemory --dbpath <path> --inMemorySizeGB <newSize>
或,在配置檔案中如下:
storage:
engine: inMemory
dbPath: <path>
inMemory:
engineConfig:
inMemorySizeGB:<newSize>
inMemorySizeGB: 型別float,表示In-Memory儲存引擎使用記憶體大小,預設是50%的物理RAM減去1GB,在3.4版本中,值範圍在256MB到10TB內。
4
4、MMAPv1儲存引擎
MMAPv1儲存引擎是3.2版本之前的預設儲存引擎。它利用集合級併發性和記憶體對映檔案訪問底層資料儲存。記憶體管理委託給作業系統。MMAPv1不支援大端架構如s390x(IBM System z系列大型機硬體平臺)。
4.1
4.1 MMAPv1儲存引擎優勢
·大容量插入、讀取和更新
4.2
4.2 MMAPv1儲存引擎配置
mongod--storageEngine mmapv1 --dbpath <path>
或,在配置檔案做如下配置:
storage:
mmapv1:
preallocDataFiles: <boolean>
nsSize: <int>
quota:
enforced: <boolean>
maxFilesPerDB: <int>
smallFiles: <boolean>
journal:
debugFlags: <int>
commitIntervalMs: <num>
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
5、MongoDB儲存引擎效能對比
WiredTIger儲存引擎 | In-Memory儲存引擎 | MMAPv1儲存引擎 | |
寫效能 | 高 | 高 | 中 |
文件級併發控制 | 文件級併發控制 | 集合級併發控制 | |
讀效能 | 高 | 高 | 中 |
低延遲 | 中 | 高 | 中 |
支援磁碟壓縮 | 是 | 否 | 否 |
MongoDB查詢語言支援 | 是 | 是 | 是 |
二級索引支援 | 是 | 是 | 是 |
副本集支援 | 是 | 是 | 是 |
分片支援 | 是 | 是 | 是 |
安全控制 | 是 | 是 | 是 |
大資料集的RAM | 是 | 否 | 是 |
表2
猜你喜歡
加入技術討論群
《大資料和雲端計算技術》社群群人數已經3000+,歡迎大家加下面助手微信,拉大家進群,自由交流。
喜歡釘釘掃碼下面的群:
喜歡QQ群的,可以掃描下面二維碼:
歡迎大家通過二維碼打賞支援技術社群(英雄請留名,社群感謝您,打賞次數超過100+):