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

第 11 章 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 负载平衡和故障转移将透明地发生。在应用程序部署过程中无需特殊的步骤。Application Server 的 IIOP 负载平衡和故障转移支持动态重新配置的群集。如果在其上部署应用程序客户机的 Application Server 实例参与群集,则 Application Server 将自动查找群集中当前处于活动状态的所有 IIOP 端点。因此,如果将新实例添加到群集或将其从群集中删除,则无需手动更新端点列表。但是,客户机至少应指定两个端点以用于引导目的,防止其中一个端点出现故障。

要求

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

Application Server 支持对在应用程序客户机容器 (Application Client Container, ACC) 中执行的 Java 应用程序进行负载平衡。请参见设置 RMI-IIOP 负载平衡和故障转移


注 –

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 中运行的应用程序。

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

可以为在应用程序客户机容器 (application client container, ACC) 中运行的应用程序设置 RMI-IIOP 负载平衡和故障转移。还支持加权的 round-robin 负载平衡。

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

此过程概要介绍了将应用程序客户机容器 (ACC) 与 RMI-IIOP 负载平衡和故障转移结合使用所需要的步骤。有关 ACC 的其他信息,请参见《Sun Java System Application Server 9.1 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 侦听器端口号。

    步骤 7 中将 IIOP 侦听器指定为端点。

    对于每个实例,按如下所述获取 IIOP 侦听器端口:

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

    2. 展开群集。

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

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

    5. 注意用于实例的 IIOP 侦听器端口。

  7. sun-acc.xml 文件中至少添加两个 target-server 元素。


    注 –

    群集功能在开发者配置文件中不可用。有关配置文件的信息,请参见《Sun Java System Application Server 9.1 管理指南》中的“用法配置文件”


    使用在步骤 6 中获取的端点。

    如果在其上部署应用程序客户机的 Application Server 实例参与群集,则 ACC 将自动查找群集中当前处于活动状态的所有 IIOP 端点。但是,客户机至少应指定两个端点以达到引导目的,以防其中一个端点出现故障。

    target-server 元素指定用于负载平衡的一个或多个 IIOP 端点。address 属性是 IPv4 地址或主机名,port 属性指定端口号。请参见《Sun Java System Application Server 9.1 Application Deployment Guide》中的“client-container”

    作为使用 target-server 元素的替代方法,可以使用 endpoints 属性,如下所示:


    jvmarg value = "-Dcom.sun.appserv.iiop.endpoints=host1:port1,host2:port2,..."
    
  8. 如果需要加权 round-robin 负载平衡,请执行以下步骤:

    1. 设置每个服务器实例的负载平衡权重。


      asadmin set instance-name.lb-weight=weight
      
    2. sun-acc.xml 中,将 ACC 的 com.sun.appserv.iiop.loadbalancingpolicy 属性设置为 ic-based-weighted

      …
      <client-container send-password="true">
        <property name="com.sun.appserv.iiop.loadbalancingpolicy" value="ic-based-weighed"/>
      …
  9. 部署客户机应用程序,同时使用 --retrieve 选项获取客户机 jar 文件。

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

    例如:


    asadmin deploy --user admin --passwordfile pw.txt --retrieve /my_dir myapp
    
  10. 按下述命令运行应用程序客户机:

    appclient -client clientjar -name appname


示例 11–1 为 RMI-IIOP 加权 Round-Robin 负载平衡设置负载平衡权重

在此示例中,包含三个实例的群集中负载平衡权重如下表所示进行设置。

实例名称 

负载平衡权重 

i1

100 

i2

200 

i3

300 

设置这些负载平衡权重的命令序列如下:


asadmin set i1.lb-weight=100
asadmin set i2.lb-weight=200
asadmin set i3.lb-weight=300

接下来的操作

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

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