Mongodb AZURE 上带有仲裁器的复制集

Mongodb Replicaset on AZURE with an Arbiter

我想使用 MongoDB 进行复制;我创建了一个具有 2 个辅助节点和 1 个仲裁器的 VM:

我想了解这个系统是如何工作的,所以我有一些问题:

1)根据资料“如果一个replica set有偶数个成员,加一个arbiter。”我加了一个arbiter。但我不确定我是否做对了。这个偶数适用于次要成员还是所有成员?

2) 这个仲裁器在做什么?我其实不明白它的工作。

3) 我为每个虚拟机创建了 public IP 地址,以便从外部连接到它们。我使用此连接字符串从我的应用程序成功连接:

mongodb://username:password@vm0:27017,vm1:27017,vm2:27017/dbname?replicaSet=xxx&readPreference=primaryPreferred

我没有在此连接字符串中添加仲裁程序,但我应该添加它吗?

4) 当我关闭主机器时,其中一台辅助机器如我所料成功成为主机器。这种情况下没有问题;但是当我关闭第二台主机时,我的应用程序会抛出错误。第二个辅助节点尚未成为主要节点 - 为什么会发生这种情况?

5) 如果所有虚拟机都在工作但我关闭了仲裁器,我的应用程序将再次抛出错误并且我无法连接到数据库。我正在尝试这个,因为我在考虑如果仲裁机出现问题并且将来可能因为维护或任何其他问题而关闭的情况。

可能是因为我没有理解仲裁者的作用;我认为这是错误的,但为什么它不将任何辅助机器转换为仲裁器?为什么当我关闭仲裁器时整个系统不工作?

谢谢。

1) 如果你有 1 个主节点和 2 个辅助节点,那么你的副本集中有 3 个成员。因此,您不应该添加仲裁程序。您已经有奇数个节点。

2) arbiter是一个不保存数据的节点,不能被选为Primary。它仅用于在当前 Primary 出现故障时选举新的 Primary。

例如,假设您有 1 个小学和 1 个中学。副本集有 2 个成员。如果主节点宕机,副本集将尝试投票选​​出一个新的主节点。为了选举节点,它需要赢得一半的选票。但如果 Secondary 投票给自己,它只会得到 2 票中的 1 票。那是不超过一半所以它不会被选上。因此副本集将无法选择一个新的主副本,并且您的整个副本集将关闭。

要解决此问题,您可以向副本集添加仲裁程序。这通常是一台小得多的机器,因为它不需要保存数据。它只有一项工作,在选举的情况下投票选出辅助节点作为新的主要节点。

但是,由于您已经拥有 3 个数据承载节点,因此您不想添加仲裁器。 You can read more about arbiters here.

3) 您可以将仲裁器添加到连接字符串,但通常不需要这样做。添加数据承载节点就可以了。人们通常都是这样做的。

4) 你在副本集中有 4 个成员。你拿下了其中的 2 个。这意味着只剩下 2 票了。最终的次要选票将无法获得超过 50% 的选票,因此不会选出主要选票。

一般来说,测试两个节点都宕机是多余的。您可能想要一个 3 成员副本集。每个成员都应位于不同的可用性区域(Azure 中的 Availability Set)。如果两个节点出现故障,您的副本集将不可用。但是,如果所有节点都位于不同的可用性区域,则两个节点同时宕机的可能性很小。所以不要太担心不止一个节点宕机。如果这是一个真正的问题(在大多数应用程序中它真的不是),你想要制作一个 5 成员副本集。

5) 真奇怪。这听起来像是您的副本集可能配置不正确。正如我所说,无论如何你都不需要仲裁者。所以你可以尝试在没有仲裁器的情况下再次设置它,看看它是否有效。如果您仍有问题,请提出一个新问题。确保在您的问题中包含 运行 rs.status() 的输出。