如何以编程的方式查找/列出J2EE应用程序集群中的所有节点?

7
有没有办法找到属于Web应用程序集群的所有节点?我知道在JBoss上,我可以使用HAServiceMBeanSupport获取有关所有节点(主机名、IP地址)的信息,但是如何在Tomcat、WebSpere、Glassfish、Oracle AS、Jetty、WebLogic上实现类似的功能呢?最好是一个适用于所有这些服务器的接口。
2个回答

1
你所要求的内容没有标准的即插即用解决方案。
从技术上讲,可以通过多种方式实现——包括在Java生态系统内部和外部,例如Jgroups集群形成、Zookeeper或简单的Redis或其他K / V服务器,每个服务器实例在启动时都会注册并订阅集群组中的更改。
然而,支持和所需的努力程度会有所不同。一般的方法是使用一些启动钩子,例如Servlet容器初始化或EJB @Startup @Singleton 来联系拓扑发现服务(例如您的redis服务器),提供有关您的实例的信息并查询已经激活的其他实例的信息。如果需要领导者选举,则可以使用许多算法,例如先到先得或基于投票。然后,您需要订阅并积极监听拓扑的更改,并可能提供某种健康度量-例如定期让其他人知道您的实例仍处于活动状态。
总体而言,您的应用程序为什么需要了解相同类型的其他实例?您需要主节点选举或HA集群范围的单例功能吗?构建稳定可扩展的解决方案的最佳实践是保持应用程序无状态且不知道缩放细节。

需要按顺序或仅在单个节点上执行的函数可以提取到专用服务中,例如批处理作业服务、调度器服务等。

大多数 JEE 服务器供应商都提供了一些自定义解决方案,例如 JBoss HASingleton 服务或 HA 单例部署(应用程序始终只在集群的单个实例上运行),同时还处理故障转移。


0
据我所知,这取决于您的应用服务器的能力。
没有“标准方法”来做到这一点。
您可以尝试以下内容:
ServletContextListener有两种方法。您可以在create方法中计算主机名和IP地址,并在destroy方法中删除节点。
这种方式在VM崩溃期间存在问题,例如destroy方法将不会被调用。
编辑: 您的软件是否需要数据库?如果是这样,则所有群集节点都必须使用相同的数据库实例。如果您的应用程序在没有集群的情况下部署,则使用“私有”数据库。您需要一个共享的数据库:

表:NODES


HOST| IP


as1.cluster | < ip >

as2.cluster | < ip2 >

如果只插入了一行到该DB中,则没有集群。

但是,如果节点崩溃并且没有从此表中删除其条目,则可能会损坏此表。

嗯,但是应用程序如何检测到它是否在集群中呢?假设您将应用程序部署在两台不在集群中运行的计算机上。无论如何,我在寻找适用于应用服务器的特定解决方案时遇到了问题... - Zak_Rhol
如果它们在集群中运行,则必须共享相同的数据库(如果使用数据库)。如果它们在不同的集群或作为单个应用服务器运行,则应使用不同的数据库。如果您可以使用EJB 3.1(?),则有一个集群范围的Singleton-Bean。 - Christian Kuetbach
问题在于应用程序可以部署在集群中,但不必要。目前我不知道当构建应用程序归档时是否已经是集群状态,所以我尝试在应用程序运行时检测它是否处于集群状态。如果这样做不可能,那么我们必须为集群应用程序制定不同的配置/设置(实际上我们不希望这样做,因为这需要我们的客户进行更多的配置)。 - Zak_Rhol
好的,这个解决方法是一个想法,但正如你所提到的,没有一些额外的观察服务是不可靠的。我的团队和我将检查什么最适合我们的需求(也许是一些单例服务)。感谢你的想法。 - Zak_Rhol
SingletonServices?你使用EJB 3.1吗?据我所知,在3.1之前的任何EJB标准中都不存在像“Clusterwide-Singleton”这样的东西。 - Christian Kuetbach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接