WiredTiger存儲引擎

什麼是存儲引擎?

存儲引擎是數據庫的一部分,負責管理如何在內存和磁盤上存儲數據。許多數據庫支持多個存儲引擎,其中不同的引擎對特定工作負載的性能會更好。例如,一個存儲引擎可能爲讀取繁重的工作負載提供更好的性能,另一個可能支持更高的寫入操作吞吐量。

也可以看看 存儲引擎

你可以在副本集中混用存儲引擎嗎?

可以。您可以擁有使用不同存儲引擎的副本集成員。

注意
MongoDB 4.0不推薦使用MMAPv1存儲引擎。

在設計這些多存儲引擎部署時,請考慮以下事項:
每個成員上的oplog可能需要設置不同的大小來負責不同存儲引擎之間的吞吐量差異。
如果備份是以從MongoDB快照數據文件的方式,那麼備份恢復可能會變得更加複雜:您可能需要維護每個存儲引擎的備份。

WiredTiger存儲引擎

我可以將現有部署升級到WiredTiger嗎?

可以。參考:
將單機部署的存儲引擎更改爲WiredTiger
將副本集的存儲引擎更改爲WiredTiger
將分片集羣的存儲引擎更改爲WiredTiger

WiredTiger提供的壓縮比率是多少?

壓縮數據與未壓縮數據的比率取決於您的數據和使用的壓縮算法庫。默認情況下,WiredTiger中的集合數據使用Snappy塊壓縮 ;也可以使用 zlib 壓縮。索引數據默認使用前綴壓縮。

我應該將WiredTiger內部緩存設置爲多大?

使用WiredTiger,MongoDB同時使用WiredTiger內部緩存和文件系統緩存。

從MongoDB 3.4開始,默認的WiredTiger內部緩存大小是以下兩者中的較大者:
- 50%(內存大小 – 1 GB),或
- 256 MB。

例如,在總共4GB 內存的系統上,WiredTiger緩存將使用1.5GB的內存(0.5* (4 GB – 1 GB) = 1.5 GB)。相反,具有總共1.25 GB 內存的系統將爲WiredTiger緩存分配256 MB,因爲這超過總內存的一半減去1GB字節(0.5 *(1.25 GB – 1 GB) = 128 MB < 256 MB)。

默認情況下,WiredTiger對所有集合使用Snappy塊壓縮,對所有索引使用前綴壓縮。壓縮默認設置可在全局級別配置,也可在每個集合和每個索引創建期間單獨進行設置。

WiredTiger內部緩存中的數據與磁盤上的數據使用不同表示形式的數據格式:

  • 文件系統緩存中的數據與磁盤格式相同,包括對數據文件進行的任何壓縮的好處也是一樣的。操作系統使用文件系統緩存來減少磁盤I / O.
  • 在WiredTiger內部緩存中加載的索引具有與磁盤格式不同的數據表示,但仍可利用索引前綴壓縮來減少內存使用。索引前綴壓縮從索引字段中去除重複的公共前綴。
  • WiredTiger內部緩存中的集合數據是未壓縮的,並使用與磁盤格式不同的表示形式。塊壓縮可以節省大量的磁盤存儲空間,但數據必須解壓縮才能由服務器操作。

通過文件系統緩存,MongoDB自動使用WiredTiger緩存或其他進程未使用的所有可用內存。

要調整WiredTiger內部緩存的大小,請參閱 storage.wiredTiger.engineConfig.cacheSizeGB–wiredTigerCacheSizeGB。應當避免將WiredTiger內部緩存大小增加到其默認值以上。

注意
storage.wiredTiger.engineConfig.cacheSizeGB限制WiredTiger內部緩存的大小。操作系統將使用可用的空閒內存用於文件系統緩存,這允許壓縮的MongoDB數據文件保留在內存中。此外,操作系統將使用任何空閒內存來緩衝文件系統塊和文件系統緩存。

爲了容納其他的內存消費者,您可能必須減少WiredTiger內部緩存大小。

