App Server群集与Terracotta

时间:2012-05-19 17:16:26

标签: java glassfish cluster-computing terracotta

我听说过像GlassFish这样的应用服务器以及Terracotta使用的术语“群集”;我试图理解 clustering 这个词在与应用服务器结合使用时的含义,以及与Terracotta一起使用的时候。

我的理解是:

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

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

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

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

如果这些断言/假设中的任何一个是不真实的,请纠正我!如果我离开了基地并且显然不了解集群和/或兵马俑的目的,请指出我正确的方向!

2 个答案:

答案 0 :(得分:4)

Terracotta使您可以在所有节点(其有状态)之间拥有共享状态。基本上它会在不同的JVM之间创建共享内存空间。当群集中的节点都需要访问相同的对象时,这非常有用。

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

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

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

所以回答你的问题:

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

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

3)我不知道这几乎是否可能,但作为思想实验;是。

答案 1 :(得分:3)

群集可能意味着以下之一:

  1. 可以将多个实例作为一个实例进行管理。将应用程序部署到群集,它将部署到群集中的所有实例。进行配置更改,该更改将推送到群集中的所有节点。 GlassFish支持开箱即用。
  2. 服务可用性。如果任何一个实例失败,则该应用程序在另一个实例上可用。如果未启用高可用性,则任何实例故障也会导致该实例管理的任何会话的会话丢失。 GlassFish支持开箱即用。
  3. 高可用性。如果任何一个实例失败,则该应用程序在另一个实例上可用,没有会话丢失,因为会话副本也在另一个实例上维护。 GlassFish支持这一点。您必须在任何一个群集中选择#2或#3。
  4. 你问的关于恕我直言的事实真的是#3,因为这是唯一一个真正的案例,其中Terracotta - 在高可用性聚类的背景下 - 将提供带有GlassFish的价值。 GlassFish已经提供了内置的高可用性,因此最好将Terracotta添加到解决方案中,因为它会使部署架构复杂化。

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

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

    希望这有帮助。