构build可伸缩Java Web应用程序的最佳实践

我们得到了当前在单个服务器上运行的JavaEE WebApp(JSP + Struts + Hibernate + MySQL)。 由于网站的增长和性能问题,我们决定在一些机器上集群项目。 网站应该容忍每秒5000个请求。 经过一些search和阅读的东西,我已经围绕一些策略来完成这个工作:

  • 使用Apache作为前端负载平衡器和反向代理,一些Tomcat实例在分离的机器上,最后是运行MySQL的数据库服务器。 Tomcat实例可以在需要的时候扩展。
  • 使用Nginx作为前端负载均衡器和反向代理。 其余的将和上面一样。
  • 使用HAProxy作为前端负载均衡器和反向代理。 其余的将和上面一样。

我想在上述方法中,所有的stream量都应该通过前端负载均衡器(Apache,Nginx或HAProxy Server)。 这使前端服务器成为瓶颈,也是SPOF。 是对的吗? 单个前端服务器可以容忍一个大型Web应用程序的所有stream量吗?

为了解决这个问题,我想出了一个手工策略:

  • 将login页面和身份validation操作放在前端服务器上(例如,可从myapp.com访问)。 当用户login成功后,他被redirect到后端服务器之一(如srv1.myapp.com),并继续他的活动。

那么,我在正确的道路上?

让我知道你对这些方法的看法,如果你正在考虑一个更好的方法,请在这里提一下。

将login页面放在前端服务器上并redirect到后端是个不错的主意。 用户可能会为后端服务器添加书签,最终可能导致分布不均匀,而当服务器closures时,如果用户在同一个会话中,用户仍然会尝试点击它。

您需要的是主动/被动( 心跳 / 起搏器 / IP故障切换 / DNS故障切换 )或主动/主动( DNS轮询 / networking负载平衡 )前端服务器。

在主动/被动模式下,您的所有stream量将被redirect到一个前端服务器,另一个处于待机状态 。 当第一个服务器出现故障时,您将以某种方式进行故障切换(以太网通过重新分配IP地址或修改DNS *)来指向第二台服务器。

在主动/主动的情况下,您可以使用以太网DNS轮循机制IP /networking负载平衡 ,使两台(或更多台)服务器始终处于活动状态,以在两者之间平均分配负载(大致)。 然后,这两台服务器将再次分配负载到您的后端服务器。

主动/主动是大多数大型Web应用程序使用的方法(查看Youtube / Google / Twitter / WordPress.com / Tumblr的DNSlogging,他们将有多个IP用于DNS循环的服务器。

一旦你做出了决定并付诸实施,你所拥有的只是解决scheme之间的一种select。 我个人build议NGINX,但每个人都有自己的偏好( HAProxySquidCherokeeLightspeedF5 (硬件), 思科 (硬件)和无数其他人)。

不幸的是,对于这样的问题,我们不能只是说“做这个”,因为它确实取决于你的要求。 研究上面的一些关键字,如果你有任何具体的问题随时问。

*如果可能的话,应该尽量避免基于DNS的故障转移,一些客户端会将DNScaching超过TTL,因此不太理想。

我不知道nginx,但你可以在主动/被动configuration中配对haproxy负载均衡器,以防止haproxy成为单点故障。

也有商业解决scheme,但是由于某些原因,在serverfault上看起来并没有那么多“墨水”。