有没有办法找到属于Web应用程序集群的所有节点?我知道在JBoss上我可以使用HAServiceMBeanSupport获取有关所有节点(主机名,IP地址)的信息,但是如何在Tomcat,WebSpere,Glassfish,Oracle AS,Jetty,WebLogic上实现类似的功能? (Best将是一个适用于所有人的界面)
答案 0 :(得分:0)
据我所知,这取决于您的Applicationserver的功能。
这样做没有“标准之路”。
您可以尝试以下操作:
班级ServletContextListener有两种方法。您可以在create方法中计算主机名和IP地址,并删除destroy方法中的节点。
这种方式在VM崩溃期间出现问题,例如,不会调用destroy-method。
编辑: 您的软件需要数据库吗?如果是这样,则所有clusternodes都必须使用相同的数据库实例。如果您的应用程序在没有群集的情况下部署,则会使用“私有”数据库。您需要一个共享数据库:
表:NODES
主持人| IP
as1.cluster | < ip>
as2.cluster | < ip2>
如果只有onne行插入该DB,则没有集群。
但是,如果某个节点崩溃并且未从此表中删除其条目,则此表可能已损坏。
答案 1 :(得分:0)
对于您的要求,没有标准的插入式解决方案
从技术上讲,它可以通过多种方式实现 - 在Java生态系统内和外部Jgroups群集形成,Zookeeper或简单Redis或其他K / V服务器,其中每个服务器实例将在启动时注册并订阅群集组中的更改。
但是,支持和所需的努力会有所不同。一般的方法是使用一些启动钩子,例如Servlet容器初始化或EJB @Startup @Singleton
以联系拓扑发现服务(例如,您的redis服务器),提供有关您的实例的信息以及有关已经处于活动状态的其他实例的查询信息。如果您需要领导者选举,您可以使用许多算法,例如先到先得,或基于投票。然后,您需要订阅并主动监听拓扑中的更改,并可能提供某种健康指标 - 例如定期让其他人知道您的实例仍处于活动状态
总的来说,您能详细说明为什么您的应用需要了解相同类型的其他实例的知识吗?您是否需要Master选举或HA群集范围的单例功能?构建稳定可扩展解决方案的最佳实践是使应用程序保持无状态并且不知道扩展细节。
需要仅在此时按顺序或在单个节点上执行的功能可以被提取到专用服务中,例如,批量作业服务,调度服务等。
大多数JEE服务器供应商为此提供一些自定义解决方案,例如JBoss HASingleton服务或HA单例部署(应用程序将始终仅在群集中的单个实例上运行),它还负责故障转移。