构建可扩展 Java Web 应用程序的最佳实践

构建可扩展 Java Web 应用程序的最佳实践

我们得到了这个 JavaEE WebApp(JSP+Struts+Hibernate+MySQL),它目前在一台服务器上运行。由于网站的增长和性能问题,我们决定将项目集群到一些机器上。该网站应该可以容忍每秒 5000 个请求。在谷歌搜索和阅读了一些资料后,我找到了一些完成此任务的策略:

  • 使用 Apache 作为前端负载均衡器和反向代理,一些 Tomcat 实例分别位于单独的机器上,最后是运行 MySQL 的 DB 服务器。Tomcat 实例可以根据需要进行扩展。
  • 使用Nginx作为前端负载均衡器和反向代理。其余与上述相同。
  • 使用HAProxy作为前端负载均衡器和反向代理。其余与上述相同。

我认为在上述方法中,所有流量都应通过前端负载均衡器(Apache、Nginx 或 HAProxy 服务器)。这会使前端服务器成为瓶颈,并且还会造成 SPOF。对吗?单个前端服务器能否承受大型 Web 应用的所有流量?

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

  • 将登录页面和身份验证操作放在前端服务器上(例如,可从 myapp.com 访问)。当用户成功登录时,他会被重定向到后端服务器之一(如 srv1.myapp.com)并在那里继续他的活动。

那么,我走的路正确吗?

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

答案1

将登录页面放在前端服务器上并重定向到后端服务器不是一个好主意。用户可能会将你的后端服务器加入书签,最终可能会导致分布不均,并且当服务器宕机时,如果用户处于同一会话中,他们仍会尝试访问该服务器。

你需要的是主动/被动(心跳/起搏器/IP 故障转移/DNS 故障转移)或主动/主动(DNS 循环/网络负载平衡) 前端服务器。

使用主动/被动模式,您的所有流量将被重定向到一个前端服务器,另一个服务器待命(热备)。当第一个服务器发生故障时,您可以通过某种方式进行故障转移(通过重新分配 IP 地址或修改 DNS*)以指向第二个服务器。

使用主动/主动,您将有两个(或更多)服务器始终处于活动状态,使用以太网DNS 循环或者IP/网络负载平衡在两者之间(大致)均匀地分配负载。然后,这两台服务器将再次将负载分配给您的后端服务器。

active/active 是大多数大型 Web 应用程序使用的方法(查看 Youtube/Google/Twitter/Wordpress.com/Tumblr 的 DNS 记录,它们将为服务器提供多个 IP 用于 DNS 循环。

一旦你做出了决定并付诸实施,你只需要在解决方案之间做出选择。我个人建议NGINX但每个人都有自己的偏好(HAProxy乌贼切诺基光速F5(硬件),思科(硬件)以及无数其他的东西)。

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

*如果可能的话,应该避免基于 DNS 的故障转移,一些客户端会将 DNS 缓存在其 TTL 之外,因此这并不理想。

答案2

我不了解 nginx,但你可以在主动/被动配置中配对几个 haproxy 负载均衡器,以防止 haproxy 成为单点故障。

也有商业解决方案,但由于某种原因,它们似乎没有在 serverfault 上引起太多关注。

相关内容