Sun Java System Application Server Enterprise Edition 8.1 2005Q2 高可用性管理指南

第 10 章 RMI-IIOP 负载平衡和故障转移

本章介绍如何通过 RMI-IIOP 使用 Sun Java System Application Server 的高可用性功能获得远程 EJB 引用和 JNDI 对象。

概述

利用 RMI-IIOP 负载平衡,IIOP 客户机请求可分布到不同的服务器实例或名称服务器。目标是将负载平均分布在群集中,从而提供可伸缩性。与 EJB 群集和可用性结合的 IIOP 负载平衡还可提供 EJB 故障转移。

客户机执行某个对象的 JNDI 查找时,命名服务会创建一个与特定服务器实例关联的 InitialContext (IC) 对象。从此时起,使用该 IC 对象进行的所有查找请求都会发送给相同的服务器实例。使用该 InitialContext 查找的所有 EJBHome 对象都托管在相同的目标服务器上。此后获得的所有 Bean 引用也创建在相同的目标主机上。这就有效地提供了负载平衡,原因是所有客户机都在创建 InitialContext 对象时随机使用动态目标服务器的列表。如果目标服务器实例发生故障,查找或 EJB 方法调用会将故障转移到另一个服务器实例。

IIOP 负载平衡和故障转移将透明地发生。在应用程序部署过程中无需特殊的步骤。但是,向群集添加或删除新实例将不会更新该群集的现有客户机视图。为此,必须在客户机端手动更新端点列表。

要求

Sun Java System Application Server Enterprise Edition 通过 RMI-IIOP 提供远程 EJB 引用和 NameService 对象的高可用性,前提是满足以下所有条件:

对于访问 Application Server 上部署的 EJB 组件的以下 RMI-IIOP 客户机,Application Server 支持其负载平衡。


注 –

Application Server 不支持通过安全套接字层 (Secure Socket Layer, SSL) 进行 RMI-IIOP 负载平衡和故障转移。


算法

Application Server 使用随机算法和 round robin 算法进行 RMI-IIOP 负载平衡和故障转移。

在 RMI-IIOP 客户机首次创建新的 InitialContext 对象时,可用的 Application Server IIOP 端点的列表对于该客户机是随机的。对于该 InitialContext 对象,负载平衡器会将查找请求和其他 InitialContext 操作定向至随机列表中的第一个端点。如果第一个端点不可用,则使用列表中的第二个端点,依此类推。

随后每次客户机创建新的 InitialContext 对象时,将轮转端点列表,从而将不同的 IIOP 端点用于 InitialContext 操作。

当您从通过 InitialContext 对象获得的引用中获取或创建 Bean 时,将在服务于指定给 InitialContext 对象的 IIOP 端点的 Application Server 实例上创建这些 Bean。对这些 Bean 的引用包括群集中的所有 Application Server 实例的 IIOP 端点地址。

主端点是与用于查找或创建 Bean 的 InitialContext 端点对应的 Bean 端点。群集中的其他 IIOP 端点将被指定为备用端点。如果 Bean 的主端点不可用,则该 Bean 上的其他请求将故障转移到其中一个备用端点。

可以配置 RMI-IIOP 负载平衡和故障转移,以使用 ACC 中运行的应用程序和独立 Java 客户机。

样例应用程序

以下目录包含用于演示通过和不通过 ACC 使用 RMI-IIOP 故障转移的样例应用程序。

install_dir/samples/ee-samples/sfsbfailover

有关使用和不使用 ACC 运行应用程序的说明,请参见本样例随附的 index.html 文件。ee-samples 目录还包含有关设置运行样例的环境的信息。

设置 RMI-IIOP 负载平衡和故障转移

可以为应用程序客户机容器 (ACC) 中运行的应用程序和独立客户机应用程序设置 RMI-IIOP 负载平衡和故障转移。

Procedure为应用程序客户机容器设置 RMI-IIOP 负载平衡

此过程概要介绍了将应用程序客户机容器 (ACC) 与 RMI-IIOP 负载平衡和故障转移结合使用所需要的步骤。有关 ACC 的其他信息,请参见《Sun Java System Application Server Enterprise Edition 8.1 2005Q2 Developer’s Guide》中的“Developing Clients Using the ACC”

  1. 转到 install_dir/bin 目录。

  2. 运行 package-appclient

    此实用程序生成一个 appclient.jar 文件。有关 package-appclient 的更多信息,请参见 package-appclient( 1M)

  3. appclient.jar 文件复制到需要作为客户机的计算机上,然后将其解压缩。

  4. 编辑 asenv.confasenv.bat 路径变量,以引用该计算机上的正确目录值。

    该文件位于 appclient-install-dir/config/ 中。

    有关待更新路径变量的列表,请参见 package-appclient( 1M)

  5. 如果需要,请使 appclient 脚本成为可执行脚本。

    例如,在 UNIX 上使用 chmod 700

  6. 查找群集中实例的 IIOP 侦听器端口号。

    将 IIOP 侦听器指定为端点以确定哪个 IIOP 侦听器接收请求。要在管理控制台中显示 IIOP 侦听器,请执行以下操作:

    1. 在管理控制台的树组件中,展开“群集”节点。

    2. 展开群集。

    3. 在群集中选择一个实例。

    4. 在右窗格中单击“属性”选项卡。

      注意用于特定实例的 IIOP 侦听器端口。

    5. 对每个实例重复该过程。

  7. 为端点值编辑 sun-acc.xml

    使用前一步骤中的 IIOP 侦听器创建以下格式的端点值:

    machine1:instance1–iiop-port, machine2:instance2–iiop-port

    例如:

    <property name="com.sun.appserv.iiop.endpoints" value="host1.sun.com:3335,host2.sun.com:3333,host3.sun.com:3334"\>

  8. 部署客户机应用程序,同时使用 --retrieve 选项获取客户机 jar 文件。

    将该客户机 jar 文件保留在客户机上。

    例如:

    asadmin deploy --user admin --passwordfile pw.txt --retrieve /my_dir myapp

  9. 按下述命令运行应用程序客户机:

    appclient -client clientjar -name appname

接下来的操作

要测试故障转移,请停止群集中的一个实例,然后查看应用程序是否正常运行。在客户机应用程序中还可以有断点(或休眠)。

要测试负载平衡,请使用多个客户机并查看负载在所有端点上的分布情况。

Procedure为独立客户机设置 RMI-IIOP 负载平衡和故障转移

  1. 部署应用程序,同时使用 --retrieve 选项获取客户机 jar 文件。

    将该客户机 jar 文件保留在客户机上。

    例如:

    asadmin deploy --user admin --passwordfile pw.txt --retrieve /my_dir myapp

  2. 运行客户机 jar 文件和必需的 jar 文件,同时将端点和 InitialContext 指定为 -D 值。

    例如:

    java -Dcom.sun.appserv.iiop.endpoints=
    host1.sun.com:33700,host2.sun.com:33700,host3.sun.com:33700 
    samples.rmiiiopclient.client.Standalone_Client
接下来的操作

要测试故障转移,请停止群集中的一个实例,然后确认应用程序是否正常运行。在客户机应用程序中还可以有断点(或休眠)。

要测试负载平衡,请使用多个客户机并查看负载在所有端点上的分布情况。