如何在备份单个 mongod 时安全地使用 fsyncLock()

如何在备份单个 mongod 时安全地使用 fsyncLock()

我在MongoDB的官方文档中看到:

重要提示:db.fsyncLock() 可能会阻止读取,包括验证身份验证所需的读取。警告:调用 db.fsyncLock() 时,请确保连接保持打开状态,以允许后续调用 db.fsyncUnlock()。关闭连接可能会使释放锁变得困难。

在最坏的情况下,我使用 fsyncLock() 来阻止数据库,但由于临时网络故障,我突然失去与数据库的连接。在这种情况下,我无法重新连接,因为 fsyncLock() 阻止了读取器。我的数据库将永远被阻止。

我现在正在考虑关闭 mongodb 进行备份。单个 mongod 最安全的备份解决方案是什么?

答案1

单个 mongod 最安全的备份方案是什么?

两个选项:

  1. 反对mongodump正在运行的mongod。它不会阻塞,但它会在备份数据库时导致一些读取锁定和一般噪音。除非您对数据库有很多争用,否则这通常不是什么大问题。
  2. 根据您的文件系统,拍摄文件系统的快照并对mongodump --dbpath这些文件执行操作。

实际上,您应该有一个副本集并针对辅助副本进行备份。

答案2

根据您的设置,解决方案可能会有所不同。

我建议你阅读备份和恢复mongo 文档的章节来决定如何实现它。

如果您选择实施“文件系统快照”解决方案(我更喜欢该解决方案),您可以通过从运行 mongo 的服务器上执行的过程直接发出 db.fsyncLock() 和 db.fsyncUnlock() 来缓解网络问题。

例如,在 *NIX 服务器上,您应该能够通过运行如下脚本来制作正确的快照:

#!/bin/sh
mongo admin --eval "printjson(db.fsyncLock())"
# create file system snapshot
mongo admin --eval "printjson(db.fsyncUnlock())"
# make the backup of entire snapshot
# release the snapshot

通过直接在 mongo 所在的服务器上运行此脚本,蒙戈客户端将使用 tcp 连接 127.0.0.1 连接到服务器,这样您的网络问题就会消失。

相关内容