这对于 MongoDB 来说是一个有效的备份策略吗?

这对于 MongoDB 来说是一个有效的备份策略吗?

我有一台专用服务器,其中有一个大约 10GB 的 MongoDB 数据库。我需要每天备份,但数据库不能停机。是否可以在单个磁盘上使用副本集(在不同的端口上运行 2 个 mongod 实例),然后简单地将辅助实例脱机并将数据文件备份到异地存储(如 S3)(日志记录已打开)?或者使用主/从模式会比副本集更好吗?

这是可行的吗?如果可行,我可能会遇到哪些潜在问题?如果不行,我该如何构思才能让它发挥作用?

答案1

ReplicaSet 可以在这种情况下工作。但是,我无法判断在同一台服务器上拥有两个 MongoDB 实例是否是个好主意——这取决于服务器硬件/软件和负载。

为了确保您的backupMongoDB 节点不会成为主节点,请将其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 实例退出。

好消息是,这应该相当简单

  1. 查询备份源以找出哪个实例是主实例、哪个是辅助实例(db.isMaster()
  2. rs.freeze()使用和rs.stepDown()命令说服备份实例退出或者重新连接到辅助

相关内容