负载平衡 MongoDB

负载平衡 MongoDB

我有一个用 Java 和 Tomcat 编写的应用程序,我已准备好开始扩展以进行生产。据我了解,我不应该将负载平衡器与 mongodb 路由器实例一起使用,因为它可能会导致问题。

但是,我知道有时我需要多个 Mongo 路由器。
最好的解决方法是什么?

我能想到的唯一方法是运行 Tomcat 服务器的多个副本,使用负载平衡器将流量路由到其中一个 Tomcat,并将每个 Tomcat 预先配置为使用特定的 mongodb 路由器。但是,我认为这不会很好地发挥作用,因为如果 mongodb 路由器发生故障,则可能会出现错误,如果 tomcat 发生故障,则我浪费了一个 mongodb 路由器。

答案1

从实际情况来看,你不需要更多的 MongoDB 路由器实例,直到你有很多服务器(每个都在做很多的流量)。但假设您达到了这一点,那么问题实际上比您想象的要容易解决得多。

扩展 MrKurt 所说的内容,您通常会做的是将 Tomcat 服务器分成几组,然后为每个 Tomcat 服务器组配置一组 MongoDB 路由器以实现故障转移。

因此,如果您有 30 台 Tomcat 服务器,则可以将它们分成 3 个 Tomcat 组,每个组 10 台。
然后为每个组设置一个 Mongo 路由器,并进行如下配置:

雄猫组 1-> 蒙戈 1、蒙戈 2、蒙戈 3
雄猫组 2-> 蒙戈 2、蒙戈 3、蒙戈 1
雄猫组 3-> 蒙戈 3、蒙戈 1、蒙戈 2

  • 每个 Tomcat 服务器组都指向不同的 Mongo 路由器
    因此,您不需要将所有请求都发送到某个前端。

  • 如果某个组的默认 Mongo 路由器发生故障,则可以将故障转移到下一个路由器
    这是由 MongoDB 连接驱动程序处理的。
    请注意如上所示的故障转移链的交错。这可以防止您在单一故障情况下将过多的负载转储到任何一台服务器上。

  • 如果你丢失了一个 tomcat 实例,你就不会“浪费” Mongo 路由器
    您必须丢失一个组中的所有 Tomcat 实例才能使其中一个 Mongo 路由器处于空闲状态(即使这样也不会“浪费”:如果另一个 Mongo 路由器实例发生故障,它仍然是冗余容量)。

答案2

目前大多数 Mongo 驱动程序可以在连接字符串中处理多个 Mongos,Java 驱动程序从 2.9.0 开始实现了此功能:https://jira.mongodb.org/browse/JAVA-381

但是,它仅用于故障转移,而不是负载平衡。通常,您不需要在 Mongos 之间进行负载平衡,瓶颈通常位于经过良好优化的设置中的后端分片上。

相关内容