On this page
fsync
在本页面
Definition
fsync
- 强制mongod进程将所有未决的写操作从存储层刷新到磁盘,并锁定* entire * mongod实例,以防止其他写操作,直到用户用相应的fsyncUnlock释放锁为止。 (可选)您可以使用fsync锁定mongod实例并阻止写入操作,以捕获备份。
当应用程序写入数据时,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实例并阻止所有写入操作。每个带有lock 的fsync都会获得一个锁。 |
要运行fsync命令,请使用db.adminCommand()方法:
db.adminCommand( { fsync: 1, ... } )
Considerations
带有lock
选项的fsync命令可确保使用cp
,scp
或tar
等低级备份 Util 安全地复制数据文件。开始使用复制的文件的mongod包含与锁定的mongod上的用户写入数据没有区别的用户写入数据。
由于诸如journaling syncs或WiredTiger 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命令可确保使用cp
,scp
或tar
等低级备份 Util 安全地复制数据文件。开始使用复制的文件的mongod包含与锁定的mongod上的用户写入数据没有区别的用户写入数据。
由于诸如journaling syncs或WiredTiger snapshots之类的操作,被锁定的mongod的数据文件可能会更改。尽管这对逻辑数据(例如,Client 端访问的数据)没有影响,但某些备份 Util 可能会检测到这些更改并发出警告或失败并出现错误。有关 MongoDB 建议的备份 Util 和过程的更多信息,请参见MongoDB 备份方法。
fsync的主要用途是锁定mongod实例,以便备份mongod的dbPath中的文件。该操作将所有数据刷新到存储层,并阻止所有写操作,直到您解锁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()