Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

fsync

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 命令字段
  • Considerations
  • 示例
fsync

将所有待处理的写操作从存储层刷新到磁盘。当 lock 字段设置为 true 时,将在服务器或集群上设置锁,以阻止其他写入,直到锁被释放。

从MongoDB 5.0.22开始, fsync fsyncUnlock命令可以在mongos上运行,以锁和解锁分片集群。

当应用程序写入数据时,MongoDB 将数据记录在存储层,然后将数据写入磁盘。

如果您想将写入内容刷新到磁盘,请运行 fsync

为了提供持久性数据,WiredTiger 使用了检查点。 有关详细信息,请参阅《日志和 WiredTiger 存储引擎》。

重要

服务器维护fsync锁计数。 lock字段设立为truefsync命令会递增锁计数,而fsyncUnlock命令会递减锁计数。 要在锁定的服务器或集群上启用写入,请调用fsyncUnlock命令,直到锁计数为零。

当要执行备份操作时,使用此命令阻止写入。

提示

mongosh 中,该命令也可通过 db.fsyncLock() 辅助方法运行。

辅助方法对 mongosh 用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。

此命令可用于以下环境中托管的部署:

  • MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本

  • MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本

该命令具有以下语法:

db.adminCommand(
{
fsync: 1,
lock: <Boolean>,
fsyncLockAcquisitionTimeout: <integer>,
comment: <any>
}
)

该命令具有以下字段:

字段
类型
说明

fsync

整型

1fsync输入“ ”以应用 。

fsyncLockAcquisitionTimeoutMillis

整型

可选。指定获取锁的等待时间(以毫秒为单位)。如果获取锁操作超时,命令将返回响应失败。

默认: 90000

5.0.22版本新增

lock

布尔

可选。在服务器或集群上获取锁,并阻塞所有写操作。每个带有 lock 操作的 fsync 都会获取一个锁。

comment

any

可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:

注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。

带有lock选项的fsync命令可确保使用cpscptar等低级备份实用程序安全地复制数据文件。 开始使用复制文件的mongod包含用户写入的数据,这些数据与锁定的mongod上的用户写入的数据无法区分。

锁定mongod的数据文件可能会因日志同步WiredTiger快照等操作而发生变化。 虽然这对逻辑数据(例如 客户端访问的数据),但某些备份实用程序可能会检测到这些更改并发出警告,或者失败并显示错误。 有关MongoDB的更多信息 - 推荐的备份实用程序和过程,请参阅自管理部署的备份方法。

5.0.22版本新增

fsync 命令在 mongos 上运行时,会在整个集群上执行 fsync 操作。将 lock 字段设置为 true 后,就会在集群上设置一个锁,阻止额外的写入。

要在锁定分片集群之前进行可用的自我管理备份,请执行以下操作:

  • 确保没有处于活动状态的数据段迁移、重新分片或 DDL 操作。

  • 停止负载均衡器,防止启动额外的数据段迁移。

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

fsync 命令返回包含 lockCount 字段的文档。在 mongod 上运行时,计数会显示服务器上设置的 fsync 锁的数量。

在分片集群上运行时,mongos 会向每个分片发送 fsync 操作,并返回结果,其中包括每个分片的 lockCount

注意

如果 lockCount 字段大于零,服务器和集群上的所有写操作都会被阻塞。如需减少锁的计数,请使用 fsyncUnlock 命令。

Fsync 锁在副本集或分片集群中的主节点上执行。

如果主节点因网络问题宕机或无法访问,集群会从可用的从节点中选举出新的主节点。如果带有 fsync 锁的主节点宕机,新的主节点不会保留 fsync 锁,并且可以处理写操作。备份操作过程中发生选举时,生成的备份可能不一致或无法使用。

要从主节点降级中恢复:

  1. 运行 fsyncUnlock 命令直到锁计数为零,以释放所有节点上的锁。

  2. 发出fsync命令以在集群上重新建立 fsync 锁。

  3. 重新启动备份。

此外,fsync 锁是持久的。当旧的主节点再次上线时,需要使用 fsyncUnlock 命令释放节点上的锁。

注意

带有lock选项的fsync命令可确保使用cpscptar等低级备份实用程序安全地复制数据文件。 开始使用复制文件的mongod包含用户写入的数据,这些数据与锁定的mongod上的用户写入的数据无法区分。

锁定mongod的数据文件可能会因日志同步WiredTiger快照等操作而发生变化。 虽然这对逻辑数据(例如 客户端访问的数据),但某些备份实用程序可能会检测到这些更改并发出警告,或者失败并显示错误。 有关MongoDB的更多信息 - 推荐的备份实用程序和过程,请参阅自管理部署的备份方法。

fsync 命令可通过 mongos 锁定单个 mongod 实例或分片集群。将 lock 字段设置为 true 的情况下运行时,fsync 操作会将所有数据刷新到存储层,并阻塞所有其他写操作,直到您解锁实例或集群。

如需锁定数据库,请使用 fsync 命令将 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
}

锁定后,会阻止写入操作。单独的连接可以继续读取操作直至首次尝试写入操作,然后此类连接同样进入等待,直至服务器或集群解除锁定。

重要

fsync 锁定操作维护锁的计数。

如需解锁对服务器或集群以进行写操作,锁计数必须为零。也就是说,在执行一定次数的 fsync 锁定操作后,必须执行相应次数的解锁操作才能解锁服务器或集群以进行写操作。

要解除对集群服务器的锁定,请使用 fsyncUnlock 命令:

db.adminCommand( { fsyncUnlock: 1 } )

根据需要多次重复此命令,将锁计数减至零。锁计数为零后,服务器或集群就可以恢复写操作。

如需检查 fsync 锁的状态,请使用 db.currentOp()。在 Shell 中使用以下 JavaScript 函数测试服务器或集群当前是否锁定:

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

将此函数加载到mongosh会话后,使用以下语法进行调用:

serverIsLocked()

如果服务器或集群当前处于锁定状态,则此函数将返回 true;如果服务器或集群未锁定,则此函数将返回 false

后退

filemd5