Sun Java System Application Server 9.1 高可用性管理指南

第 9 章 配置高可用性会话持久性和故障转移

本章介绍了如何启用和配置高可用性会话持久性。

会话持久性和故障转移概述

Application Server 通过 HTTP 会话数据和有状态会话 Bean (StateFul Session Bean, SFSB) 会话数据的故障转移提供高可用性会话持久性。故障转移意味着如果服务器实例或硬件发生故障,另一个服务器实例将接管分布式会话。

要求

分布式会话可以在多个 Sun Java System Application Server 实例中运行,如果:

限制

会话故障转移时,将丢失所有对打开文件或网络连接的引用。编码应用程序时必须考虑到此限制。

您只能将某些对象绑定到支持故障转移的分布式会话中。与 Servlet 2.4 规范不同,如果将不支持故障转移的对象类型绑定到分布式会话中,Sun Java System Application Server 不会抛出 IllegalArgumentException

您可以将以下对象绑定到支持故障转移的分布式会话中:

您不能将以下对象类型绑定到支持故障转移的会话中:

对于这些对象,故障转移通常不起作用。但是,在某些情况下故障转移也可能发挥作用,例如,如果对象为可序列化对象。

设置高可用性会话持久性

本节介绍了如何设置高可用性会话持久性,其中包括以下主题:

Procedure设置高可用性会话持久性

开始之前

高可用性会话持久性与动态部署、动态重新装入和自动部署不兼容。这些功能适用于开发环境而不适用于生产环境,因此您必须在启用 HA 会话持久性之前禁用它们。有关如何禁用这些功能的信息,请参见《Sun Java System Application Server 9.1 Application Deployment Guide 》

  1. 创建 Application Server 群集。

    有关更多信息,请参见创建群集

  2. 如果要使用 HADB 存储会话状态数据,请为群集创建 HADB 数据库。


    注 –

    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 管理指南》中的“用法配置文件”


    如果要将群集中其他服务器上的内存中复制用于会话状态数据,请省略此步骤。

    有关创建 HADB 数据库的更多信息,请参见 configure-ha-cluster(1)

  3. 为群集设置 HTTP 负载平衡。

    有关更多信息,请参见设置 HTTP 负载平衡

  4. 启用所需的应用程序服务器实例和 Web 或 EJB 容器的可用性。

    然后配置会话持久性设置。选择以下方法之一:

  5. 重新启动群集中的每个服务器实例。

    如果实例当前正在处理请求,请在重新启动该实例前停止它,这样,它就有足够的时间来处理它正在处理的请求。有关更多信息,请参见禁用(停止)服务器实例或群集

  6. 启用所有特定 SFSB 所必需的可用性。

    选择需要进行会话状态检查点操作的方法。请参见为单个 Bean 配置可用性

  7. 如果要使每个 Web 模块具有高可用性,请使这些模块可分布。

  8. 部署期间启用各个应用程序、Web 模块或 EJB 模块的可用性。

    请参见为单个应用程序或 EJB 模块配置可用性

    在管理控制台中,选中“启用高可用性”框,或结合使用 asadmin deploy 命令和设置为 true--availabilityenabled 选项。

启用会话可用性

您可以启用五个不同范围(从最高到最低)的会话可用性:

  1. 服务器实例,默认情况下已启用。启用服务器实例的会话可用性意味着此服务器实例上运行的所有应用程序都会具有高可用性会话持久性。有关说明,请参见下一节启用服务器实例的可用性

  2. 容器(Web 或 EJB),默认情况下已启用。有关启用容器级别的可用性的信息,请参见:

  3. 应用程序,默认情况下已禁用。

  4. 独立的 Web 或 EJB 模块,默认情况下已禁用。

  5. 单个 SFSB,默认情况下已禁用。

要启用指定范围内的可用性,您必须同时启用所有更高级别的可用性。例如,要启用应用程序级别的可用性,必须在服务器实例级别和容器级别启用可用性。

给定级别的默认值是其上一级别的设置值。例如,如果已启用容器级别的可用性,则默认情况下,启用应用程序级别的可用性。

如果禁用了服务器实例级别的可用性,则启用其他任何级别的可用性都不生效。如果启用了服务器实例级别的可用性,则将启用所有级别的可用性,除非已明确禁用。

启用服务器实例的可用性

要启用服务器实例的可用性,请使用 asadmin set 命令将配置的 availability-service.availability-enabled 属性设置为 true。

例如,如果 config1 为配置名称:


asadmin set --user admin --passwordfile password.txt 
--host localhost 
--port 4849 
config1.availability-service.availability-enabled="true"

