Mongodb 增量备份

Tia*_*ago 32 mongodb backup

我的任务是为 MongoDB 副本集设置增量备份,作为起点,当然,我用谷歌搜索它并在 MongoDB 文档上找不到任何内容,但我确实在 Stack Overflow 上找到了这个问题,这鼓励开发我自己的解决方案因为没有发现 Tayra 很活跃。

我阅读oplog并意识到开发一些东西来重播日志非常容易,但事实证明我没有必要像mongorestore我那样这样做。

现在我有了一个使用 bash 脚本的有效解决方案,而且非常简单,这就是我在这里询问我的逻辑是否有任何缺陷的原因,或者将来可能会咬我的东西。

下面我是如何实现的:

完整备份程序

  1. 锁定在次要成员上写入 db.fsyncLock()

  2. 拍摄快照

  3. 记录 oplog 的最后一个位置

    db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
    
    Run Code Online (Sandbox Code Playgroud)
  4. 解锁写入 db.fsyncUnlock()

增量备份过程

  1. 锁定在次要成员上写入

  2. 在完整(或最新的增量)备份上从记录的 oplog 位置转储 oplog:

    mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 
        --query '{ "ts" : { $gt :  Timestamp(1437725201, 50) } }'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 记录最新的 oplog 位置(与完整备份相同)

  4. 解锁写入

完整备份还原过程

  1. 停止所有实例 mongod
  2. 将快照复制到将是主要的框的数据目录,但请确保排除所有local*mongod.lock 这种还原技术称为通过破坏镜像重新配置
  3. 开始初级
  4. 重新配置副本集
  5. 在没有任何数据的情况下启动辅助节点,让它们执行初始同步。或使用新local数据库从新主数据库复制数据

恢复增量备份

当我们创建增量备份时,它的存储方式如下:

/mnt/mongo-test_backup/1/local/oplog.rs.bson
/mnt/mongo-test_backup/1/local/oplog.rs.metadata.json
Run Code Online (Sandbox Code Playgroud)

我们被插入oplog.rs.bson但我们必须重命名它,所以这里是步骤:

  1. 将目录更改为备份: cd /mnt/mongo-test_backup/1/local

  2. 删除json文件 rm *.json

  3. 重命名 bson 文件 mv oplog.rs.bson oplog.bson

  4. 恢复它:

     mongorestore -h <primary> --port <port> --oplogReplay /mnt/mongo-test_backup/1/local
    
    Run Code Online (Sandbox Code Playgroud)

我已经编写好了所有脚本,稍后我可能会在 GitHub 上提交它。

问题是逻辑上是否有任何缺陷?我有点怀疑,因为该程序非常简单,但我仍然无法在任何地方找到它的记录。

小智 5

回答你的问题。不!您的逻辑没有失败,它应该可以正常工作。但是,如果可以使用 LVM 快照,则是进行备份的更好方法。