使用 apache 和 mod_jk 进行无缝故障转移

使用 apache 和 mod_jk 进行无缝故障转移

我有两台 Tomcat 服务器作为前端服务器。两台服务器都在负载均衡器中处于活动状态。如果我终止其中一个后端 Tomcat 进程,则该节点上的所有用户在下次访问服务器时都会收到 HTTP 500。我想避免 500 发送给用户 - 我希望 mod_jk 看到 500 并将请求发送到另一台服务器。一旦用户确实收到 500,如果我刷新,请求就会发送到另一台服务器。为什么 mod_jk 将 500 返回给浏览器而不是尝试另一个活动节点?

我们的应用程序是有状态的,但我们已在应用程序中完成了保存状态和关键时间的工作。因此,如果我们能够使故障转移更加无缝,我们将获得我们想要的用户体验。

这是我的workers.properties文件

worker.list=router,jkstatus  
worker.router.type=lb  
worker.router.balance_workers=worker1,worker2  
worker.router.method=Next  

worker.worker1.type=ajp13  
worker.worker1.host=localhost  
worker.worker1.port=8009  

worker.worker2.type=ajp13  
worker.worker2.host=localhost  
worker.worker2.port=8010  

worker.jkstatus.type=status  

答案1

fail_on_status自 jk 1.2.20 起,您可以为工人设置属性。

http://tomcat.apache.org/connectors-doc/reference/workers.html了解详情。

答案2

好吧,既然你所说你不受 apache 的约束,那么我建议你使用像 Varnish 这样的东西,它是一个负载平衡器以及反向代理,同时也是一个非常好的缓存服务器。

使用相同的方法甚至不会提高您的网站性能,但也会为您提供当前问题的解决方案。

在 varnish 中,你可以使用 tomcat 配置 2 个后端。所有请求都会到达 Varnish,它会在 2 个后端 tomcat 服务器之间进行负载平衡。

如果某个 tomcat 服务器发生故障,则它不会再向该 tomcat 服务器发送任何查询,而是将所有流量发送到健康的后端。在后台,它将继续检查故障 tomcat 服务器的健康状况,一旦服务器恢复健康状态,它就会开始向该 tomcat 服务器发送回查询。

答案3

为每个工作者设置重定向:

worker.worker1.类型=ajp13
worker.worker1.主机=localhost
worker.worker1.端口=8009
worker.worker1.重定向=worker2

worker.worker2.type=ajp13
worker.worker2.host=localhost
worker.worker2.port=8010

worker.worker2.重定向=worker1

相关内容