1

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

以下是我知道的常用选项和我的限制:

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

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

  3. 使应用程序无状态:听起来很诱人,尽管它有点工作。我很想听听一些设计指南和经验。

还有其他建议吗?

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

4

3 回答 3

2

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

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

仅当您不希望用户在一个实例下降时失去他们的会话时,这才有用。如果你真的想要这个,你将需要“持久会话”(但请注意,这会降低性能),Tomcat 提供了几种实现方式:

  1. 使用会话持久性并将会话保存到共享文件系统,
  2. 使用会话持久性并将会话保存到共享数据库,
  3. 使用内存复制。

这将需要一些真正的工作台,但就个人而言,内存复制是我的首选解决方案(最佳性能)。不惜一切代价避免序列化到数据库(根据我的经验,表现不佳)。

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

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

使应用程序无状态:听起来很诱人,尽管它有点工作。我很想听听一些设计指南和经验。

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


老实说,我不清楚您要达到的目标。您已经有了一个可扩展的解决方案(垂直和水平),没有单点故障(负载均衡器除外,但很好......),并且很少有应用程序(例如生命关键应用程序、金融应用程序)真正需要透明的容错(在换句话说,很多人可以没有)。此外,透明的容错在性能和/或硬件方面具有不可忽视的实际成本。因此,真正的问题是:当用户失去会话时,您的企业是否会损失那么多钱?有那么严重/频繁吗?这是否证明花钱实施透明容错是合理的?

于 2009-10-19T17:50:31.063 回答
2

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

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

要开始,请访问:http ://www.terracotta.org/web/display/orgsite/Web+Sessions

于 2009-10-25T19:14:23.883 回答
1

传统上,它是一个罕见的真正无状态的网络应用程序,尽管我猜在这些 Ajax 时代,将状态保留在浏览器中更为常见。

如果您的意图是使用集群,以便单个用户会话在服务器丢失后仍然存在,那么您将需要支付某种传输成本。你可能会:

  • 将所有内容保存在数据库中。也许序列化为一个blob。当会话超时时,您需要管理这些 blob。WebSphere 等应用服务器具有这种能力。
  • 使用某种内存-内存复制。再次,必须有一些转换/序列化成本。您可以权衡该复制的频率与丢失会话最近更新的可能性。

在任何一种情况下,您的目标都是“会话亲和性”:用户的请求默认转到同一个集群成员,实际上他们的“主”实例充当了直写缓存。

我不知道在您的环境中提供了哪些现成的东西,理想情况下,您的服务器提供商应该内置会话管理设施 - 您自己编写这些东西并非完全是微不足道的。

于 2009-10-19T16:23:19.820 回答