1

我想知道客户端和查询路由器之间的负载平衡和故障转移如何在 MongoDB 中工作。到目前为止,我还没有找到任何匹配的文档。每个人都说这无关紧要,我不这么认为。每一个软件/硬件都可能死掉,总有一个理由让你不能立即再次启动它。

情况很简单。假设使用分片副本集的常规设置,客户端连接到查询路由器并执行操作。如果查询路由器死了会发生什么?是否有用于自动故障转移到第二个查询路由器的预期方法?或者用于 2 个查询路由器之间的负载平衡?

谢谢你的帮助,德克

4

2 回答 2

2

如果您为它们提供适当的 mongos 进程列表,则有一些驱动程序(我确信在 JAVA 和 Python 中)支持自动故障转移和重新连接。在 JAVA 驱动程序中还内置了一些循环平衡,但这些功能并非在所有驱动程序中都存在。例如 C++ 驱动程序也没有。检查您计划使用的给定驱动程序的功能。

如果您在数据库之上有一个平衡的应用程序层,您可以在每个应用程序服务器上放置一个 mongos,并专门使用它。在这种情况下,单个 mongos 的故障只会影响该应用程序服务器,当然这会在 mongos 无法运行时出现。这种架构同时解决了平衡和 HA 问题。

或者,您可以使用例如 HAProxy 在 mongos 进程前进行负载平衡,但是 mongos 进程本身没有内置 HA 功能,因此如果退出,它将影响使用此架构的所有 API 服务器。

于 2013-08-27T15:51:54.320 回答
1

每个人都说这无关紧要,我不这么认为。

你的权利如此。mongos 实例的故障转移非常重要,如果没有适当的架构来处理这个问题,您的应用程序可能会出现严重故障。它还破坏了 MongoDB 的高可用性。

如果查询路由器死了会发生什么?

这是您真正应该将种子列表放入驱动程序中的连接字符串的地方,在这种情况下,驱动程序将按照它对副本所做的操作执行某些操作,并尝试连接到列表中的其他成员以恢复为普通的。

是否有用于自动故障转移到第二个查询路由器的预期方法?

如果您为您的应用程序配置提供更多 mongos 实例 IP,这应该是非常自动化的。

或者用于 2 个查询路由器之间的负载平衡?

如果你只想提供一个 IP,你也可以走那条路,但是你必须担心那个负载均衡器,等等……

于 2013-08-27T15:20:30.897 回答