fsync
定义
fsync
将所有待处理的写操作从存储层刷新到磁盘。当
lock
字段设置为true
时,将在服务器或集群上设置锁,以阻止其他写入,直到锁被释放。从MongoDB 6.0.11开始 (从5.0.22开始也可用)
fsync
和fsyncUnlock
命令可以在mongos
上运行,以锁和解锁分片集群。当应用程序写入数据时,MongoDB 将数据记录在存储层,然后将数据写入磁盘。
如果您想将写入内容刷新到磁盘,请运行
fsync
。为了提供持久性数据,WiredTiger 使用了检查点。 有关详细信息,请参阅《日志和 WiredTiger 存储引擎》。
重要
服务器维护fsync锁计数。
lock
字段设立为true
的fsync
命令会递增锁计数,而fsyncUnlock
命令会递减锁计数。 要在锁定的服务器或集群上启用写入,请调用fsyncUnlock
命令直到锁计数为零。当要执行备份操作时,使用此命令阻止写入。
提示
在
mongosh
中,该命令也可通过db.fsyncLock()
辅助方法运行。辅助方法对
mongosh
用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
M 0 、M 2 、M 5和 M 10 + 集群不支持此命令。 有关更多信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
该命令具有以下语法:
db.adminCommand( { fsync: 1, lock: <Boolean>, fsyncLockAcquisitionTimeout: <integer>, comment: <any> } )
命令字段
该命令具有以下字段:
字段 | 类型 | 说明 |
---|---|---|
fsync | 整型 | 输入“ 1 ”以应用 fsync 。 |
fsyncLockAcquisitionTimeoutMillis | 整型 | 可选。指定获取锁的等待时间(以毫秒为单位)。如果获取锁操作超时,命令将返回响应失败。 默认: 版本 6.0.11 中的新增内容。 |
lock | 布尔 | 可选。在服务器或集群上获取锁,并阻塞所有写操作。每个带有 lock 操作的 fsync 都会获取一个锁。 |
comment | any | 可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。 |
Considerations
带有lock
选项的fsync
命令可确保使用cp
、 scp
或tar
等低级备份实用程序安全地复制数据文件。 开始使用复制文件的mongod
包含用户写入的数据,这些数据与锁定的mongod
上的用户写入的数据无法区分。
锁定mongod
的数据文件可能会因日志同步或WiredTiger快照等操作而发生变化。 虽然这对逻辑数据(例如 客户端访问的数据),但某些备份实用程序可能会检测到这些更改并发出警告,或者失败并显示错误。 有关MongoDB的更多信息 - 推荐的备份实用程序和过程,请参阅自管理部署的备份方法。
对较大型部署的影响
版本 6.0.11 中的新增内容。
当 fsync
命令在 mongos
上运行时,会在整个集群上执行 fsync 操作。将 lock
字段设置为 true
后,就会在集群上设置一个锁,阻止额外的写入。
要在锁定分片集群之前进行可用的自我管理备份,请执行以下操作:
确保没有处于活动状态的数据段迁移、重新分片或 DDL 操作。
停止负载均衡器,防止启动额外的数据段迁移。
使用日志作为替代方案
如果 mongod
已启用日志,请使用文件系统或卷/区块级快照工具将数据集和日志作为一个整体创建备份。
锁的计数
fsync
命令返回包含 lockCount
字段的文档。在 mongod
上运行时,计数会显示服务器上设置的 fsync 锁的数量。
在分片集群上运行时,mongos
会向每个分片发送 fsync 操作,并返回结果,其中包括每个分片的 lockCount
。
注意
如果 lockCount
字段大于零,服务器和集群上的所有写操作都会被阻塞。如需减少锁的计数,请使用 fsyncUnlock
命令。
故障后的 fsync 锁
Fsync 锁在副本集或分片集群中的主节点上执行。
如果主节点因网络问题宕机或无法访问,集群会从可用的从节点中选举出新的主节点。如果带有 fsync 锁的主节点宕机,新的主节点不会保留 fsync 锁,并且可以处理写操作。备份操作过程中发生选举时,生成的备份可能不一致或无法使用。
要从主节点降级中恢复:
运行
fsyncUnlock
命令直到锁计数为零,以释放所有节点上的锁。发出
fsync
命令以在集群上重新建立 fsync 锁。重新启动备份。
此外,fsync 锁是持久的。当旧的主节点再次上线时,需要使用 fsyncUnlock
命令释放节点上的锁。
示例
fsync 锁
注意
带有lock
选项的fsync
命令可确保使用cp
、 scp
或tar
等低级备份实用程序安全地复制数据文件。 开始使用复制文件的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
要解除对集群服务器的锁定,请使用 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
。