8

考虑以下设置:

有 2 个物理服务器被设置为常规的 mongodb 复制集(包括一个仲裁进程,因此自动故障转移将正常工作)。

现在,据我了解,大多数实际工作将在主服务器上完成,而从服务器主要只是做工作以保持其数据集同步。

将分片引入此设置是否合理,以便在相同的 2 台服务器上设置另一个复制集,以便每个服务器都有一个 mongod 进程作为主进程运行,一个进程作为辅助进程运行。

预期的结果是两台服务器都将共享实际查询/插入的工作负载,而两者都已启动。在一个服务器失败的情况下,整个设置应该优雅地故障转移以继续运行,直到另一台服务器恢复。

除了设置的总体开销和进程数量(mongos/configservers/arbiters)之外,此设置是否有任何缺点?

4

4 回答 4

10

那肯定行得通。不久前,我在#mongodb IRC 频道中问过一个问题,即在一台机器上运行多个 mongod 进程是否是个坏主意。答案是“只要你有 RAM/CPU/带宽,就发疯”。

值得注意的是,如果您正在寻找高性能读取,并且不介意写入速度较慢,您可以:

  • 在“安全模式”下进行写入,写入在传播到N个服务器之前不会返回(在这种情况下,其中N是副本集中的服务器数量,所以它们都是)
  • 在连接代码中设置驱动程序适当的标志以允许从从站读取。

这将为您提供类似于 MySQL 的集群设置 - 在主服务器上写入一次,但任何从服务器都有资格读取。在读取多于写入的情况下(例如,一个数量级),这可能是更高的性能,但我不知道当节点出现故障时它会如何表现(因为写入可能会停止尝试写入到 3 个节点,但只有 2 个启动,等等 - 这需要测试)。

于 2010-09-07T19:40:14.443 回答
1

需要注意的一件事是,当两台机器都启动时,您的查询正在它们之间拆分。当一台机器出现故障时,所有查询都将转到剩余的机器,从而使对其的需求增加一倍。您必须确保您的机器能够承受突然加倍的查询。

于 2013-03-14T04:35:06.023 回答
0

You are missing one crucial detail: if you have a sharded setup with two physical nodes only, if one dies, all your data is gone. This is because you don't have any redundancy below the sharding layer (the recommended way is that each shard is composed of a replica set).

What you said about the replica set however is true: you can run it on two shared-nothing nodes and have an additional arbiter. However, the recommended setup would be 3 nodes: one primary and two secondaries.

http://www.markus-gattol.name/ws/mongodb.html#do_i_need_an_arbiter

于 2010-09-09T21:28:52.117 回答
0

在这种情况下,我首先会重新考虑分片,并将其设为 2 台机器(+1 个仲裁器)的非分片副本集。

于 2011-04-02T05:18:32.203 回答