我承担了为MongoDB复制集设置增量备份的任务,当然,作为起点,我用Google搜索了它,但在MongoDB文档上找不到任何内容,但是我确实在Stack Overflow上发现了这个问题,这鼓励开发自己的解决方案因为没有发现Tayra非常活跃。
我阅读oplog
并意识到,开发一些东西来重播日志非常容易,但是事实证明,我并不需mongorestore
要这样做。
现在,我有了一个使用bash脚本的可行解决方案,这很容易,这就是我在这里询问我的逻辑是否有缺陷的原因,或者将来会困扰我的原因。
下面是我的实现方式:
完整备份程序
- 锁定写入辅助成员
db.fsyncLock()
- 拍摄快照
记录操作日志中的最后一个职位
db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
解锁写入
db.fsyncUnlock()
增量备份程序
- 锁定写入辅助成员
从完整(或最新增量)备份中记录的oplog位置转储oplog:
mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 --query '{ "ts" : { $gt : Timestamp(1437725201, 50) } }'
记录最新操作日志位置(与完整备份相同)
- 解锁写入
完整备份还原过程
- 停止的所有实例
mongod
- 将快照复制到将成为主文件夹的数据目录中,但请确保排除所有快照,
local*
并且mongod.lock
此恢复技术称为通过破坏镜像进行重新配置 - 开始小学
- 重新配置副本集
- 在没有任何数据的情况下启动辅助设备,让它们执行初始同步。或从具有新
local
数据库的新主数据库复制数据
恢复增量备份
当我们创建增量备份时,它像这样存储它:
/mnt/mongo-test_backup/1/local/oplog.rs.bson
/mnt/mongo-test_backup/1/local/oplog.rs.metadata.json
我们已经启用了,oplog.rs.bson
但是我们将不得不对其进行重命名,因此步骤如下:
- 将目录更改为备份:
cd /mnt/mongo-test_backup/1/local
- 删除json文件
rm *.json
- 重命名bson文件
mv oplog.rs.bson oplog.bson
恢复它:
mongorestore -h <primary> --port <port> --oplogReplay /mnt/mongo-test_backup/1/local
我已经编写了所有脚本,可以稍后在GitHub上提交。
问题是逻辑是否存在缺陷?我有点可疑,因为该过程非常简单,但仍然找不到任何地方的文档。
2
您正在使用哪个版本的Mongo?如果您使用的是wiredtiger,那么用db.fsyncLock()引用的第一项就是一个问题。MongoDB Inc声称“对于WiredTiger,带有lock选项的fsync命令不能保证数据文件不会更改。因此,请不要使用这些方法来确保创建备份的一致性。” 链接
—
SDillon
@SDillon使用3.0.4,但尚未使用WiredTiger,至少现在还没有。我决定使用它,而不是锁写,我们将不得不一起停止mongod。这是一个公平的感谢
—
Tiago
我发现以下用于增量备份的工具github.com/EqualExperts/Tayra希望这会有所帮助
—
Ahmad Abuhasna '16
“在版本3.2中进行了更改:带有lock选项的fsync命令可以确保使用MMAPv1或WiredTiger存储引擎的MongoDB实例的数据文件不会更改,从而为创建备份提供了一致性。”
—
安全的
进行增量备份的常规方法(也是绝对最简单的方法)是使用LVM和快照。docs.mongodb.com/manual/tutorial/...
—
JJussi