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

fsync

在此页面上

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

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

从MongoDB 7.1开始(也从7.0.2开始提供, 6.0.11和5.0 。22 )可以在fsync fsyncUnlock上运行mongos 和 命令,以锁和解锁分片集群。

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

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

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

重要

服务器维护fsync锁计数。 lock字段设立为true fsync命令会递增锁计数,而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

版本 7.1 中的新增内容

lock

布尔

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

comment

any

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

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

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

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

版本 7.1 中的新增内容

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