3

我听说过用于 GlassFish 等应用程序服务器以及 Terracotta 的术语“集群”;我试图理解集群一词在与应用程序服务器一起使用时以及与 Terracotta 一起使用时意味着什么。

我的理解是:

如果 GlassFish 服务器是集群的,那么这意味着我们有多个物理/虚拟机,每个都有自己的 JRE/JVM,运行不同的 GlassFish 实例。但是,由于它们是集群的,它们都将通过它们的管理服务器(“DAS”)进行通信,并为所有这些服务器部署相同的应用程序。它们将有效地发挥作用(对最终用户),就好像它们是单个应用程序服务器一样——但现在将负载平衡、故障转移/冗余和可伸缩性添加到组合中。

从本质上讲,Terracotta 是一种产品,它可以让多个 JVM 在不同的物理/虚拟机上运行,​​就好像它们是单个 JVM 一样。

因此,如果我的理解是正确的,则暗示以下内容:

  • 当您需要负载平衡和故障转移容错时,您可以集群应用程序服务器
  • 当任何特定的 JVM 太小而无法容纳您的应用程序并且您需要更多“马力”时,您可以使用 Terracotta
  • 因此,从技术上讲,如果您有一个由 5 个服务器实例组成的 GlassFish 集群;这 5 个实例中的每一个实际上都可以是 Terracotta 实例的数组/集群;这意味着每个 GlassFish 服务器实例实际上是一个 GlassFish 实例,存在于多台机器本身的 JVM 中

如果这些断言/假设中的任何一个不正确,请纠正我!如果我偏离了基础并且显然不了解集群和/或 Terracotta 的目的,请指出我正确的方向!

4

2 回答 2

4

Terracotta 使您能够在所有节点之间共享状态(它是有状态的)。基本上,它在不同的 JVM 之间创建了一个共享内存空间。当集群中的节点都需要访问相同的对象时,这很有用。

如果您的应用程序是无状态的,并且您只需要负载平衡和故障转移,您可以使用JGroups 之类的解决方案。在这种情况下,每个节点只处理请求,而对其他节点知之甚少。内存中的对象不是跨节点共享的,每个 JVM 只是独立运行,不知道其他 JVM。这通常适用于请求/响应类型的应用程序。例如,提供内容(没有会话)的网络服务器会执行此操作。

处理无状态集群通常比处理有状态集群更简单。这是因为在无状态集群中,节点彼此几乎一无所知,这导致出错的事情更少。

GlassFish 位于上述概念的中间位置。GlassFish 内存中的对象对所有节点都是可见的。但是前端(HTTP 连接器)是无状态的。

所以回答你的问题:

1)是的,这是两个最明显的原因。然而,有时人们只想要故障转移或只想要负载平衡或有时两者兼而有之。并非所有集群解决方案都能解决这两个问题。

2) 是的。虽然从技术上讲,Terracotta 只解决了共享内存部分,而不是 CPU 部分。但是,通过解决内存部分,它会自动解决 CPU 部分,因为您现在只需将 JVM 添加到共享内存空间即可。

3)我不知道这是否可行,但作为一个思想实验;是的。

于 2012-05-19T22:36:16.033 回答
3

聚类可能意味着以下之一:

  1. 多个实例可以作为一个进行管理。将应用程序部署到集群,它会部署到集群中的所有实例。进行配置更改,该更改将推送到集群中的所有节点。GlassFish 开箱即用地支持这一点。
  2. 服务可用性。如果任何一个实例失败,则该应用程序在另一个实例上可用。如果不启用高可用性,任何实例故障也会导致该实例管理的任何会话的会话丢失。GlassFish 开箱即用地支持这一点。
  3. 高可用性。如果任何一个实例发生故障,则该应用程序在另一个实例上可用,并且不会丢失会话,因为会话副本也在另一个实例上维护。GlassFish 支持这一点。您必须在任何一个集群中选择 #2 或 #3。

您对恕我直言的问题确实是#3,因为这是唯一真实的案例,Terracotta - 在高可用性集群的背景下 - 将提供带有 GlassFish 的价值。GlassFish 已经提供了内置的高可用性,因此最好有充分的理由将 Terracotta 添加到解决方案中,因为它会使部署架构复杂化。

我能想到添加 Terracotta 的主要原因是您可能希望将会话管理卸载到数据网格并释放 GlassFish 以运行业务逻辑。这可能是由于更频繁的垃圾收集或希望每个 GlassFish 实例管理更多用户。但是,我不确定 Terracotta 是否可以无缝地做到这一点。使用 GlassFish 内置 HA 集群,复制会话是无缝的(无需修改应用程序逻辑)。您可能需要编写代码来从 Terracotta 缓存中放置/获取数据,我会让您研究 :-) Oracle GlassFish Server 还(无缝)与 Coherence 集成以解决这个问题。您可以将会话管理分离到 Coherence 数据网格中,而无需修改应用程序代码。

除非您事先知道您的应用程序必须扩展到大量并发用户,否则请从内置 HA 集群开始,运行测试,然后从那里开始。

希望这可以帮助。

于 2012-05-21T00:25:14.113 回答