fsync
定义
fsync
将存储层中所有挂起的写入刷新到磁盘。当将
lock
字段设置为true
时,它会在服务器或集群上设置一个锁,以防止在释放锁之前进行额外的写入。从 MongoDB 7.1 开始(也始于 7.0.2、6.0.11 和 5.0.22)的
fsync
和fsyncUnlock
命令可以在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 | 整数 | 可选。指定等待获取锁的毫秒数。如果锁获取操作超时,则命令返回失败响应。 默认: 新增在版本7.1. |
lock | 布尔型 | 可选。在服务器或集群上获取锁并阻止所有写操作。每次与 fsync 操作一起使用 lock 时都会获取一个锁。 |
comment | 任何类型 | 可选。附加到该命令的用户提供的注释。一旦设置,此注释将出现在以下位置的此命令记录旁边
注释可以是任何有效的 BSON 类型(字符串、整数、对象、数组等)。 |
注意事项
fsync
命令带有 lock
选项确保数据文件可以使用低级备份实用程序(如 cp
、scp
或 tar
)安全复制。使用复制的文件启动的 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 锁的主节点宕机,新的主节点不会保留 fsync 锁并可以处理写操作。当备份操作期间发生选举,结果备份可能不一致或无法使用。
从主节点宕机中恢复
运行
fsyncUnlock
命令,直到锁计数达到零以释放所有节点的锁。发出
fsync
命令以在集群上重新建立 fsync 锁。重新启动备份。
此外,fsync 锁是持久的。当旧的主节点再次上线时,您需要使用 fsyncUnlock
命令来释放节点的锁。
示例
Fsync 锁
注意
fsync
命令带有 lock
选项确保数据文件可以使用低级备份实用程序(如 cp
、scp
或 tar
)安全复制。使用复制的文件启动的 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 锁定的次数,您必须发出相应数量的解锁操作来解锁服务器或集群以进行写入。
解锁 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
。