IIOP通信のロードバランス機能としてEJBディスパッチ機能を提供します。従来のグループ管理サービス(以降、GMS)と比べて、多様なシステム構成においても柔軟な拡張や構成変更が可能となります。GMSを利用したロードバランスは非推奨機能となります。
以下にEJBディスパッチ機能を利用した場合の構成を記載します。
EJBディスパッチ機能では、IIOP通信による要求を受信して適切なサーバーインスタンスに要求を振り分けるディスパッチャのことを"EJBディスパッチャ"と呼びます。
EJBディスパッチ機能を利用したロードバランスでは、業務サーバーインスタンスとは別にEJBディスパッチャを運用するサーバーインスタンスを用意します。クライアントは、EJBディスパッチャに対してIIOP通信の要求を送信します。IIOP通信の要求を受信したEJBディスパッチャは、振り分け対象のサーバーインスタンスにリクエストを振り分けます。EJBディスパッチャは複数のIJServerクラスタを振り分け対象にできるため、クライアントはEJBディスパッチャのエンドポイント(ホスト名とIIOPリスナーポート)のみ意識すれば、EJBディスパッチャが振り分け対象として認識しているIJServerクラスタ/サーバーインスタンスがどのようにサーバー上に配置されているかを意識する必要はありません。
従来のグループ管理サービスを利用したロードバランスでは、IIOP通信で要求を送信する前(InitialContextオブジェクトを生成する時)に、一度業務サーバーインスタンスのグループ管理サービスから稼動中のサーバーインスタンス一覧情報を取得し、その一覧情報からIIOP通信でリクエストを送信するサーバーインスタンスを決定しました。しかし、アプリケーションとグループ管理サービスが同一のサーバーインスタンスで動作するため、アプリケーションの異常などにより問い合わせるグループ管理サービスのサーバーインスタンスが停止している可能性があり、呼び出し元は各サーバーインスタンスの状態を意識する必要がありました。
グループ管理サービスを利用した場合とEJBディスパッチ機能を利用した場合のロードバランスの比較を以下に説明します。また、処理性能もグループ管理サービスを利用した場合に比べて、EJBディスパッチャを利用した場合の方が向上します。
項目 | グループ管理サービスを利用した場合 | EJBディスパッチャを利用した場合 |
---|---|---|
別々のIJServerクラスタで運用されたアプリケーションの呼び出し | 呼び出せません。 クライアントアプリケーションから複数IJServerクラスタのEJBアプリケーションを呼び出せません。呼び出す場合には、エンドポイントの指定を変更し、クライアントアプリケーションを再起動する必要があります。 | 呼び出すことができます。 EJBディスパッチャが複数IJServerクラスタの要求を一括で受け付けて振り分けるため、クライアントから複数IJServerクラスタで運用されたEJBアプリケーションを呼び出すことができます。 |
クライアントにおけるエンドポイントの指定 | EJBアプリケーションを運用するサーバーインスタンスのホスト名とIIOPリスナーポート番号を指定します。アプリケーションの異常やアプリケーションのメンテナンスによりサーバーインスタンスが停止している可能性があるため、エンドポイントを複数(作成したすべてのサーバーインスタンス数分)指定することが推奨です。 | EJBディスパッチャを運用するサーバーインスタンスのホスト名とIIOPリスナーポート番号のみ指定します。EJBディスパッチャを運用するサーバーインスタンスでアプリケーションを運用しない場合、サーバーインスタンスを常時起動しておくことによりエンドポイントは1つのみ指定すれば良いです。 |
業務サーバーインスタンスの監視方法 | 各業務サーバーインスタンスがマルチキャストに定期的にハートビート信号を送信し、業務サーバーインスタンスが正常に稼動しているか監視します。 | 業務サーバーインスタンスの起動/停止制御を行うInterstage Java EE Node Agentサービスが、正常に稼動している業務サーバーインスタンスをEJBディスパッチャに通知します。 |
IPCOM連携によるIIOP通信の負荷分散 | Stateless Session BeanのみIPCOM連携が可能です。 | Stateful Session BeanとStateless Session BeanでIPCOM連携が可能です。 |
Interstage Java EE Node Agentサービスと連携して、起動済みのサーバーインスタンスが自動的に振り分け対象となり、停止したサーバーインスタンスを振り分け対象から自動的に除外します。
また、EJBディスパッチャを起動後にディスパッチターゲットを追加・削除した場合には、追加・削除したタイミングでIJServerクラスタのサーバーインスタンスが振り分け対象に反映されます。
注意
Interstage Java EE Node Agentサービスがサーバーインスタンスの起動もしくは停止を確認してから、サーバーインスタンスの振り分け対象への追加もしくは振り分け対象から除外するまで数秒(サーバーの負荷が高い場合には数十秒)の時間を要する場合があります。
アプリケーション呼び出し時にjavax.naming.NamingExceptionが発生した場合、呼び出し先のサーバーインスタンスが振り分け対象に追加されていない可能性があります。振り分け状態表示コマンド(list-ejb-dispatch-targets)で呼び出し先のサーバーインスタンスが振り分け対象に追加されたことを確認してからアプリケーションを実行してください。
EJBディスパッチャを起動後にディスパッチターゲットのIJServerクラスタに対して以下の操作を行わないでください。以下の操作を行ったサーバーインスタンスはEJBディスパッチャの振り分け対象に正しく反映されない場合があります。正しく反映されない場合、操作を行ったIJServerクラスタをEJBディスパッチャのディスパッチターゲットから一度削除して再度追加するか、もしくは、EJBディスパッチャのIJServerクラスタを再起動してください。
IJServerクラスタへのサーバーインスタンスの追加/削除
IJServerクラスタのサーバーインスタンスに対してIIOPリスナーの定義変更
ディスパッチターゲットに追加したIJServerクラスタをInterstage Java EE管理コンソールもしくはasadminコマンドのdelete-clusterサブコマンドで削除しても、ディスパッチターゲットの定義は残存します。必要に応じてIJServerクラスタの削除に合わせてディスパッチターゲットも削除してください。
サーバーインスタンスが振り分け対象と認識されたタイミングで、そのサーバーインスタンスですでに有効(稼動済み)となっているEnterprise JavaBeansがEJBディスパッチャの振り分け対象となります。振り分け対象となった起動済みのサーバーインスタンスに対し、以下の操作を行った場合には異常となります。このため、起動済みのサーバーインスタンスに対して配備・配備解除するような開発中はEJBディスパッチ機能を利用したロードバランス機能は使用しないでください。
Enterprise JavaBeansを追加で配備した場合(配備と同等のアプリケーションの展開やアプリケーションの活性状態を有効にした場合を含む)
EJBディスパッチャの振り分け対象となりません。呼び出し元から追加で配備したEnterprise JavaBeansを呼び出した場合には、振り分け対象が存在しないことを示すOBJ_ADAPTER例外が返却されます。
Enterprise JavaBeansを再配備した場合
追加で配備した場合と同様にEJBディスパッチャの振り分け対象となりません。呼び出し元から再配備したEnterprise JavaBeansを呼び出した場合には、振り分け対象が存在しないことを示すOBJ_ADAPTER例外が返却されます。
Enterprise JavaBeansを配備解除した場合(配備解除と同等のアプリケーションの展開解除やアプリケーションの活性状態を無効にした場合を含む)
EJBディスパッチャの振り分け対象から除外されません。呼び出し元から配備解除したEnterprise JavaBeansを呼び出した場合には、振り分け対象のサーバーインスタンスに要求が振り分けられますが、対象のEnterprise JavaBeansが存在しないことを示すOBJECT_NOT_EXIST例外が返却されます。
上記のように振り分け対象となった起動済みのサーバーインスタンスに対する変更を、EJBディスパッチャに有効にするには以下の方法があります。
asadminコマンドのdisable-ejb-dispatch-targetサブコマンドでサーバーインスタンスの振り分け対象として一時的に無効にし、enable-ejb-dispatch-targetサブコマンドでサーバーインスタンスを再度振り分け対象として有効にする。
EJBディスパッチャが稼動しているサーバーインスタンスを再起動する。
Enterprise JavaBeansを運用しているサーバーインスタンスを再起動する。
また、IIOP通信で呼び出されるEnterprise JavaBeansがEJBディスパッチャの振り分け対象となります。IIOP通信を介さずに呼び出されるMessage-driven Beanやその他のEnterprise JavaBeansは振り分け対象となりません。
注意
以下のEnterprise JavaBeansの呼び出しはEJBディスパッチャの振り分け対象となりません。
Java EE Management規約のMEJB
以下のコマンドを使用することにより、EJBディスパッチャにおけるリクエスト振り分け制御状態(振り分け対象にする/しない)の変更や、現在のリクエスト振り分け制御状態を表示できます。
例えば、EJBアプリケーションの定期保守、ネットワーク障害やマシンのハード障害などの場合に当該サーバーインスタンスを一時的にリクエスト振り分け対象から外し、保守完了後や障害対処後に振り分け対象に戻します。
この操作により、安定かつ継続的なシステムの運用が可能になります。
振り分け操作コマンド(disable-ejb-dispatch-target/enable-ejb-dispatch-target)
リクエストの振り分け対象にする/しないの操作を、サーバーインスタンス名を指定して行います。
振り分け操作コマンドで操作した状態は、EJBディスパッチャの再起動後や異常停止後でも保持されます。振り分けの状態を変更したい場合は、再度振り分け操作コマンドを実行します。
振り分け状態表示コマンド(list-ejb-dispatch-targets)
サーバーインスタンスへの振り分け状態を表示します。
EJBディスパッチ機能の利用者が、意図した通りに振り分け制御されているかを確認できるように、EJBディスパッチャの振り分け制御情報をログに出力する機能を提供します。
ログはサーバーログにメッセージとして出力されます。
ログの設定
EJBディスパッチャのログは、Interstage Java EE管理コンソール、またはasadminコマンドにより有効にできます。
Interstage Java EE管理コンソール
[クラスタ] > [クラスタ名]の「IIOPロードバランス」画面において「リクエストディスパッチ情報ログ」もしくは「ディスパッチターゲット情報ログ」の設定を有効にします。
asadminコマンドのsetサブコマンド
「clustersの定義項目」の「リクエストディスパッチ情報ログ」もしくは「ディスパッチターゲット情報ログ」の設定を変更します。
詳細は、Interstage Java EE管理コンソールのヘルプ、または「リファレンスマニュアル(コマンド編)」-「asadmin」を参照してください。
ログの出力先
サーバーログ(server.log)ファイルに出力されます。
出力情報
以下の情報を出力します。
出力情報 | 内容 |
---|---|
リクエストディスパッチ情報ログ | この設定を有効に設定した場合、EJBディスパッチャが要求をどの対象に振り分けたかを示す情報をログに出力します。 |
ディスパッチターゲット情報ログ | この設定を有効に設定した場合、EJBディスパッチャへ振り分け対象となるサーバーインスタンスの情報をログに出力します。 |
出力形式
以下の情報が出力されます。
1)リクエストディスパッチ情報ログ
IIOP通信要求を受け付けた場合
INFO: ISJEE_EJBD0006: REQUEST ACCEPT "リクエストID" "リモートホスト名" "種別" "インタフェース情報" "オペレーション名" "アプリケーション識別情報"
IIOP通信要求を振り分け対象に振り分ける場合
INFO: ISJEE_EJBD0007: REQUEST DISPATCH "リクエストID" "リモートホスト名" "サーバーインスタンス名" "種別" "インタフェース情報" "オペレーション名" "アプリケーション識別情報"
出力項目 | 内容 |
---|---|
リクエストID | IIOP通信要求を特定する一意のIDが出力されます。 |
リモートホスト名 | EJBディスパッチャに接続したクライアントのホスト名、またはIPアドレスが出力されます。同一サーバーインスタンス内で要求を受け付けた場合は、"-"が出力されます。 |
サーバーインスタンス名 | ディスパッチ対象のサーバーインスタンス名が出力されます。 操作名がACCEPTの場合には出力されません。 |
種別 | 以下のいずれかが出力されます。
|
インタフェース情報 | 種別が「EJB」の場合、インタフェース情報が以下のような形式で出力されます。 種別が「SERVICE」の場合、内部のインタフェース情報が出力されますので無視してください。 ■EJB2.1以前の形式の場合 RMI:Homeインタフェースのパッケージ名.Homeインタフェース名:0000000000000000 ■EJB3.0形式の場合※ RMI:com.sun.ejb.codegen.GenericEJBHome_Generated: 0000000000000000 ※Homeインタフェースが存在しないEJB3.0形式のEnterprise JavaBeansの場合には、Homeインタフェース名には" com.sun.ejb.codegen.GenericEJBHome_Generated"が固定で出力されます。 |
オペレーション名 | 呼び出されたオペレーション名が出力されます。 |
アプリケーション識別情報 | アプリケーションを一意に特定する内部情報が出力されます。 |
2)ディスパッチターゲット情報ログ
振り分け対象が追加された場合
INFO: ISJEE_EJBD0008: TARGET ADDED "サーバーインスタンス名" "インタフェース情報" "アプリケーション識別情報"
振り分け対象が削除された場合
INFO: ISJEE_EJBD0009: TARGET DELETED "サーバーインスタンス名"
ユーザ操作により振り分け対象として再登録された場合
INFO: ISJEE_EJBD0010: TARGET ENABLED "サーバーインスタンス名" "インタフェース情報" "アプリケーション識別情報"
ユーザ操作により振り分け対象から除外された場合
INFO: ISJEE_EJBD0011: TARGET DISABLED "サーバーインスタンス名"
出力項目 | 内容 |
---|---|
サーバーインスタンス名 | ディスパッチ対象のサーバーインスタンス名が出力されます。 |
インタフェース情報 | 操作名が"ADDED"もしくは"ENABLED"の場合に出力されます。 ディスパッチ対象となるEJBアプリケーションのインタフェース情報が出力されます。以下の形式で出力されます。 ■EJB2.1以前の形式のHomeインタフェースの場合 RMI:Homeインタフェースのパッケージ名.Homeインタフェース名:0000000000000000 ■EJB2.1以前の形式のRemoteインタフェースの場合 RMI:Remoteインタフェースのパッケージ名.Remoteインタフェース名:0000000000000000 ■EJB3.0形式のHomeインタフェースの場合※ RMI:com.sun.ejb.codegen.GenericEJBHome_Generated: 0000000000000000 ■EJB3.0形式のビジネスインタフェースの場合 RMI:ビジネスインタフェースのパッケージ名._ビジネスインタフェース名_Remote:0000000000000000 例)EJB3.0形式のビジネスインタフェースが"com.fujitsu.manager.EmployeeRemote"の場合の例 RMI:com.fujitsu.manager._EmployeeRemote_Remote:0000000000000000 ※Homeインタフェースが存在しないEJB3.0形式のEnterprise JavaBeansの場合には、Homeインタフェース名には" com.sun.ejb.codegen.GenericEJBHome_Generated"が固定で出力されます。 |
アプリケーション識別情報 | 操作名が"ADDED"もしくは"ENABLED"の場合に出力されます。 |
出力例
[08/06/2011 14:44:11.250 +0900] ISJEE: INFO: ISJEE_EJBD0008: TARGET ADDED "targetInstance1" "RMI:com.fujitsu.test.ejb21.remote.FrontStatelessHome:0000000000000000" "85689139321831425_RHome-EJBHome": ThreadID=25,ThreadName=RMI TCP Connection(120)-10.10.10.11 [08/06/2011 14:44:11.250 +0900] ISJEE: INFO: ISJEE_EJBD0008: TARGET ADDED "targetInstance1" "RMI:com.fujitsu.test.ejb21.remote.FrontStatelessRemote:0000000000000000" "85689139321831425_RHome-EJBObject": ThreadID=25,ThreadName=RMI TCP Connection(120)-10.10.10.11 [08/06/2011 14:35:15.218 +0900] ISJEE: INFO: ISJEE_EJBD0006: REQUEST ACCEPT "59" "10.10.10.11" "EJB" "RMI:com.fujitsu.test.ejb21.remote.FrontStatelessHome:0000000000000000" "create" "RootPOA/#INTERNAL#ReferenceFactoryManagerBase#INTERNAL#/85689139321831425_RHome-EJBHome": ThreadID=23,ThreadName=p: thread-pool-1; w: 16 [08/06/2011 14:35:15.218 +0900] ISJEE: INFO: ISJEE_EJBD0007: REQUEST DISPATCH "59" "10.10.10.11" "targetInstance1" "EJB" "RMI:com.fujitsu.test.ejb21.remote.FrontStatelessHome:0000000000000000" "create" "85689139321831425_RHome-EJBHome": ThreadID=23,ThreadName=p: thread-pool-1; w: 16 [08/06/2011 14:38:17.187 +0900] ISJEE: INFO: ISJEE_EJBD0011: TARGET DISABLED "targetInstance1": ThreadID=24,ThreadName=RMI TCP Connection(101)-10.10.10.11 [08/06/2011 14:38:30.953 +0900] ISJEE: INFO: ISJEE_EJBD0010: TARGET ENABLED "targetInstance1" "RMI:com.fujitsu.test.ejb21.remote.FrontStatelessHome:0000000000000000" "85689139321831425_RHome-EJBHome": ThreadID=24,ThreadName=RMI TCP Connection(101)-10.10.10.11 [08/06/2011 14:38:30.953 +0900] ISJEE: INFO: ISJEE_EJBD0010: TARGET ENABLED "targetInstance1" "RMI:com.fujitsu.test.ejb21.remote.FrontStatelessRemote:0000000000000000" "85689139321831425_RHome-EJBObject": ThreadID=24,ThreadName=RMI TCP Connection(101)-10.10.10.11 [08/06/2011 14:43:57.250 +0900] ISJEE: INFO: ISJEE_EJBD0009: TARGET DELETED "targetInstance1": ThreadID=25,ThreadName=RMI TCP Connection(120)-10.10.10.11 |