如何安全地使用fsyncLock()备份一个mongod

我读了MongoDB的官方文档:

重要的是:db.fsyncLock()可能会阻止读取操作,包括validation身份validation警告所需的读取操作:调用db.fsyncLock()时,确保连接保持打开状态,以允许随后调用db.fsyncUnlock()。 closures连接可能会使锁难以释放。

在最坏的情况下,我使用阻塞数据库的fsyncLock(),但是由于临时的networking故障,我突然失去了与数据库的连接。 在这种情况下,我不能重新连接,因为fsyncLock()阻止读者。 我的数据库将被永久封锁。

我正在考虑closuresmongodb备份。 什么是单个mongod最安全的备份解决scheme?

什么是单个mongod最安全的备份解决scheme?

两个选项:

  1. 对运行的mongod使用mongodump 。 它不会阻塞,但它会导致一些读取locking和一般的噪音,因为它备份您的数据库。 这通常不是什么大事,除非你对数据库有很多的争议。
  2. 根据您的文件系统,创build文件系统的快照并针对这些文件执行mongodump --dbpath

真的,你应该有一个副本集,并采取备份对辅助。

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

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

如果您select实施“文件系统快照”解决scheme(我比其他人更喜欢),则可以通过直接从要在mongo服务器上执行的过程发出db.fsyncLock()和db.fsyncUnlock()来减轻networking问题在跑。

例如,在* 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所在的服务器上直接运行这个脚本, mongo客户端将通过tcp连接到127.0.0.1连接到服务器,您的networking问题将消失。