2016-09-28 20 views
0

我在EC2上有三个实例,每个实例都有服务mongo,设置了副本集,即主副本(192.168.1.1),副主副本(192.168.1.2 )和仲裁者(192.168.1.3)。在mongo中添加新成员并防止应用程序中的错误异常

我有几个应用程序连接到mongo。

我的问题如下:

如果我在副本添加其他成员,我不得不改变在连接设置中的所有应用程序,包括新成员?

因为我问了。

假设ip以final .1为主,.2为secondary,然后添加一个新成员到最后的ip .4。而且我不在应用程序数据库设置中包含这个新成员。小学生跌倒了,仲裁人选择了.4作为新的小学。所有应用程序将开始抛出异常。

我该如何“修复”它,以某种方式总是必须添加一个新成员并不需要更改应用程序数据库的配置。想象一下,如果我必须添加'n'个成员。

您是否有任何方式来配置应用程序,知道我的应用程序在PHP中,无需添加主机配置即可单独标识主要应用程序?

+0

这很困难;除非您足够幸运,您的初始主机集永远保留在副本集中,并且总是至少有一个主动和可用,那么您最终必须更改应用配置。这个问题的各种解决方案称为[tag:service-discovery],并让您的应用程序联系第三个系统以找出它可以连接到复制集的地方。 –

回答

0

无需在应用程序中更改任何内容。您只需使用命令rs.add(“address:port”)将新节点添加到副本集。如果您有三个节点(一级和二级),如果所有节点都是投票成员,则不应该有任何仲裁器。 (票数应始终为奇数)

您可以选择具有优先级值的主要遗产订单。如果您将.1节点设置为f.ex.到3.2节优先级为2,并保持最后一级为优先级1,.1保持为主级如果它可以,并且它不能,.2选作主级... 要点是,你的应用程序连接到副本集的一个节点和它(应用程序)获取自动信息,该副本集的其他节点是什么以及“谁”是主要的。

使用三个节点副本集时,必须始终有两个节点启动并运行(多数; 2/3),否则最后一个节点将不会被选为主节点。

+0

只要对复制对象只有很少的更改,这就可以正常工作。如果最终做出很多更改(例如,添加五个新主机,然后删除原来的三台主机),那么应用程序的连接字符串将不再有效,因为它不包含任何活动主机的地址。 –

相关问题