MongoDB使用預寫日誌記錄到磁盤日誌上,以確保寫操作的持久性。
WiredTiger存儲引擎不需要journaling即可保證數據庫服務崩潰後的狀態一致。在恢復過程中,數據庫將恢復到最近的一致性檢查點。但是,如果MongoDB在檢查點之間意外退出,則需要journaling來恢復在最後一個檢查點之後發生的寫入。
注意
從MongoDB 4.0開始,在WiredTiger存儲引擎的副本集成員上,您不能指定--nojournal選項或storage.journal.enabled:false。
啓用journaling功能後,如果mongod意外停止,則程序可以恢復journal 裏的所有內容。 MongoDB將在重新啓動時重新應用寫入操作,並保持一致狀態。默認情況下,最嚴重的丟失寫操作(即未寫入journal的操作)是最近100毫秒內進行的寫操作,加上執行寫入journal操作所花費的時間。有關默認的更多信息,請參見commitIntervalMs。
一、管理過程(Procedures)
1.禁用日誌(Disable Journaling)
警告
不要在生產環境上禁用日誌功能。
從MongoDB 4.0開始,在WiredTiger存儲引擎的副本集成員上,不能指定--nojournal選項或storage.journal.enabled:false。
要禁用獨立部署服務的日誌功能,請使用--nojournal命令行選項啓動mongod。
2.獲取提交確認(Get Commit Acknowledgement)
可以使用Write Concern和j選項獲得提交確認。有關詳細信息,請參見Write Concern。
3.監視日誌狀態(Monitor Journal Status)
通過 serverStatus命令或db.serverStatus()方法可以獲取到wiredTiger.log,其中包含有關日誌的統計信息。
4.意外關機後恢復數據(Recover Data After Unexpected Shutdown)
服務在崩潰並重啓後,MongoDB會在服務恢復可用之前重播journal 目錄中的所有journal文件。當MongoDB重播journal文件時,mongod在日誌輸出中記錄這些重播事件。
切記:不應該運行--repair。
5.更換WiredTiger日記壓縮算法(Change WiredTiger Journal Compressor)
使用WiredTiger存儲引擎時,默認情況下,MongoDB使用快速壓縮存儲日誌。要爲mongod實例指定其他壓縮算法或不壓縮:
提示
如果在此過程中遇到mongod異常關閉的情況,則必須使用舊的壓縮機設置來使用日誌文件進行恢復。恢復後,您可以重試該過程。
5.1 單獨實例(Standalone)
使用以下步驟更改單獨mongod實例的日誌壓縮:
1. 將storage.wiredTiger.engineConfig.journalCompressor更新爲新的值。如果使用命令行選項而不是配置文件,則必須在下面的重新啓動過程中更新--wiredTigerJournalCompressor命令行選項。
2. 對mongod實例執行完全關閉。例如,通過mongo shell連接到實例並執行db.shutdownServer():
db.getSiblingDB('admin').shutdownServer()
3. 當該進程停止運行後,就可以重新啓動mongod實例:
3.1 如果使用的是配置文件:
mongod -f <path/to/myconfig.conf>
3.2 如果使用的是命令行選項,那麼更新--wiredTigerJournalCompressor選項:
mongod --wiredTigerJournalCompressor <differentCompressor|none> ...
5.2 副本集成員 (Replica Set Member)
通過如下過程更改副本集成員的日誌壓縮:
注意
以下過程將副本成員視爲沒有journal的單獨服務來重啓服務。
1. 完全關閉mongod實例。例如,通過mongo shell連接mongod實例並執行db.shutdownServer():
db.getSiblingDB('admin').shutdownServer()
2. 更新配置文件,作爲單獨服務,啓動mongod:
- 將storage.journal.enabled設置爲false。
- 註釋掉服務部署的副本設置。
- 將setParameter中的參數disableLogicalSessionCacheRefresh設置爲true。
例如:
storage:
journal:
enabled: false
#replication:
# replSetName: replA
setParameter:
disableLogicalSessionCacheRefresh: true
如果使用命令行選項,則必須在重啓時更新命令行選項。
3. 重新啓動mongod實例:
- 如果使用的是配置文件:
mongod -f <path/to/myconfig.conf>
- 如果使用命令行選項而非配置文件,
> 包含--nojournal選項。
> 將--setParameter選項中的參數disableLogicalSessionCacheRefresh設置爲true。
mongod --nojournal --setParameter disableLogicalSessionCacheRefresh=true ...
4. 完全關閉mongod實例:
db.getSiblingDB('admin').shutdownServer()
確認該進程不再運行。
5. 更新配置文件,以準備使用新的日誌壓縮,作爲副本集成員重新啓動:
- 刪除storage.journal.enabled設置。
- 取消註釋部署的副本設置。
- 刪除disableLogicalSessionCacheRefresh參數。
- 刪除storage.wiredTiger.engineConfig.journalCompressor設置,以使用默認日誌壓縮或指定新值。
例如:
storage:
wiredTiger:
engineConfig:
journalCompressor: <newValue>
replication:
replSetName: replA
如果使用命令行選項而非配置文件,則必須在下面的重新啓動過程中更新命令行選項。
6. 重新啓動mongod實例,作爲副本集成員:
- 如果您使用的是配置文件:
mongod -f <path/to/myconfig.conf>
- 如果您使用命令行選項而非配置文件:
- 刪除--nojournal選項。
- 刪除--wiredTigerJournalCompressor命令行選項,以使用默認的日誌壓縮器或更新爲新值。
- 包括副本命令行選項以及副本集成員的所有其他選項。
- 刪除disableLogicalSessionCacheRefresh參數。
mongod --wiredTigerJournalCompressor <differentCompressor|none> --replSet ...
5.3 分片集羣成員(Sharded Cluster Member)
通過以下步驟,來更改分片副本集或配置服務副本集的成員的日誌壓縮:
注意
以下過程將副本成員視爲沒有journal的單獨服務來重啓服務。
1. 完全關閉mongod實例。例如,通過mongo shell連接mongod實例並執行db.shutdownServer():
db.getSiblingDB('admin').shutdownServer()
2. 更新配置文件,作爲單獨服務,啓動mongod:
- 將storage.journal.enabled設置爲false。
- 將setParameter中的參數disableLogicalSessionCacheRefresh設置爲true。
- 註釋掉部署的副本設置。
- 註釋掉sharding.clusterRole設置。
- 如果未明確設置net.port,則將其設置爲該成員當前使用的端口。
例如:
storage:
journal:
enabled: false
setParameter:
skipShardingConfigurationChecks: true
disableLogicalSessionCacheRefresh: true
#replication:
# replSetName: shardA
#sharding:
# clusterRole: shardsvr
net:
port: 27218
如果使用命令行選項而非配置文件,則必須在重新啓動時更新命令行選項。
3. 重新啓動mongod實例:
- 如果使用的是配置文件:
mongod -f <path/to/myconfig.conf>
- 如果使用命令行選項而非配置文件:
- 如果使用命令行選項而非配置文件,
- 包含--nojournal選項
- 將參數skipShardingConfigurationChecks設置爲true。
- 將--setParameter選項中的參數disableLogicalSessionCacheRefresh設置爲true。
- 移除所有副本命令行選項(例如--replSet)。
- 刪除--shardsvr /-configsvr選項。
- 明確包括--port並設置爲實例的當前端口。
mongod --nojournal --setParameter skipShardingConfigurationChecks=true --setParameter disableLogicalSessionCacheRefresh=true --port <samePort> ...
4. 完全關閉mongod實例:
db.getSiblingDB('admin').shutdownServer()
確認該進程不再運行。
5. 更新配置文件,以準備使用新的日誌壓縮,作爲副本集成員重新啓動:
- 刪除storage.journal.enabled設置。
- 刪除skipShardingConfigurationChecks參數設置。
- 刪除disableLogicalSessionCacheRefresh參數。
- 取消註釋部署的副本設置。
- 取消註釋sharding.clusterRole設置。
- 刪除storage.wiredTiger.engineConfig.journalCompressor設置,以使用默認日誌壓縮或指定新值。
例如:
storage:
wiredTiger:
engineConfig:
journalCompressor: <newValue>
replication:
replSetName: shardA
sharding:
clusterRole: shardsvr
net:
port: 27218
如果使用命令行選項而不是配置文件,則必須在下面的重新啓動過程中更新命令行選項。
6. 重新啓動mongod實例,作爲副本集成員:
- 如果您使用的是配置文件:
mongod -f <path/to/myconfig.conf>
- 如果您使用命令行選項而非配置文件:
> 刪除--nojournal選項。
> 刪除skipShardingConfigurationChecks參數設置。
> 刪除disableLogicalSessionCacheRefresh參數。
> 刪除--wiredTigerJournalCompressor命令行選項,以使用默認的日誌壓縮器或更新爲新值。
> 包含--shardsvr / --configsvr選項。
> 包括副本命令行選項以及副本集成員的所有其他選項。
mongod --shardsvr --wiredTigerJournalCompressor <differentCompressor|none> --replSet ...
上一篇:日誌
參考原文:https://docs.mongodb.com/manual/tutorial/manage-journaling/