Application Server 通过以下子组件和功能提供高可用性:
负载平衡器插件接受 HTTP/HTTPS 请求, 然后将请求转发至群集中的应用程序服务器实例。如果实例出现故障,变得不可用(由于网络故障)或无法响应,负载平衡器会将请求重定向至现有的可用计算机。负载平衡器还可识别故障实例何时恢复并相应地重新分布负载。Application Server 提供了用于 Sun Java System Web Server 和 Apache Web Server 以及 Microsoft Internet Information Server 的负载平衡器插件。
负载平衡器通过在多台物理计算机中分布工作量来提高系统的整体吞吐量。它还可通过对 HTTP 请求的故障转移提供更高的可用性。对于要保留的 HTTP 会话信息,必须配置 HTTP 会话持久性。
对于简单的无状态应用程序,负载平衡群集可能足够了。但是,对于具有会话状态的重点应用程序,请将负载平衡群集与 HADB 一起使用。
参与负载平衡的服务器实例和群集具有同构环境。通常,这意味着服务器实例均引用相同的服务器配置、可以访问相同的物理资源,以及具有部署到其上的相同的应用程序。同构环境确保了在出现故障前后,负载平衡器可以始终在群集中的活动实例之间平均分布负载。
有关配置负载平衡和故障转移的信息,请参见第 5 章,配置 HTTP 负载平衡。
通过存储会话状态数据,可以在群集中的服务器实例故障转移后恢复会话状态。恢复会话状态可使会话继续进行而不会丢失信息。Application Server 为 HTTP 会话和有状态会话 Bean 数据提供了以下类型的高可用性存储:
群集中其他服务器上的内存中复制
高可用性数据库
其他服务器上的内存中复制提供会话状态数据的轻量存储,而无需获取单独的数据库(如 HADB)。此类型的复制可使用其他服务器上的内存来实现 HTTP 会话和有状态会话 Bean 数据的高可用性存储。群集服务器实例在环形拓扑中复制会话状态。每个备份实例均在内存中存储复制数据。通过在其他服务器上的内存中复制会话状态数据,可以分布会话。
使用内存中复制要求启用组管理服务 (Group Management Service, GMS)。有关 GMS 的更多信息,请参见组管理服务。
如果群集中的服务器实例位于不同的计算机上,请确保满足以下先决条件:
要确保 GMS 和内存中复制正常工作,这些计算机必须在同一子网上。
要确保内存中复制正常工作,必须同步群集中所有计算机上的系统时钟使其尽可能接近。
HADB 软件随 Sun Java System Application Server 的 Application Server 独立分发提供。有关 Sun Java System Application Server 的可用分发的信息,请参见《Sun Java System Application Server 9.1 Installation Guide》中的“Distribution Types and Their Components”。HADB 功能仅在企业配置文件中可用。有关配置文件的信息,请参见《Sun Java System Application Server 9.1 管理指南》中的“用法配置文件”。
Application Server 提供了高可用性数据库 (High Availability Database, HADB),以实现 HTTP 会话和有状态会话 Bean 数据的高可用性存储。HADB 旨在通过负载平衡、故障转移和状态恢复等功能支持高达 99.999% 的服务和数据可用性。通常,您必须独立于 Application Server 来配置和管理 HADB。
不让 Application Server 承担状态管理职责会具有很多好处。Application Server 实例在它们的周期中作为可伸缩高性能应用程序容器执行,将状态复制委托给外部高可用性状态服务。由于采用这种松散耦合的体系结构,因此可以很轻松地向群集中添加 Application Server 实例或从群集中删除 Application Server 实例。HADB 状态复制服务可以单独伸缩,以获得最佳的可用性和性能。如果 Application Server 实例同时还执行复制任务,Java EE 应用程序的性能将会降低,并会受到较长的垃圾收集暂停的限制。
有关规划和设置应用服务器安装(包括确定硬件配置、调整大小和拓扑)以通过 HADB 实现高可用性的信息,请参见《Sun Java System Application Server 9.1 部署规划指南》中的“Planning for Availability”和《Sun Java System Application Server 9.1 部署规划指南》中的第 3 章 “选择拓扑”。
群集是作为一个逻辑实体一起工作的 Application Server 实例的集合。群集为一个或多个 Java EE 应用程序提供了运行时环境。高可用性群集将状态复制服务与群集和负载平衡器集成在一起。
使用群集具有以下优点:
高可用性(通过允许为群集中的服务器实例提供故障转移保护来实现)。如果一个服务器实例出现故障,其他服务器实例将接管该服务器实例正在服务的请求。
可伸缩性(通过允许向群集中添加服务器实例从而增加系统的容量来实现)。负载平衡器插件会将请求分布到群集中的可用服务器实例。当管理员向群集中添加更多服务器实例时,无需中断服务。
群集中的所有实例具有以下特性:
引用相同的配置。
具有相同的一组已部署应用程序(例如,Java EE 应用程序 EAR 文件、Web 模块 WAR 文件或 EJB JAR 文件)。
具有相同的一组资源,因此具有相同的 JNDI 名称空间。
域中的每一个群集都具有唯一的名称;此外,该名称在所有节点代理名称、服务器实例名称、群集名称和配置名称中也必须是唯一的。此名称不能为 domain。您在群集上执行的操作与在非群集服务器实例上执行的操作相同(例如,部署应用程序和创建资源)。
群集的设置源自该群集可能与其他群集共享的命名配置。其配置不能被其他服务器实例或群集所共享的群集可视为具有独立配置。默认情况下,此配置的名称为 cluster_name-config,其中 cluster_name 表示群集的名称。
能与其他群集或实例共享其配置的群集可视为具有共享配置。
群集、服务器实例、负载平衡器和会话的相互关系如下:
服务器实例不需要属于群集。但是,不属于群集的实例无法通过将会话状态从一个实例转移到其他实例来利用高可用性。
群集中的服务器实例可以由一台或多台计算机托管。您可以将不同计算机上的服务器实例组织为一个群集。
特定负载平衡器可以向多个群集中的服务器实例转发请求。您可以使用负载平衡器的此功能来执行联机升级,而不使服务受到损失。有关更多信息,请参见“配置群集”一章中的“使用多个群集进行联机升级而不使服务受到损失”。
一个群集可以从多个负载平衡器接收请求。如果群集由多个负载平衡器提供服务,则必须以完全相同的方式在每个负载平衡器上配置群集。
每个会话都依赖于特定的群集。因此,尽管您可以在多个群集上部署一个应用程序,但是会话故障转移将只能在单个群集中实现。
因此,对于群集中的服务器实例,群集充当的是会话故障转移的安全边界。在 Application Server 中,您可以使用负载平衡器和升级组件,而不使服务受到任何损失。