MongoDB支持副本集,为何还需要备份呢?备份的主要目的有:1)防止硬件故障引起的数据丢失; 2)防止人为错误误删数据;3)时间回溯;4)监管要求。
MongoDB备份的机制
- 延迟节点备份
- 全量备份 + Oplog 增量
全量备份的方式
-
mongodump
-
复制数据文件
-
文件系统快照
方案一:延迟节点备份
安全范围内的任意时间点状态 = 延迟从节点当前状态 + 定量重放 oplog
延迟备份注意事项
主节点的 oplog 时间窗t应满足: t >= 延迟时间 + 48小时
方案二:全量备份加 oplog
- 最近的 oplog 已经在 oplog.rs 集合中,因此可以在定期从集合中导出便得到了 oplog;
- 如果主节点上的 oplog.rs 集合足够大,全量备份足够密集,自然也可以不用备份 oplog;
- 只要有覆盖整个时间段的 oplog,就可以结合全量备份得到任意时间点的备份。
复制数据库文件全量备份注意事项
- 必须先关闭节点才能复制,否则复制到的文件无效;
- 也可以选择 db.fsyncLock() 锁定节点,但完成后不要忘记 db.fsyncUnlock() 解锁;
- 可以且应该在从节点上完成;
- 该方法实际上会暂时宕机一个从节点,所以整个过程中应注意投票节点总数。
文件系统快照注意事项
-
MongoDB 支持使用文件系统快照直接获取数据文件在某一时刻的镜像;
-
快照过程中可以不用停机;
-
数据文件和 Journal 必须在同一个卷上;
-
快照完成后请尽快复制文件并删除快照;
Mongodump 全量备份注意事项
- 使用 mongodump 备份最灵活,但速度上也是最慢的;
- mongodump 出来的数据不能表示某个个时间点,只是某个时间段
可以通过oplog的幂等性解决这个问题:
备份和恢复操作
几个重要参数:
mongodump:
--oplog: 复制 mongodump 开始到结束过程中的所有 oplog 并输出到结果中。 输出文件位于 dump/oplog.bson
mongorestore:
--oplogReplay: 恢复完数据文件后再重放 oplog。默认重放 dump/oplog.bson=> <dump-directory>/local/oplog.rs.bson。如果 oplog 不在这,则可以:
--oplogFile: 指定需要重放的 oplog 文件位置
--oplogLimit: 重放 oplog 时截止到指定时间点
举例:
mongodump -h 127.0.0.1:27017 --oplog
mongorestore --host 127.0.0.1 --oplogReplay dump
参考:
「真诚赞赏,手留余香」
请我喝杯咖啡?
使用微信扫描二维码完成支付
