这是MongoDB的有效备份策略吗?


11

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

这可行吗?如果可以,我可能会遇到哪些潜在问题?如果没有,我如何将其概念化?

Answers:


6

ReplicaSet将在这种情况下工作。但是,我无法确定在同一服务器上具有两个MongoDB实例是否是一个好主意-这取决于服务器的硬件/软件和负载。

为了确保您的backupMongoDB节点不会成为主节点,请将其priority参数设置为0,例如

rs.add({_id: 1, host: "localhost:<port>", priority: 0})

注意:如果你不能有停机时间,你应该至少有2个主要的MongoDB节点ReplicaSet,请参阅文章


2

要考虑的一种策略是在副本集上的备份节点上使用“隐藏”选项。来自MongoDB博客:

隐藏的服务器不会出现在isMaster()结果中。这也意味着如果驱动程序自动将读取分发给从属,则将不会使用它们。隐藏的服务器必须具有0的优先级(您不能拥有隐藏的主服务器)。要添加隐藏成员,请运行:

rs.add({“ _ id”:num,“ host”:主机名,“ priority”:0,“ hidden”:true})


1

通常,首选副本集,但在这种情况下,也仅是因为它们具有自动恢复和自动重新同步功能。您所描述的备份方法听起来很合理,并且之前也已与其他数据库一起使用。

我看到的唯一潜在问题是,在某些情况下,您的辅助数据库可能会升级为主数据库,您要么a)需要从新的辅助数据库中获取备份,要么b)使备份脚本足够智能以告知该实例。 MongoDB辞职。

好消息是,对于

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

是否像亚历山大建议的那样将优先级设置为0,以使次要级永远不会成为主要级?
詹姆斯·辛普森

您必须进行一些测试,但是我不确定如果主进程由于某种原因停机,则辅助服务器是否只是待命。我一直想让我的继任者接任;)
Charles Hooper11年

1
>>您的辅助节点可能会升级为主要节点-如前所述,将辅助节点设置为优先级0将阻止其切换为主节点。
Jonesome恢复Monica 2011年

您可以连接到对等节点列表中的任何一个对等节点(它可以是任何主节点,辅助节点,仲裁者或隐藏节点),询问该对等节点是谁(rs.status()并循环通过result["members"]),并连接到其中一个次要执行备份。
yfeldblum 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.