我有一个用java写的应用程序,我准备开始扩展生产。 据我了解,我不应该使用负载平衡器与MongoDB路由器实例,因为它可能会导致问题。
但是,我知道在某些时候我需要多个Mongo路由器。
什么是最好的方式去做这件事?
我能想到的唯一方法是运行Tomcat服务器的多个副本,使用负载平衡器将stream量路由到其中一个Tomcat,并且将每个Tomcat预configuration为使用特定的MongoDB路由器。 但是,我不认为这将工作得很好,就好像一个mongodb路由器出现故障,然后可能会出现错误,如果一个tomcat崩溃,那么我正在浪费一个mongodb路由器。
现在大多数Mongo驱动程序可以在连接string中处理多个Mongo,Java驱动程序从2.9.0开始实现: https ://jira.mongodb.org/browse/JAVA-381
这只是为了故障转移,但是,不是负载平衡。 您通常不需要在Mongo之间进行负载平衡,在优化后的设置中,瓶颈通常位于后端分片上。
作为一个实际的事情,你将不需要更多的MongoDB路由器实例,直到你有很多的服务器(每个做很多的stream量)。 假设你已经到了这一点,虽然这个问题比你想象的要容易得多。
根据MrKurt的说法,你通常会做的是将你的Tomcat服务器拆分成组,然后用一组MongoDB路由器为每个Tomcat服务器组configuration故障转移。
所以如果你有30个Tomcat服务器,你可以把它们分成3个Tomcat组。
然后为每个组build立一个Mongo路由器,并configuration如下所示:
Tomcat Group 1 – > Mongo 1,Mongo 2,Mongo 3
Tomcat Group 2 – > Mongo 2,Mongo 3,Mongo 1
Tomcat Group 3 – > Mongo 3,Mongo 1,Mongo 2
每个Tomcat服务器组都指向一个不同的Mongo路由器
所以你不会在所有的请求中打一个单一的前端。
如果一个组的默认Mongo路由器出现故障,则故障转移到下一个
这是由MongoDB连接驱动程序处理的。
注意如上所示的故障转移链的错开。 这可以防止在单个故障情况下将过多的负载转储到任何一台服务器上。
如果你失去了一个单独的tomcat实例,那么你并不是在“浪费”Mongo路由器
为了让一个Mongo路由器闲置(即使没有被“浪费”),也必须丢失一个组中的所有Tomcat实例:在另一个Mongo路由器实例发生故障时,它仍然是冗余容量。