fsync

在本页面

Definition

当应用程序写入数据时,MongoDB 会将数据记录在存储层中,然后在syncPeriodSecs间隔(默认为 60 秒)内将数据写入磁盘。如果要在该间隔之前刷新对磁盘的写入,请运行fsync

fsync命令具有以下语法:

{ fsync: 1, async: <Boolean>, lock: <Boolean> }

fsync命令具有以下字段:

Field Type Description
fsync integer Importing“ 1”以应用fsync
async boolean 可选的。异步运行fsync。默认情况下,fsync操作是同步的。
lock boolean 可选的。锁定mongod实例并阻止所有写入操作。每个带有lockfsync都会获得一个锁。

要运行fsync命令,请使用db.adminCommand()方法:

db.adminCommand( { fsync: 1, ... } )

Considerations

带有lock选项的fsync命令可确保使用cpscptar等低级备份 Util 安全地复制数据文件。开始使用复制的文件的mongod包含与锁定的mongod上的用户写入数据没有区别的用户写入数据。

由于诸如journaling syncsWiredTiger snapshots之类的操作,被锁定的mongod的数据文件可能会更改。尽管这对逻辑数据(例如,Client 端访问的数据)没有影响,但某些备份 Util 可能会检测到这些更改并发出警告或失败并出现错误。有关 MongoDB 建议的备份 Util 和过程的更多信息,请参见MongoDB 备份方法

对更大部署的影响

fsync锁仅在分片群集的单个 mongod实例上可用,而不在整个群集上。要备份整个分片群集,请参阅备份和还原分片群集以获取更多信息。

日记的替代方法

如果您的mongod启用了journaling,请使用文件系统或卷/块级快照工具将数据集和日志创建为一个整体。

带锁的 fsync:true

在版本 3.4 中进行了更改:{ fsync: 1, lock: true }命令现在在返回文档中返回lockCount

{ fsync: 1, lock: true }mongod上运行后,所有写操作将被阻止。 mongo shell 提供了一个辅助方法db.fsyncLock()

Note

{ fsync: 1, lock: true }操作保持锁定计数。每个{ fsync: 1, lock: true }操作都会增加锁定计数。

要解锁mongod实例以进行写入,锁定计数必须为零。也就是说,对于给定数量的{ fsync: 1, lock: true }操作,您必须发出相应数量的解锁操作才能为写入解锁该实例。要解锁,请参见db.fsyncUnlock()

Examples

Run Asynchronously

默认情况下,fsync操作是同步的。要异步运行fsync,请使用async字段设置为true

db.adminCommand( { fsync: 1, async: true } )

操作立即返回。要查看fsync操作的状态,请检查db.currentOp()的输出。

锁定 mongod 实例

Note

带有lock选项的fsync命令可确保使用cpscptar等低级备份 Util 安全地复制数据文件。开始使用复制的文件的mongod包含与锁定的mongod上的用户写入数据没有区别的用户写入数据。

由于诸如journaling syncsWiredTiger snapshots之类的操作,被锁定的mongod的数据文件可能会更改。尽管这对逻辑数据(例如,Client 端访问的数据)没有影响,但某些备份 Util 可能会检测到这些更改并发出警告或失败并出现错误。有关 MongoDB 建议的备份 Util 和过程的更多信息,请参见MongoDB 备份方法

fsync的主要用途是锁定mongod实例,以便备份mongoddbPath中的文件。该操作将所有数据刷新到存储层,并阻止所有写操作,直到您解锁mongod实例为止。

要锁定数据库,请使用lock字段设置为true

db.adminCommand( { fsync: 1, lock: true } )

该操作返回一个包含操作状态和lockCount的文档:

{
   "info" : "now locked against writes, use db.fsyncUnlock() to unlock",
   "lockCount" : NumberLong(1),
   "seeAlso" : "http://dochub.mongodb.org/core/fsynccommand",
   "ok" : 1
}

您可以 continue 对具有fsync锁的mongod实例执行读取操作。但是,在第一次写操作之后,所有后续的读操作都将等到您解锁mongod实例。

Important

{ fsync: 1, lock: true }操作保持锁定计数。

要解锁mongod实例以进行写入,锁定计数必须为零。也就是说,对于给定数量的{ fsync: 1, lock: true }操作,您必须发出相应数量的解锁操作才能解锁实例以进行写入。

解锁 mongod 实例

要解锁mongod,请使用db.fsyncUnlock()

db.fsyncUnlock();

重复db.fsyncUnlock()将锁定计数减少为零,以解锁实例进行写入。

检查锁定状态

要检查 fsync 锁的状态,请使用db.currentOp()。在 Shell 程序中使用以下 JavaScript 函数测试mongod实例当前是否被锁定:

serverIsLocked = function () {
                     var co = db.currentOp();
                     if (co && co.fsyncLock) {
                         return true;
                     }
                     return false;
                 }

在将此函数加载到mongo shell 会话中后,请使用以下语法对其进行调用:

serverIsLocked()

如果mongod实例当前已锁定,则此函数将返回true,如果mongod未锁定则将返回false

首页