2台服务器上的MongoDB复制

时间:2013-07-24 14:39:07

标签: php mongodb cluster-computing

我们在负载均衡器和防火墙后面有几个Web服务器。我正在将一个站点迁移到使用MongoDB的这个设置,该站点当前位于Web服务器上安装了MongoDB的单个服务器上。我不确定在新设置上设置Mongo的最佳方法,我在两个Web服务器上都设置了mongod实例,但它们目前有自己的(独立的)数据目录,我需要它们一直都是相同的。

我曾考虑将两个实例设置为在共享SAN设备上的单个数据目录中工作,但之后阅读有关复制集的内容,现在认为这是可行的方法。

我打算将一台服务器上的实例设置为主服务器,将另一台服务器上的实例设置为辅助服务器。我理解为了投票原因最好设置仲裁实例,这可以在任一服务器上进行吗?

我也明白主要实例是唯一一个接受写操作的实例,这是MongoDB的全部处理,即我必须连接到主实例(例如PHP),无论哪个服务器或PHP都可以连接到本地两个服务器上的实例和MongoDB处理将所有写入发送到当前主实例?

对于其他选项的任何建议将不胜感激。感谢

2 个答案:

答案 0 :(得分:0)

  

据我所知,最好为投票原因设置仲裁实例,这可以在任一服务器上进行吗?

这通常归结为分区。由于CAP规定当分区两侧有两个相同的成员时,您无法确保CAP。使用仲裁器你想要的是确保他们在分区的一侧创建奇数个成员。

因此,如果服务器之间存在分区,那么将仲裁器放在任何一个上就可以满足这个需求,所以是的,它应该没问题;但是,请检查您的网络设置。

  

连接到两台服务器上的本地实例,MongoDB处理将所有写入发送到当前主实例?

好的,我想我理解你的要求。驱动程序实际上会在内存中保留副本集配置的哈希映射,偶尔会刷新缓存的映射。它使用它来了解将写入发送到哪个服务器。

您可以通过PHP连接到非主要实例,只要副本成员都能看到对方(应该总是如此),那么驱动程序应该能够映射出您的副本集,了解哪些是主要的

修改

现在我重新阅读了我写这部分的内容:

  

你想要使用arbiters,确保他们在分区的一侧创建奇数个成员。

错了。目的是使奇数个节点允许在分区的一侧占多数。

之后事情再次加起来。

答案 1 :(得分:0)

一些评论:

首先,你应该让MongoDB与你的网络服务器在同一台机器上运行。 MongoDB(与任何其他数据库一样)喜欢内存,而MongoDB将主动声称所需内存。这可能会使Web服务器所需的资源匮乏,或者Web服务器进程可以反击并使MongoDB变慢。您真的希望将Web服务器和MongoDB实例放在不同的服务器上。

其次,您没有将MongoDB节点设置为“主要”或“次要”。您将它们设置为节点,MongoDB将哪个是主要的,哪个 是次要的。仲裁者既不是。

要与PHP交换MongoDB副本集,您需要指定一个“种子列表” - 它永远不应该只是一个IP地址,但始终包含多个(数据)节点。您希望提供多个地址,以防其中一个地址出现故障。如果您要连接到已关闭的节点,则PHP无法找到辅助节点。您还需要指定要连接到复制集,例如:

$m = new MongoClient( 'mongodb://192.168.12.4,192.168.12.5', array( 'replicaSet' => 'myReplSet' );

虽然您可以将仲裁服务器放在与数据节点相同的节点上,但最好将它放在Web服务器节点上。仲裁者可以使用,因为它占用的资源非常少。