Manage Journaling

在本页面

MongoDB 使用预先写入日志到磁盘journal上,以保证write operation的持久性。 MMAPv1 存储引擎还需要日志,以提供崩溃恢复能力。

WiredTiger 存储引擎不需要日志即可保证崩溃后的状态一致。在恢复过程中,数据库将恢复到最后一个一致的checkpoint。但是,如果 MongoDB 在检查点之间意外退出,则需要日志记录来恢复在最后一个检查点之后发生的写入。

启用日记功能后,如果mongod意外停止,则程序可以恢复写入日记的所有内容。 MongoDB 将在重新启动时重新应用写入操作,并保持一致状态。默认情况下,最大程度的丢失写操作(即未写到日志上)是最近 100 毫秒内进行的写操作,加上执行实际日记写操作所花费的时间。有关默认设置的更多信息,请参见commitIntervalMs

Procedures

Disable Journaling

Warning

不要在生产系统上禁用日记功能。

使用 WiredTiger storage engine副本集成员不应使用--nojournal选项。有关日记的更多信息,请参见Manage Journaling

  • 当使用不带日志的 MMAPv1 存储引擎时,如果您的mongod实例停止运行而没有出于任何原因(例如断电)意外关闭,并且您没有使用日志运行,则必须从不受影响的replica set成员或备份中恢复,如repair中所述。

要禁用日记功能,请使用--nojournal命令行选项启动mongod

取得提交确认

您可以使用Write Concernj选项获得提交确认。有关详细信息,请参见Write Concern

避免 MMAPv1 的预分配滞后

对于MMAPv1 存储引擎,如果mongod进程确定预分配日记文件比根据需要创建新的日记文件更有效,则 MongoDB 可以预分配日记文件。

根据您的文件系统,首次启动启用日记功能的mongod实例时,可能会遇到预分配滞后的情况。预分配文件所需的时间可能持续几分钟。在此期间,您将无法连接到数据库。这是一次性的预分配,以后的调用不会发生。

为避免preallocation lag,您可以通过从另一个mongod实例复制它们来在日志目录中预分配文件。

预分配的文件不包含数据。以后将它们删除是安全的。但是,如果您使用日志记录重新启动mongod,则mongod将再次创建它们。

Example

以下序列为数据库端口/data/db在端口27017上运行的mongod实例预分配日记文件。

为了演示起见,该序列以通常的方式从创建一组日志文件开始。

  • 创建一个临时目录,在其中创建一组日记文件:
mkdir ~/tmpDbpath
  • 通过启动使用临时目录的mongod实例来创建一组日记文件。例如:
mongod --port 10000 --dbpath ~/tmpDbpath --journal --bind_ip localhost,<hostname(s)|ip address(es)> --storageEngine mmapv1

Tip

为避免停机,请为每个配置服务器指定一个逻辑 DNS 名称(与服务器的物理或虚拟主机名无关)。如果没有逻辑 DNS 名称,移动或重命名配置服务器需要关闭分片群集中的每个mongodmongos实例。

Warning

绑定到非 localhost(例如可公开访问)的 IP 地址之前,请确保已保护群集免受未经授权的访问。有关安全建议的完整列表,请参见Security Checklist。至少考虑enabling authentication加强网络基础设施

  • 当您看到以下日志输出,指示mongod拥有文件时,请按 CONTROL C 停止mongod实例:
... NETWORK  [initandlisten] waiting for connections on port 10000
  • 通过将日记文件从现有实例的数据目录移动到新实例的数据目录中,为mongod的新实例预分配日记文件:
mv ~/tmpDbpath/journal /data/db/
  • 启动新的mongod实例。例如:
mongod --port 27017 --dbpath /data/db --journal --bind_ip localhost,<hostname(s)|ip address(es)> --storageEngine mmapv1

Tip

为避免停机,请为每个配置服务器指定一个逻辑 DNS 名称(与服务器的物理或虚拟主机名无关)。如果没有逻辑 DNS 名称,移动或重命名配置服务器需要关闭分片群集中的每个mongodmongos实例。

Warning

绑定到非 localhost(例如可公开访问)的 IP 地址之前,请确保已保护群集免受未经授权的访问。有关安全建议的完整列表,请参见Security Checklist。至少考虑enabling authentication加强网络基础设施

监视日记状态

serverStatus command/db.serverStatus()方法返回wiredTiger.log,其中包含 WiredTiger 日记的统计信息。

更改 MMAPv1 的组提交间隔

对于MMAPv1 存储引擎,您可以使用--journalCommitInterval命令行选项设置组提交间隔。允许的范围是2300毫秒。

较低的值会增加日志的持久性,但会降低磁盘性能。

意外关机后恢复数据

崩溃后重启后,MongoDB 会在服务器可用之前重播日志目录中的所有日志文件。如果 MongoDB 必须重播日志文件,则mongod在日志输出中记录这些事件。

在这种情况下,没有理由运行repairDatabase

更改 WT Journal Compressor

对于 WiredTiger 存储引擎,默认情况下,MongoDB 使用snappy压缩器作为日志。要为mongod实例指定其他压缩算法或不压缩,请执行以下操作:

Tip

如果在此过程中遇到mongod异常关闭的情况,则必须使用旧的压缩器设置来恢复日志文件。恢复后,您可以重试该过程。

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

  • mongod实例执行干净关闭:
db.getSiblingDB('admin').shutdownServer()
  • 一旦确认该进程不再运行,请重新启动mongod实例:

  • 如果您使用的是配置文件:

mongod -f <path/to/myconfig.conf>
mongod --wiredTigerJournalCompressor <differentCompressor|none>  ...