Sun GlassFish Enterprise Server 2.1 高可用性 (HA) 管理ガイド

第 9 章 RMI-IIOP 負荷分散とフェイルオーバー

この章では、RMI-IIOP 上のリモート EJB 参照と JNDI オブジェクトに高可用性 (HA) 機能を使用する方法について説明します。

概要

RMI-IIOP 負荷分散では、IIOP クライアント要求が別のサーバーインスタンスまたはネームサーバーに分散されます。目標は、負荷をクラスタ間に均等に拡散して、スケーラビリティーを実現することです。また、IIOP 負荷分散を EJB のクラスタリングおよび可用性と結合すれば、EJB フェイルオーバーも実現されます。

クライアントがオブジェクトに対して JNDI 検索を実行すると、ネームサービスは、特定のサーバーインスタンスに関連付けられた InitialContext (IC) オブジェクトを作成します。それ以降、その IC オブジェクトを使用して作成された検索要求はすべて、同じサーバーインスタンスに送信されます。その InitialContext を使用して検索された EJBHome オブジェクトはすべて、同じターゲットサーバーにホストされます。また、それ以降に取得された Bean 参照もすべて、同じターゲットホスト上に作成されます。InitialContext オブジェクトの作成時に、ライブターゲットサーバーのリストがすべてのクライアントによってランダムに選択されるため、これにより負荷分散が効果的に実現されます。ターゲットサーバーインスタンスが停止すると、検索または EJB メソッド呼び出しは、別のサーバーインスタンスに処理が引き継がれます。

RMI-IIOP 負荷分散とフェイルオーバーは、透過的に発生します。アプリケーションの配備中に、特別な手順は必要ありません。Enterprise Server の IIOP 負荷分散およびフェイルオーバーは、クラスタの動的再設定をサポートしています。アプリケーションクライアントが配備される Enterprise Server インスタンスがクラスタに参加する場合、Enterprise Server は、クラスタ内で現在アクティブなすべての IIOP 端点を自動的に検出します。したがって、新しいインスタンスがクラスタに追加された、またはインスタンスがクラスタから削除された場合に、端点のリストを手動で更新する必要はありません。ただし、端点の 1 つで障害が発生した場合に備えて、クライアントにはブートストラップ目的で少なくとも 2 つの端点を指定しておくことをお勧めします。

要件

Sun GlassFish Enterprise Server は、RMI-IIOP 上で、リモート EJB 参照と NameService オブジェクトの高可用性を提供します。それには、次のすべての要件を満たしている必要があります。

Enterprise Server は、Application Client Container (ACC) で動作している Java アプリケーションに対する負荷分散をサポートしています。「RMI-IIOP 負荷分散とフェイルオーバーの設定」を参照してください。


注 –

Enterprise Server は、SSL (Secure Socket Layer) 上の RMI-IIOP 負荷分散とフェイルオーバーをサポートしていません。


アルゴリズム

Enterprise Server は、ランダム化とラウンドロビンのアルゴリズムを使用して、RMI-IIOP 負荷分散とフェイルオーバーを実現しています。

RMI-IIOP クライアントは最初に新しい InitialContext オブジェクトを作成すると、そのクライアントで利用可能な Enterprise Server IIOP 端点のリストが、ランダムに選ばれます。その InitialContext オブジェクトに対して、ロードバランサは、ランダムに選択されたリストの最初の端点に検索要求とほかの InitialContext 操作を命令します。最初の端点が利用できない場合、リストの 2 番目の端点が使用され、以下同様です。

クライアントが続けて新しい InitialContext オブジェクトを作成するたびに、端点リストがローテーションし、異なる IIOP 端点が InitialContext 操作で使われます。

InitialContext オブジェクトによって確保される参照から Beans を入手または作成する場合、それらの Beans は、InitialContext オブジェクトに割り当てられた IIOP 端点を処理する Enterprise Server インスタンスで作成されます。それらの Beans に対する参照には、クラスタ内のすべての Enterprise Server インスタンスの IIOP 端点アドレスが含まれます。