Procedure使用管理控制台启用服务器实例的可用性

  1. 在树组件中,展开“配置”节点。

  2. 展开要编辑的配置的节点。

  3. 选择“可用性服务”节点。

  4. 在“可用性服务”页面中,选中“可用性服务”框以启用实例级别的可用性。

    要禁用可用性,请取消选中该框。

    此外,如果更改了用于连接 HADB 的 JDBC 资源以获得会话持久性,您还可以更改存储池名称。有关详细信息,请参见 configure-ha-cluster(1)


    注 –

    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 管理指南》中的“用法配置文件”


  5. 单击“保存”按钮。

  6. 停止并重新启用服务器实例。

HTTP 会话故障转移

Java EE 应用程序通常具有大量会话状态数据。Web 购物车是一个典型的会话状态示例。此外,应用程序可以高速缓存会话对象中需要频繁使用的数据。事实上,几乎带有重要用户交互的所有应用程序都需要维护会话状态。

为 Web 容器配置可用性


注 –

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 管理指南》中的“用法配置文件”


如果要使用 HADB,请通过 asadmin configure-ha-persistence 启用和配置 Web 容器可用性。有关此命令的更多信息,请参见 configure-ha-persistence(1)

或者,使用 asadmin set 命令将配置的 availability-service.web-container-availability.availability-enabled 属性设置为 true,然后使用 configure-ha-persistence 根据需要设置属性。


注 –

如果要使用内存中复制来存储会话状态数据,必须使用 asadmin set 命令启用 Web 容器可用性和设置属性。configure-ha-persistence 命令只能与 HADB 一起使用。


例如,按如下所示使用 set 命令,其中 config1 为配置名称:


asadmin set --user admin --passwordfile password.txt 
--host localhost --port 4849 
config1.availability-service.web-container-availability.availability-enabled="true"
asadmin configure-ha-persistence --user admin --passwordfile secret.txt 
--type ha 
--frequency web-method 
--scope modified-session 
--store jdbc/hastore 
--property maxSessions=1000:reapIntervalSeconds=60 cluster1

Procedure使用管理控制台启用 Web 容器的可用性

  1. 在树组件中,选择所需配置。

  2. 单击“可用性服务”。

  3. 选择“Web 容器可用性”选项卡。

    选中“可用性服务”框以启用可用性。要禁用可用性,请取消选中该框。

  4. 更改其他设置,如下一节可用性设置所述。

  5. 重新启动服务器实例。

可用性设置


注 –

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 管理指南》中的“用法配置文件”


通过“可用性服务”的“Web 容器可用性”选项卡,您可以更改这些可用性设置:

持久性类型指定已启用可用性的 Web 应用程序的会话持久性机制。允许的值有 memory(无持久性)、file(文件系统)、replicated(其他服务器上的内存)和 ha (HADB)。

在使用 ha 会话持久性之前,必须先配置和启用 HADB。有关配置的详细信息,请参见 configure-ha-cluster(1)

如果已启用 Web 容器可用性,则默认的持久性类型取决于配置文件,如下表所示。

配置文件 

持久性类型 

开发者 

memory

群集 

replicated

企业 

ha

对于需要会话持久性的生产环境,请使用 hareplicatedmemory 持久性类型和 file 持久性类型不提供高可用性会话持久性。

如果已禁用 Web 容器可用性,则默认的持久性类型是 memory

持久性频率:指定存储会话状态的频率。仅当持久性类型为 hareplicated 时适用。允许的值包括:

持久性范围:指定会话对象的数目和存储会话状态的频率。仅当持久性类型为 hareplicated 时适用。允许的值包括:

单点登录状态:选中此框以启用单点登录状态的持久性。要禁用可用性,请取消选中该框。有关更多信息,请参见结合使用会话故障转移和单点登录

HTTP 会话存储:如果更改了用于连接 HADB 的 JDBC 资源以获得会话持久性,您可以更改 HTTP 会话存储。有关详细信息,请参见 configure-ha-cluster(1)

为单个 Web 应用程序配置可用性

要启用和配置单个 Web 应用程序的可用性,请编辑应用程序部署描述符文件 sun-web.xml。应用程序的部署描述符中的设置将覆盖 Web 容器的可用性设置。

session-manager 元素的 persistence-type 属性用于确定应用程序使用的会话持久性的类型。必须将其设置为 hareplicated 以启用高可用性会话持久性。

有关 sun-web.xml 文件的更多信息,请参见《Sun Java System Application Server 9.1 Application Deployment Guide》中的“The sun-web.xml File”

示例

<sun-web-app> ... 
  <session-config> 
    <session-manager persistence-type=ha> 
      <manager-properties> 
        <property name=persistenceFrequency value=web-method /> 
      </manager-properties> 
      <store-properties> 
        <property name=persistenceScope value=session /> 
      </store-properties> 
    </session-manager> ... 
