1

我有一个相当复杂的问题,我认为可以归结为以下几点。今天早上,我有一个由主机 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) 当我在生产时并不实用。

所以基本上,它归结为这一点。当我有一个副本集并且我失去对主节点的控制/访问并想要添加另一个主机来接管该功能时,我该怎么办?

谢谢!

4

1 回答 1

2

当您必须在没有主节点的情况下重新配置时,您可以将命令发送到辅助节点,但您必须包含一个额外的选项:{force:true}。这表示您知道您没有与主服务器通话,但无论如何您都想强制重新配置。

不过,在您继续之前,我想指出,每个辅助节点上的优先级 0 会破坏在主节点发生故障时为自动故障转移设置副本集这一点。优先级 0 意味着节点永远不会成为主节点。由于唯一的非 0 节点失败,您的副本集没有主节点。

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

为了进一步阅读,我推荐:http ://docs.mongodb.org/manual/tutorial/reconfigure-replica-set-with-unavailable-members/

于 2012-10-23T04:34:55.167 回答