我听说过像GlassFish这样的应用服务器以及Terracotta使用的术语“群集”;我试图理解 clustering 这个词在与应用服务器结合使用时的含义,以及与Terracotta一起使用的时候。
我的理解是:
如果GlassFish服务器是群集的,那么这意味着我们有多个物理/虚拟机,每个机器都有自己的JRE / JVM运行单独的GlassFish实例。但是,由于它们是群集的,因此它们都将通过其管理服务器(“DAS”)进行通信,并将相同的应用程序部署到所有这些服务器。它们将有效地(对最终用户而言)就像它们是单个应用服务器一样 - 但现在可以将负载平衡,故障转移/冗余和可扩展性添加到组合中。
Terracotta本质上是一种产品,可以在不同的物理/虚拟机上运行多个JVM,就像它们是一个JVM一样。
因此,如果我的理解是正确的,则隐含以下内容:
如果这些断言/假设中的任何一个是不真实的,请纠正我!如果我离开了基地并且显然不了解集群和/或兵马俑的目的,请指出我正确的方向!
答案 0 :(得分:4)
Terracotta使您可以在所有节点(其有状态)之间拥有共享状态。基本上它会在不同的JVM之间创建共享内存空间。当群集中的节点都需要访问相同的对象时,这非常有用。
如果您的应用程序是无状态的,并且您只需要负载平衡和故障转移,则可以使用JGroups之类的解决方案。在这种情况下,每个节点只处理请求,并且对其他节点几乎一无所知。内存中的对象不是跨节点共享的,每个JVM只是自己运行,并且不了解其他JVM。这通常适用于请求/响应类型的应用程序。例如,提供内容(没有会话)的网络服务器可以做到这一点。
处理无状态集群通常比处理有状态集群更简单。这是因为在无状态集群中,节点几乎不了解彼此,这导致可能出错的事情更少。
GlassFish位于上述概念的中间位置。 GlassFish内存中的对象对所有节点都是可见的。然而,前端(HTTP连接器)工作无状态。
所以回答你的问题:
1)是的,这是两个最明显的原因。然而,有时人们只想要故障转移或只想要负载平衡或有时两者兼而有之。并非所有群集解决方案都能解决这两个问题。
2)是的。从技术上讲,Terracotta只能解决共享内存部分,而不是CPU部分。但是,通过解决内存部分,它会自动解决CPU部分,因为您现在只需将JVM添加到共享内存空间。
3)我不知道这几乎是否可能,但作为思想实验;是。
答案 1 :(得分:3)
群集可能意味着以下之一:
你问的关于恕我直言的事实真的是#3,因为这是唯一一个真正的案例,其中Terracotta - 在高可用性聚类的背景下 - 将提供带有GlassFish的价值。 GlassFish已经提供了内置的高可用性,因此最好将Terracotta添加到解决方案中,因为它会使部署架构复杂化。
我可以考虑添加Terracotta的主要原因是您可能希望将会话管理卸载到数据网格并释放GlassFish以运行业务逻辑。这可能是由于更频繁的垃圾收集或想要为每个GlassFish实例管理更多用户。但是,我不确定Terracotta可以无缝地完成这项工作。使用GlassFish内置HA群集,复制会话是无缝的(无需修改应用程序逻辑)。您可能必须编写代码以从Terracotta缓存中获取/获取数据我将让您研究:-) Oracle GlassFish Server还与Coherence(无缝地)集成以解决此问题。您可以将会话管理分离为Coherence数据网格,而无需修改应用程序代码。
除非您事先知道您的应用程序必须扩展到大量并发用户,否则请从内置HA群集开始,运行测试,然后从那里开始。
希望这有帮助。