【MongoDB】日志管理(Manage Journaling)

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 Concernj选项获得提交确认。有关详细信息,请参见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

#replication:

#   replSetName: replA

setParameter:

   disableLogicalSessionCacheRefresh: true

如果使用命令行选项,则必须在重启时更新命令行选项。

3. 重新启动mongod实例:

  • 如果使用的是配置文件:
mongod -f <path/to/myconfig.conf>
  • 如果使用命令行选项而非配置文件,

        > 包含--nojournal选项。

        > 移除所有副本命令行选项(例如--replSet)。

        > 将--setParameter选项中的参数disableLogicalSessionCacheRefresh设置为true。

mongod --nojournal --setParameter disableLogicalSessionCacheRefresh=true  ...

4. 完全关闭mongod实例:

db.getSiblingDB('admin').shutdownServer()

确认该进程不再运行。

5. 更新配置文件,以准备使用新的日志压缩,作为副本集成员重新启动:

例如:

storage:
   wiredTiger:
      engineConfig:
         journalCompressor: <newValue>
replication:
   replSetName: replA

如果使用命令行选项而非配置文件,则必须在下面的重新启动过程中更新命令行选项。

6. 重新启动mongod实例,作为副本集成员:

  • 如果您使用的是配置文件:
mongod -f <path/to/myconfig.conf>
  • 如果您使用命令行选项而非配置文件:
  1. 删除--nojournal选项。
  2. 删除--wiredTigerJournalCompressor命令行选项,以使用默认的日志压缩器或更新为新值。
  3. 包括副本命令行选项以及副本集成员的所有其他选项。
  4. 删除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>
  • 如果使用命令行选项而非配置文件:
  • 如果使用命令行选项而非配置文件,
  1. 包含--nojournal选项
  2. 将参数skipShardingConfigurationChecks设置为true。
  3. 将--setParameter选项中的参数disableLogicalSessionCacheRefresh设置为true。
  4. 移除所有副本命令行选项(例如--replSet)。
  5. 删除--shardsvr /-configsvr选项。
  6. 明确包括--port并设置为实例的当前端口。
mongod --nojournal --setParameter skipShardingConfigurationChecks=true --setParameter disableLogicalSessionCacheRefresh=true --port <samePort> ...

4. 完全关闭mongod实例:

db.getSiblingDB('admin').shutdownServer()

确认该进程不再运行。

5. 更新配置文件,以准备使用新的日志压缩,作为副本集成员重新启动:

例如:

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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章