プライマリ端点は、Bean の検索または作成に使用される InitialContext 端点に対応する Bean 端点です。クラスタ内のほかの IIOP 端点は、代替端点として指定されています。Bean のプライマリ端点が利用できなくなると、その Bean での追加の要求は、代替端点の 1 つにフェイルオーバーされます。

RMI-IIOP 負荷分散とフェイルオーバーは、ACC で動作しているアプリケーションとともに動作するように設定できます。

RMI-IIOP 負荷分散とフェイルオーバーの設定

RMI-IIOP 負荷分散とフェイルオーバーは、アプリケーションクライアントコンテナ (ACC) で動作しているアプリケーション用に設定できます。重み付きラウンドロビンによる負荷分散もサポートされています。

Procedureアプリケーションクライアントコンテナ用に RMI-IIOP 負荷分散を設定する

この手順は、アプリケーションクライアントコンテナ (ACC) とともに RMI-IIOP 負荷分散とフェイルオーバーを使用するために必要な手順の概要を示しています。ACC の詳細については、『Sun GlassFish Enterprise Server 2.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.conf または asenv.bat パス変数を編集して、そのマシン上の正しいディレクトリ値を参照するようにします。

    このファイルは、appclient-install-dir/config/ に格納されています。

    更新するパス変数の一覧については、package-appclient(1M)を参照してください。

  5. 必要に応じて、appclient スクリプト実行ファイルを作成します。

    たとえば、UNIX では chmod 700 を使用します。

  6. クラスタ内の少なくとも 2 つのインスタンスの IIOP リスナーポート番号を調べます。

    手順 7 で IIOP リスナーを端点として指定します。

    各インスタンスに対して、次のようにして IIOP リスナーポートを取得します。

    1. 管理コンソールのツリーコンポーネントで、「クラスタ」ノードを展開します。

    2. クラスタを展開します。

    3. クラスタ内のインスタンスを選択します。

    4. 右の区画で、「プロパティー」タブをクリックします。

    5. インスタンスに対する IIOP リスナーポートを記録します。

  7. sun-acc.xml ファイルに、少なくとも 2 つの target-server 要素を追加します。


    注 –

    クラスタ化機能は開発者プロファイルでは利用できません。プロファイルの詳細については、『Sun GlassFish Enterprise Server 2.1 管理ガイド』「プロファイル」を参照してください。


    手順 6 で取得した端点を使用します。

    アプリケーションクライアントが配備される Enterprise Server インスタンスがクラスタに参加する場合、ACC は、クラスタ内で現在アクティブなすべての IIOP 端点を自動的に検出します。ただし、端点の 1 つで障害が発生した場合に備えて、クライアントにはブートストラップ目的で少なくとも 2 つの端点を指定しておくことをお勧めします。

    target-server 要素は、負荷分散に使用される 1 つまたは複数の IIOP 端点を指定します。address 属性は IPv4 アドレスまたはホスト名であり、port 属性はポート番号を指定します。『Sun GlassFish Enterprise Server 2.1 Application Deployment Guide』「client-container」を参照してください。

    target-server 要素を使用する代わりに、endpoints プロパティーを次のように使用できます。


    jvmarg value = "-Dcom.sun.appserv.iiop.endpoints=host1:port1,host2:port2,..."
    
  8. 重み付きラウンドロビンによる負荷分散が必要な場合、次の手順を実行します。

    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


例 9–1 RMI-IIOP 重み付きラウンドロビン負荷分散に使用する負荷分散の重みの設定

この例では、3 つのインスタンスを含むクラスタでの負荷分散の重みを、次の表に示すように設定します。

インスタンス名 

負荷分散の重み 

i1

100 

i2

200 

i3

300 

これらの負荷分散の重みを設定するための一連のコマンドは、次のようになります。


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

次の手順

フェイルオーバーをテストするには、クラスタ内の 1 つのインスタンスを停止し、アプリケーションが正常に動作するかどうかを調べます。また、クライアントアプリケーション内にブレークポイント (またはスリープ) を設定することもできます。

負荷分散をテストするには、複数のクライアントを使用し、すべての端点にわたって負荷がどのように分散されるかを調べます。