Enterprise JavaBeanでRMI-IIOP通信を行う場合、ロードバランス機能を使用できます。以下にロードバランス機能について説明します。IJServerクラスタから他プロセスまたはリモートサーバのネーミングサービスに登録されたEnterprise JavaBeanにアクセスする場合には、ロードバランス機能は使用できません。
ロードバランスおよびフェイルオーバーアルゴリズム
RMI-IIOPクライアントがInitialContextオブジェクトを作成すると、そのクライアントで指定したエンドポイント(サーバとポートの組み合わせ)のリストから最初に指定したエンドポイントのグループ管理サービス(GMS)にアクセスし、アクセスしたサーバーインスタンスのIJServerクラスタ内で有効なサーバーインスタンスのリストを取得します。この取得する情報には、IIOP通信するのに必要な以下の情報が含まれています。
取得情報 | 値 |
---|---|
ホスト名 | IIOPリスナーの定義項目「ネットワークアドレス」に設定された値が返却されます。ただし、ネットワークアドレスの設定が「0.0.0.0」(デフォルト)の場合、ノードエージェントのJMXコネクタに設定する「クライアントホスト名」に指定された値が返却されます。 |
ポート番号 | IIOPリスナーの定義項目「リスナーポート」に設定された値が返却されます。 |
取得したサーバーインスタンスのリストからランダムなサーバーインスタンスのリストを作成します。サーバーインスタンスのリストの取得はプロセスで一度行われます。
作成したInitialContextオブジェクトに対して、API(lookupメソッドなど)を実行すると、ランダムなサーバーインスタンスのリストから、最初のサーバーインスタンスに処理を要求します。InitialContextオブジェクトを作成するたびにサーバーインスタンスのリストをローテーションしてランダムなサーバーインスタンスのリストが再作成されます。
lookupメソッドで取得したオブジェクトに対する処理は、lookupメソッドでアクセスしたサーバーインスタンスに対して要求します。ロードバランスしたい場合には、InitialContextの作成から再実行してください。
リストの最初の接続先(エンドポイントまたはサーバーインスタンス)の要求で通信エラーが発生して利用できない場合、リストの2番目の接続先が使用されて、同様にその他接続先にフェイルオーバーされます。接続先のホスト名(またはIPアドレス)のサーバが起動されていない場合、フェイルオーバーに時間がかかります。
ランダムなサーバーインスタンスのリスト作成方法
IJServerクラスタの各サーバーインスタンスはバランスするために重み付けされており、10に設定されます。各サーバーインスタンスの重み付けをすべて累積した値を算出します。サーバーインスタンス数が4の場合には40となります。
1~40の数字を以下のように各サーバーインスタンスに割り当て、その数字の中から乱数で値を選択してサーバーインスタンスを選択します。以下はサーバーインスタンスがMyInstance-1、MyInstance-2、MyInstance-3、MyInstance-4の場合の例です。乱数の選択についてはjava.util.RandomクラスのnextInt(int n)メソッドを使用します。詳細は、java.util.RandomクラスのJavadocを参照してください。
選択された値 | サーバーインスタンス |
---|---|
1~10 | MyInstance-1 |
11~20 | MyInstance-2 |
21~30 | MyInstance-3 |
31~40 | MyInstance-4 |
選択されたサーバーインスタンス以降のリストを新しいリストの先頭に追加し、選択されたサーバーインスタンスまでのリストをその後に追加してランダムなリストを作成します。上記の例の場合、乱数で22が選択されると、22に対応するMyInstance-3以降が先頭に追加された以下のような新しいリストが作成されます。
新しいリスト |
---|
MyInstance-3 |
MyInstance-4 |
MyInstance-1 |
MyInstance-2 |
クライアントの設定
com.sun.appserv.iiop.loadbalancingpolicyプロパティにロードバランスポリシーとして以下を設定できます。
指定値 | 説明 |
---|---|
ic-based | 各サーバーインスタンスに均等にロードバランスします。 |
アプリケーションクライアントコンテナの設定
Java EEアプリケーションクライアントの接続にRMI-IIOPロードバランスを使用する場合、Interstage ACC deployment descriptor(sun-acc.xml)にtarget-server要素を複数定義し、複数のエンドポイントを指定してください。
target-server要素のname属性に一意の名前、address属性に接続先ホストをFQDN形式またはIPv4のIPアドレス、port属性にIIOPリスナーのポート番号を指定します。さらにproperty要素にプロパティcom.sun.appserv.iiop.loadbalancingpolicyを指定してください。
エンドポイントを1つだけ指定し、ロードバランスポリシーを指定しなかった場合にはロードバランスされません。また、ロードバランスは最初に指定したエンドポイントと同じIJServerクラスタの中で行われます。target-server要素に異なるIJServerクラスタに属したエンドポイントを定義しても無視されます。
例
<client-container> <target-server name="server1" address="host1" port="23700"/> <target-server name="server2" address="host1" port="23701"/> <property name="com.sun.appserv.iiop.loadbalancingpolicy" value="ic-based"/> </client-container>
スタンドアロンクライアントの設定
システムプロパティにcom.sun.appserv.iiop.loadbalancingpolicyまたはエンドポイントの指定として以下を設定してください。このプロパティを指定する場合、同一プロセスで動作するアプリケーションでは同一の値を指定してください。同一サーバーインスタンス上のアプリケーションで別々の値を指定したり、途中で接続先を変更することはできません。
プロパティ名 | 値 | 説明 |
---|---|---|
com.sun.appserv.iiop.endpoints | ホスト名とポート番号のリスト | ロードバランスを行う場合、ホスト名とIIOP通信ポート番号を以下の書式で指定します。 |
例
-Dcom.sun.appserv.iiop.loadbalancingpolicy=ic-based
-Dcom.sun.appserv.iiop.endpoints=host1:23700,host1:23701
以下に概要図を記載します。(1)でクライアントに指定されたエンドポイントにアクセスして、グループ管理サービスからサーバーインスタンスのリストを取得します。エンドポイントを複数指定した場合、指定されたエンドポイントの先頭からアクセスし、アクセスに失敗した場合には(2)で次に指定されたエンドポイントにアクセスしてグループ管理サービスからサーバーインスタンスのリストを取得します。取得したサーバーインスタンスのリストから、クライアントでランダムなリストを生成します。(3)で生成されたランダムなリストの先頭から実際の処理を要求します。サーバーインスタンスが複数存在し、(3)のアクセスに失敗した場合には、(4)で次のサーバーインスタンスに処理を要求します。