fsync
定义
fsync
将所有待处理的写操作从存储层刷新到磁盘。当
lock
字段设置为true
时,将在服务器或集群上设置锁,以阻止其他写入,直到锁被释放。从MongoDB 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> } )
命令字段
该命令具有以下字段:
字段 | 类型 | 说明 |
---|---|---|
| 整型 | 1 |
| 整型 | 可选。指定获取锁的等待时间(以毫秒为单位)。如果获取锁操作超时,命令将返回响应失败。 默认: 5.0.22版本新增。 |
| 布尔 | 可选。在服务器或集群上获取锁,并阻塞所有写操作。每个带有 |
| any | 可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。 |
Considerations
带有lock
选项的fsync
命令可确保使用cp
、 scp
或tar
等低级备份实用程序安全地复制数据文件。 开始使用复制文件的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 锁的主节点宕机,新的主节点不会保留 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
。