默認的WiredTiger內部緩存大小值假定每臺計算機只有一個mongod實例。如果單個計算機包含多個MongoDB實例,則應減少該設置以適應其他mongod 實例。

如果您的mongod是運行在無法訪問系統中所有可用內存 的容器(例如lxc, cgroups,Docker等)中時,則必須將storage.wiredTiger.engineConfig.cacheSizeGB設置爲小於容器中可用內存大小的值。確切的大小取決於容器中運行的其他進程。

要查看有關緩存和緩存淘汰率的統計信息,請參閱從serverStatus命令返回的 wiredTiger.cache字段。

WiredTiger寫入磁盤的頻率如何?

Checkpoints(檢查點)

從版本3.6開始,MongoDB配置WiredTiger以60秒的間隔創建checkpoints(即將快照數據寫入磁盤)。在早期版本中,MongoDB在WiredTiger中以60秒的間隔設置檢查點,或者在寫入2 GB的預寫日誌(journal)數據時,以先發生者爲準。

Journal Data(預寫日誌數據)

  • MongoDB根據以下間隔或條件寫入磁盤:
  • MongoDB每50毫秒將緩衝的預寫日誌(journal)數據同步到磁盤(從MongoDB 3.2開始)
  • 如果寫入操作包括寫關注(write concern)的j參數:j: true,則WiredTiger強制同步WiredTiger日誌文件。
  • 由於MongoDB使用的預寫日誌(journal)文件大小限制爲100 MB,因此WiredTiger大約每100 MB數據創建一個新的日誌文件。當WiredTiger創建新的日誌文件時,WiredTiger會同步以前的日誌文件。

如何在WiredTiger中回收磁盤空間?

WiredTiger存儲引擎在刪除文檔時維護數據文件中的空記錄列表。此空間可以由WiredTiger重用,但除非在非常特定的情況下,否則不會返回到操作系統。

可供WiredTiger重用的空白空間量反映在db.collection.stats()輸出的wiredTiger.block-manager.file字段中(單位爲字節)

要允許WiredTiger存儲引擎將此空白空間釋放到操作系統,您可以對數據文件進行碎片整理。這可以使用compact命令來實現。有關其行爲和其他注意事項的更多信息,請參閱compact

數據存儲診斷

如何查看集合的大小?

要查看集合的統計信息(包括數據大小),請使用mongo shell中的db.collection.stats()方法。以下示例爲orders集合執行db.collection.stats():
複製
db.orders.stats ();

MongoDB還提供以下方法來返回集合的特定大小信息:
- db.collection.dataSize() 返回集合的未壓縮數據大小(以字節爲單位)。
- db.collection.storageSize()返回磁盤存儲上集合的字節大小。如果集合數據被壓縮(wiredTiger默認配置會壓縮),則存儲大小反映壓縮大小,並且可能小於db.collection.dataSize()返回的值 。
- db.collection.totalIndexSize()返回集合的索引大小(以字節爲單位)。如果索引使用前綴壓縮(wiredTiger默認配置會對索引前綴壓縮),則返回的大小反映壓縮的大小。

以下腳本打印每個數據庫的統計信息:

db.adminCommand("listDatabases").databases.forEach(function (d) {
mdb = db.getSiblingDB(d.name);
printjson(mdb.stats());})

以下腳本打印每個數據庫中每個集合的統計信息:

db.adminCommand("listDatabases").databases.forEach(function (d) {
mdb = db.getSiblingDB(d.name);
mdb.getCollectionNames().forEach(function(c) {
s = mdb[c].stats();
printjson(s);
})})

如何檢查集合的各個索引的大小?

要查看爲每個索引分配的數據大小,請使用 db.collection.stats()方法並檢查返回文檔中的 indexSizes字段。

如果索引使用前綴壓縮(wiredTiger默認配置會對索引前綴壓縮),則該索引的返回大小反映壓縮大小。

如何獲取有關數據庫存儲使用的信息?

mongo shell中的db.stats()方法返回“活躍”數據庫的當前狀態。有關返回字段的說明,請參見 dbStats輸出

 

發佈了15 篇原創文章 · 獲贊 6 · 訪問量 3584
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章