mongodb丢失副本集的主要主机

时间:2012-10-23 02:49:16

标签: mongodb replication

我有一个相当复杂的问题,我认为归结为以下几点。今天早上,我有一个由主机A,B和C组成的副本集,其中A是主要的。然后我完全失去了A,B可能已经失去了一会儿(我不知道)。它是一个ec2实例,所以当它返回时它有一个不同的主机名(虽然它具有完全相同的ebs卷,因此具有相同的文件结构)。

所以在这一点上,就主机名A消失而言,我有B,C和D.D的内容与A相同,但外部世界将它们视为两个不同的主机(它们是是)。登录到B和C的mongo表明它们是次要的(优先级为0),它仍然列出了没有优先级的旧主机A:

SECONDARY> rs.conf() //this is from C
{
"_id" : "rs_0",
"version" : 1,
"members" : [
    {
        "_id" : 0,
        "host" : "A:27018"  //this is the dead guy ....
    },
    {
        "_id" : 1,
        "host" : "C:27019",
        "priority" : 0
    },
    {
        "_id" : 2,
        "host" : "B:27020",
        "priority" : 0
    }
]
}

我从B或C发出的任何命令都会返回一条消息,告诉我我不是主人,因此我无法更改此副本集的conf记录中的任何主机。

最糟糕的情况是我可以使用mongoexport并将所有内容转储到json,这是(a)痛苦的屁股和(b)非常非常丑陋和(c)在我生产时不太实际。

所以基本上,归结为此。当我有副本集并且我失去对主服务器的控制/访问权限并希望添加另一个主机来接管该功能时,我该怎么办?

谢谢!

1 个答案:

答案 0 :(得分:2)

如果必须在没有主服务器的情况下重新配置,则可以将命令发送到辅助服务器,但必须包含一个额外选项:{force:true}。这表示您知道自己不是在与主要人员交谈,而是想要强制进行重新配置。

在继续之前,我想指出每个辅助服务器上的优先级0都会在主要故障的情况下失败,因为它具有自动故障转移的副本集。优先级0表示节点永远不会成为主节点。由于唯一的非0节点失败,因此您的副本集没有主节点。

我建议至少有一个优先级高于0的辅助设备(默认值为1)。我还建议为您的主机而不是AWS名称使用外部/可解析的DNS名称,这样如果您再次发现自己处于这种情况,您可以将用于指向现已死机的名称重新分配给取代其位置的新主机。在这种情况下,您根本不需要重新配置副本集。

如需进一步阅读,我建议:http://docs.mongodb.org/manual/tutorial/reconfigure-replica-set-with-unavailable-members/