0

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

我曾考虑将两个实例设置为从共享 SAN 设备上的单个数据目录工作,但后来阅读了复制集,现在认为这是要走的路。

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

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

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

4

2 回答 2

1

几点评论:

首先,您不应该MongoDB 与您的 Web 服务器在同一台机器上运行。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 服务器节点上。仲裁者可以使用它,因为它占用的资源很少。

于 2013-07-24T16:10:24.890 回答
0

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

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

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

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

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

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

编辑

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

您想要使用仲裁器的是确保它们在分区的一侧创建奇数个成员。

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

在那之后,事情再次加起来。

于 2013-07-24T14:54:47.930 回答