</session-config> ...

结合使用会话故障转移和单点登录

在单个应用程序服务器实例中,如果一个应用程序验证了用户,则运行在同一个实例上的其他应用程序不会对用户进行重新验证。这称为单点登录。有关更多信息,请参见《Sun Java System Application Server 9.1 Developer’s Guide》中的“User Authentication for Single Sign-on”

为了使 HTTP 会话故障转移到群集中另一个实例后该功能仍然可用,必须将单点登录信息保留在 HADB 中。要保留单点登录信息,请首先启用服务器实例和 Web 容器的可用性,然后启用单点登录状态故障转移。


注 –

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 管理指南》中的“用法配置文件”


可以通过管理控制台在“可用性服务”的“Web 容器可用性”选项卡中启用单点登录状态故障转移,如为 Web 容器配置可用性中所述。也可以使用 asadmin set 命令将配置的 availability-service.web-container-availability.sso-failover-enabled 属性设置为 true。

例如,按如下所示使用 set 命令,其中 config1 为配置名称:

asadmin set --user admin --passwordfile password.txt 
--host localhost --port 4849 
config1.availability-service.web-container-availability.
sso-failover-enabled="true"

单点登录组

可以通过单个名称和密码的组合进行访问的应用程序组成了单点登录组。对于与应用程序(是单点登录组的一部分)相对应的 HTTP 会话,如果其中一个会话超时,其他会话并不会失效,并且仍然可用。这是因为一个会话的超时不应影响其他会话的可用性。

作为这个行为的推论,如果一个会话超时并且您尝试从运行该会话的同一浏览器窗口访问相应的应用程序,则您无需再次进行验证。但是,将创建一个新的会话。

以属于含有其他两个应用程序的单点登录组的购物车应用程序为例。假设其他两个应用程序的会话超时值大于购物车应用程序的会话超时值。如果购物车应用程序的会话超时,并且您尝试从运行该会话的同一浏览器窗口运行购物车应用程序,则您无需再次进行验证。但是,前一个购物车将丢失,并且您必须创建一个新的购物车。即使运行购物车应用程序的会话已超时,其他两个应用程序也会继续照常运行。

类似地,可假定与其他两个应用程序中的任何一个应用程序对应的会话超时。当从运行该会话的同一浏览器窗口连接应用程序时,您无需再次进行验证。


注 –

此行为仅适用于会话超时情况。如果启用了单点登录,并且您使用 HttpSession.invalidate() 令其中一个会话失效,则属于单点登录组的所有应用程序的会话都将失效。如果您尝试访问属于单点登录组的任一应用程序,则需要再次进行验证,系统将为访问该应用程序的客户机创建一个新的会话。


有状态会话 Bean 故障转移

有状态会话 Bean (SFSB) 包含特定于客户机的状态。客户机和有状态会话 Bean 之间存在一对一关系。创建时,EJB 容器赋予每个 SFSB 唯一的会话 ID,以便将其绑定到客户机。

服务器实例出现故障时,SFSB 的状态可以保存在持久性存储中。在 SFSB 的生命周期中,其预定义点处的状态将被保存到持久性存储库中。这称为检查点操作。如果已启用,通常会在 Bean 完成了任意事务之后(即使该事务回滚)执行检查点操作。

但是,如果 SFSB 参与了 Bean 管理的事务,则该事务可能会在 Bean 方法执行的中间就被提交。由于 Bean 的状态可能因方法调用而发生转换,因此这不是对 Bean 的状态进行检查点操作的适当时间。在此情况下,EJB 容器将在相应方法结束时对 Bean 的状态进行检查点操作,前提是当该方法结束时,该 Bean 不在另一个事务的范围内。如果 Bean 管理的事务涉及多个方法,则检查点操作将被延迟,直至在后继方法结束时没有活动的事务。

SFSB 的状态并不一定具有事务性,并且可能因非事务性业务方法而被显著修改。如果某个 SFSB 出现这种情况,则您可以指定一系列检查点方法,如指定对其执行检查点操作的方法所述。

如果可分布的 Web 应用程序引用了 SFSB,并且 Web 应用程序的会话发生故障转移,则 EJB 引用也将进行故障转移。

如果停止 Application Server 实例时取消部署使用会话持久性的 SFSB,则持久性存储中的会话数据可能不被清除。要避免这种情况,请在运行 Application Server 实例时取消部署 SFSB。

为 EJB 容器配置可用性

Procedure启用 EJB 容器的可用性

  1. 选择“EJB 容器可用性”选项卡。

  2. 选中“可用性服务”框。

    要禁用可用性,请取消选中该框。

  3. 更改其他设置,如可用性设置中所述。

  4. 单击“保存”按钮。

  5. 重新启动服务器实例。

