集群Java EE Web应用程序 - 选项?

时间:2009-10-19 16:03:18

标签: java-ee tomcat cluster-computing failover terracotta

我有一个Web应用程序部署到运行Apache,Tomcat和前面的负载均衡器的三台服务器上。现在我正在考虑将它们聚类。

以下是我所知道的常用选项和约束选项:

  1. 基于序列化的会话群集: 在我的例子中,应用程序在会话中使用了很多对象。所以我宁愿不采用这种解决方案。此外,在不久的将来,服务器的数量可能会增加到五个以上。

  2. 赤土: 听起来很有趣,但购买企业许可证不是一种选择。

  3. 使应用程序无状态: 听起来很诱人,虽然这是一项工作。我很想听听一些设计指南和经验。

  4. 还有其他任何建议吗?

    我的主要目标是故障转移。

3 个答案:

答案 0 :(得分:2)

我的理解是,您目前正在负载平衡3台服务器上的负载,因此,对我来说,您已经在进行集群(可扩展性部分),而且我不确定您的“集群”是什么意思。你的意思是通过透明的故障转移超越吗?

  

基于序列化的会话聚类:在我的例子中,应用程序在会话中使用了很多对象。所以我宁愿不采用这种解决方案。在不久的将来,服务器的数量可能会增加到五个以上。

仅当您不希望用户在一个实例丢失时松开其会话时,此选项才有用。如果你真的想要这个,你需要“持久会话”(但要注意这有性能成本),Tomcat提供several way来实现这个:

  1. 使用会话持久性并将会话保存到共享文件系统,
  2. 使用会话持久性并将会话保存到共享数据库
  3. 使用内存中复制。
  4. 这需要一些真正的工作台,但个人而言,内存复制是我的首选解决方案(最佳性能)。避免不惜任何代价序列化数据库(根据我的经验表现不佳)。

      

    Terracotta:听起来很有趣,但购买企业许可证不是一种选择。

    我猜你在这里指的是他们的JVM级集群解决方案。在应用程序下面集群JVM(与集群应用程序本身相比)是IMHO解决方案,当应用程序无法轻松集群时?但是,为什么要使用提供此类功能的应用程序服务器来执行此操作?

      

    使应用程序无状态:听起来很诱人,虽然这是一项工作。我很想听听一些设计指南和经验。

    您的意思是不使用HTTPSession吗?如果是,为什么?你在HTTPSession面临什么问题?你为什么要这样做?


    老实说,你想要达到的目标对我来说并不清楚。您已经拥有可扩展的解决方案(垂直和水平),没有单点故障(负载平衡器除外......),极少数应用程序(例如生命关键应用程序,财务应用程序)确实需要透明的容错(在换句话说,许多人可以没有生活)。此外,透明容错在性能和/或硬件方面具有不应忽视的实际成本。因此,真正的问题是:当用户失去会话时,您的企业是否会花掉那么多钱?这是关键/频繁吗?这是否有理由花钱实施透明的容错?

答案 1 :(得分:2)

  

Terracotta:听起来很有趣,但购买企业许可证不是一种选择。

Terracotta是开源的,因此您必须注意购买许可证。它为Web会话复制提供了非序列化方法,这正是您所要求的。

要开始使用,请转到此处:http://www.terracotta.org/web/display/orgsite/Web+Sessions

答案 2 :(得分:1)

传统上,它是一种罕见的网络应用程序,它是真正无状态的,但我想在这些Ajax时代,保持浏览器中的状态更为常见。

如果您的目的是使用群集,以便单个用户会话在服务器丢失后继续存在,那么您将需要支付某种转移成本。你可以:

  • 将所有内容保存在数据库中。也许序列化为blob。会话超时时,您需要保持这些blob。诸如WebSphere之类的应用服务器具有该功能。
  • 使用某种内存复制。再次,必须有一些转移/序列化成本。您可以将复制的频率与可能丢失最近更新的会话进行权衡。

在任何一种情况下,你的目标都是“会话亲和力”:用户的请求默认转到同一个集群成员,有效地,他们的“home”实例充当写入缓存。

我不知道你的环境中现成的是什么,理想情况下你的服务器提供商应该内置会话管理设施 - 写这些东西你自己并不是完全无足轻重的。