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/