等效的 asadmin 命令

要启用 EJB 容器的可用性,请使用 asadmin set 命令设置以下三个配置属性:

例如,如果 config1 为配置名称,请使用以下命令:

asadmin set --user admin --passwordfile password.txt --host localhost --port 4849config1.availability-service.ejb-container-availability.availability-enabled="true"

asadmin set --user admin --passwordfile password.txt --host localhost --port 4849config1.availability-service.ejb-container-availability.sfsb-persistence-type="file"

asadmin set --user admin --passwordfile password.txt --host localhost --port 4849config1.availability-service.ejb-container-availability.sfsb-ha-persistence-type="ha"

可用性设置


注 –

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 管理指南》中的“用法配置文件”


通过“可用性服务”的“EJB 容器可用性”选项卡,您可以更改这些设置:

HA 持久性类型:为已启用可用性的 SFSB 指定会话持久性和钝化机制。允许的值有 file(文件系统)、replicated(其他服务器上的内存)和 ha (HADB)。默认值是 ha。对于需要会话持久性的生产环境,请使用 hareplicated

SFSB 持久性类型:为尚未启用可用性的 SFSB 指定钝化机制。允许的值有 file(默认值)、replicated ha

如果将任一持久性类型设置为 file,EJB 容器都将指定用于存储已钝化的会话 Bean 状态的文件系统位置。文件系统的检查点操作对于测试很有用,但不适用于生产环境。有关配置存储属性的信息,请参见管理控制台联机帮助。

HA 持久性可以允许服务器实例的群集在任何服务器实例出现故障时恢复 SFSB 状态。HADB 还可以用作钝化和活化存储。在要求 SFSB 状态持久性的生产环境中使用此选项。有关更多信息,请参见 configure-ha-cluster(1)

SFSB 存储池名称:如果更改了用于连接 HADB 的 JDBC 资源以获得会话持久性,您可以更改 SFSB 存储池名称。有关详细信息,请参见 configure-ha-cluster(1)

在禁用可用性时配置 SFSB 会话存储

如果已禁用可用性,本地文件系统将用于 SFSB 状态钝化而非持久性。要更改 SFSB 状态的存储位置,请更改 EJB 容器中的“会话存储位置”设置。有关配置存储属性的信息,请参见管理控制台联机帮助。

为单个应用程序或 EJB 模块配置可用性

您可以在部署期间启用单个应用程序或 EJB 模块的 SFSB 可用性:

为单个 Bean 配置可用性

要为单个 SFSB 启用可用性并选择执行检查点操作的方法,请使用 sun-ejb-jar.xml 部署描述符文件。.

要启用高可用性会话持久性,请在 ejb 元素中设置 availability-enabled="true"。要控制 SFSB 高速缓存的大小和行为,请使用以下元素:

有关 sun-ejb-jar.xml 的更多信息,请参见《Sun Java System Application Server 9.1 Application Deployment Guide》中的“The sun-ejb-jar.xml File”


示例 9–1 已启用可用性的 EJB 部署描述符示例

<sun-ejb-jar>
    ...
    <enterprise-Beans>
        ...
        <ejb availability-enabled="true">
            <ejb-name>MySFSB</ejb-name>
        </ejb>
        ...
    </enterprise-Beans>
</sun-ejb-jar>

指定对其执行检查点操作的方法

如果已启用,通常会在 Bean 完成了任意事务之后(即使该事务回滚)执行检查点操作。要指定非事务性业务方法(导致对 Bean 状态的重要修改)结束时 SFSB 的其他可选检查点操作,请使用 sun-ejb-jar.xml 部署描述符文件的 ejb 元素中的 checkpoint-at-end-of-method 元素。

checkpoint-at-end-of-method 元素中的非事务性方法可以是:


注 –

如果 SFSB 没有参与任何事务,并且没有在 checkpoint-at-end-of-method 元素中明确指定其任何方法,则将不对 Bean 的状态进行检查点操作(即使对于此 Bean,已设置 availability-enabled="true")。

请指定方法的较小子集以获得更好的性能。方法应完成大量工作或导致对 Bean 状态的重要修改。



示例 9–2 指定方法检查点操作的 EJB 部署描述符示例

<sun-ejb-jar>
    ...
    <enterprise-Beans>
        ...
        <ejb availability-enabled="true">
            <ejb-name>ShoppingCartEJB</ejb-name>
            <checkpoint-at-end-of-method>
                <method>
                    <method-name>addToCart</method-name>
                </method>
            </checkpoint-at-end-of-method>
        </ejb>
        ...
    </enterprise-beans>
</sun-ejb-jar>