文档菜单
文档首页
/
MongoDB 手册
/ / /

fsync

本页内容

  • 定义
  • 兼容性
  • 语法
  • 命令字段
  • 考虑事项
  • 示例
fsync

将存储层中所有挂起的写入刷新到磁盘。当将 lock 字段设置为 true 时,它会在服务器或集群上设置一个锁,以防止在释放锁之前进行额外的写入。

从 MongoDB 7.1 开始(也始于 7.0.2、6.0.11 和 5.0.22)fsyncfsyncUnlock 命令可以在 mongos 上运行以锁定和解锁分片集群。

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

当您想要将写入刷新到磁盘时,请运行 fsync

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

重要

服务器维护一个 fsync 锁计数。fsync 命令将 lock 字段设置为 true 时,会递增锁定计数,而 fsyncUnlock 命令则会递减计数。要启用已锁定服务器或集群上的写入操作,请调用 fsyncUnlock 命令,直到锁定计数达到零。

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

提示

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

辅助方法对 mongosh 用户来说很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要方便或者需要额外的返回字段的情况下,请使用数据库命令。

此命令在以下环境中可用

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

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

该命令有以下语法

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

该命令具有以下字段

字段
类型
描述
fsync
整数
输入 "1" 以应用 fsync.
fsyncLockAcquisitionTimeoutMillis
整数

可选。指定等待获取锁的毫秒数。如果锁获取操作超时,则命令返回失败响应。

默认: 90000

新增在版本7.1.

lock
布尔型
可选。在服务器或集群上获取锁并阻止所有写操作。每次与 fsync 操作一起使用 lock 时都会获取一个锁。
comment
任何类型

可选。附加到该命令的用户提供的注释。一旦设置,此注释将出现在以下位置的此命令记录旁边

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

fsync 命令带有 lock 选项确保数据文件可以使用低级备份实用程序(如 cpscptar)安全复制。使用复制的文件启动的 mongod 包含与被锁定的 mongod 上的用户编写的数据不可区分。

锁定状态下的 mongod 数据文件可能会因日志同步(日志同步)或 WiredTiger 快照(WiredTiger 快照)等操作而发生变化。虽然这对逻辑数据(例如客户端访问的数据)没有影响,但一些备份工具可能会检测到这些变化并发出警告或错误。有关 MongoDB 推荐的备份工具和流程的更多信息,请参阅自管理部署的备份方法。

新增在版本7.1.

当在 mongos 上运行 fsync 命令时,它会在整个集群上执行 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 命令来释放节点的锁。

注意

fsync 命令带有 lock 选项确保数据文件可以使用低级备份实用程序(如 cpscptar)安全复制。使用复制的文件启动的 mongod 包含与被锁定的 mongod 上的用户编写的数据不可区分。

锁定状态下的 mongod 数据文件可能会因日志同步(日志同步)或 WiredTiger 快照(WiredTiger 快照)等操作而发生变化。虽然这对逻辑数据(例如客户端访问的数据)没有影响,但一些备份工具可能会检测到这些变化并发出警告或错误。有关 MongoDB 推荐的备份工具和流程的更多信息,请参阅自管理部署的备份方法。

fsync 命令可以通过 mongod 或通过 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