Sun Java System Application Server Enterprise Edition 8.1 2005Q2 高可用性 (HA) 管理ガイド

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

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

概要

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

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

RMI-IIOP 負荷分散とフェイルオーバーは、透過的に発生します。アプリケーションの配備中に、特別な手順は必要ありません。ただし、クラスタに新しいインスタンスを追加したり削除したりしても、そのクラスタに関する既存のクライアントの表示は更新されません。それには、クライアント側で、端点の一覧を手動で更新する必要があります。

要件

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

Application Server は、Application Server に配備された EJB コンポーネントにアクセスしている次の RMI-IIOP クライアントに対する負荷分散をサポートしています。


注 –

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


アルゴリズム

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

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

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

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

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

RMI-IIOP 負荷分散とフェイルオーバーは、ACC で動作しているアプリケーション、およびスタンドアロンの Java クライアントとともに動作するように設定できます。

アプリケーション例

次のディレクトリには、ACC とともに、または ACC なしで RMI-IIOP フェイルオーバーを使用する方法を示すサンプルアプリケーションが含まれています。

install_dir/samples/ee-samples/sfsbfailover

ACC とともに、または ACC なしでアプリケーションを実行する手順については、このサンプルに付属している index.html ファイルを参照してください。ee-samples ディレクトリには、サンプルを実行する環境を設定するための情報も含まれています。

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

RMI-IIOP 負荷分散とフェイルオーバーは、アプリケーションクライアントコンテナ (ACC) で動作しているアプリケーション、およびスタンドアロンのクライアントアプリケーション用に設定できます。

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.conf または asenv.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

次の手順

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

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

Procedureスタンドアロンのクライアント用に RMI-IIOP 負荷分散とフェイルオーバーを設定するには

  1. --retrieve オプションを使用してアプリケーションを配備し、クライアントの JAR ファイルを取得します。

    クライアントの JAR ファイルはクライアントマシンに置いたままにします。

    次に例を示します。

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

  2. 端点と InitialContext-D 値を指定して、クライアントの JAR ファイルと必要な JAR ファイルを実行します。

    次に例を示します。

    java -Dcom.sun.appserv.iiop.endpoints=
    host1.sun.com:33700,host2.sun.com:33700,host3.sun.com:33700 
    samples.rmiiiopclient.client.Standalone_Client
次の手順

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

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