![这对于 MongoDB 来说是一个有效的备份策略吗?](https://linux22.com/image/553725/%E8%BF%99%E5%AF%B9%E4%BA%8E%20MongoDB%20%E6%9D%A5%E8%AF%B4%E6%98%AF%E4%B8%80%E4%B8%AA%E6%9C%89%E6%95%88%E7%9A%84%E5%A4%87%E4%BB%BD%E7%AD%96%E7%95%A5%E5%90%97%EF%BC%9F.png)
我有一台专用服务器,其中有一个大约 10GB 的 MongoDB 数据库。我需要每天备份,但数据库不能停机。是否可以在单个磁盘上使用副本集(在不同的端口上运行 2 个 mongod 实例),然后简单地将辅助实例脱机并将数据文件备份到异地存储(如 S3)(日志记录已打开)?或者使用主/从模式会比副本集更好吗?
这是可行的吗?如果可行,我可能会遇到哪些潜在问题?如果不行,我该如何构思才能让它发挥作用?
答案1
ReplicaSet 可以在这种情况下工作。但是,我无法判断在同一台服务器上拥有两个 MongoDB 实例是否是个好主意——这取决于服务器硬件/软件和负载。
为了确保您的backup
MongoDB 节点不会成为主节点,请将其priority
范围例如0
rs.add({_id: 1, host: "localhost:<port>", priority: 0})
笔记:如果你不能停机,你应该在 ReplicaSet 中至少有 2 个主 MongoDB 节点,请参阅文章
答案2
需要考虑的一个策略是在副本集的备份节点上使用“隐藏”选项。摘自 MongoDB 博客:
隐藏服务器不会出现在 isMaster() 结果中。这也意味着如果驱动程序自动将读取分发给从属服务器,则不会使用它们。隐藏服务器的优先级必须为 0(不能有隐藏的主服务器)。要添加隐藏成员,请运行:
rs.add({“ _id”:num,“host”:主机名,“优先级”:0,“隐藏”:true})
答案3
副本集通常是首选,但在这种情况下,也仅仅是因为它们具有自动恢复和自动重新同步功能。您描述的备份方法听起来非常合理,并且之前也已在其他数据库中使用过。
我看到的唯一潜在问题是,在某些情况下,您的辅助数据库可能会提升为主数据库,并且您要么 a) 需要从新的辅助数据库获取备份,要么 b) 使您的备份脚本足够智能,以告知 MongoDB 实例退出。
好消息是,这应该相当简单
- 查询备份源以找出哪个实例是主实例、哪个是辅助实例(
db.isMaster()
) rs.freeze()
使用和rs.stepDown()
命令说服备份实例退出或者重新连接到辅助