Oracle WebLogic Server 11g

日付:2009年9月1日
Bill Dettelback、Hiromu Kato、Paul Parkinson

WebLogicクラスタでデータ損失ゼロを達成する方法

このHow-Toドキュメントを完了すると、以下のことが実行できます。
  • 既存のドメイン・テンプレートを使用した、新規WebLogicドメインの作成
  • WebLogicクラスタでの、XAデータソースの設定
  • WebLogic診断フレームワークを使用した、クラスタ内でのトランザクション・コンテキストのロギング
  • データ損失ゼロのデモンストレーション・アプリケーションの実行

ソフトウェア要件

  • WebLogic Server 11g(10.3.1、 OTNからダウンロードできます)
  • データ損失ゼロのデモンストレーション用ドメイン・テンプレート( こちらからダウンロードできます)、 または
  • データ損失ゼロのデモンストレーション・アプリケーション( こちらからダウンロードできます) のいずれか
  • Oracle Database XE(必要な場合のみ、 こちらからダウンロードできます)

表記法

  • %FMW_HOME% - WebLogic Server 11gをインストールしたディレクトリ
  • %APP_HOME% - データ損失ゼロのデモンストレーション・アプリケーションのZIPファイルを解凍したディレクトリ
ここで説明する手順は、Windowsプラットフォーム用のものです。UnixやLinuxを使用している場合は、必要に応じて変更してください。

前提条件

このHow-Toドキュメントを開始する前に、以下のソフトウェアをインストールする必要があります。

  • WebLogic Server 11g(10.3.1)
  • Oracle Database 10g、またはそれ以上(XEでも可)
OracleDSデータソースが構成されたデータベース上で、次のコマンドを実行してください。

 

はじめに

価値の高い情報を処理するアプリケーションは、トランザクションの整合性が保証されているプラットフォーム上で実行する必要があります。 WebLogic Serverのクラスタリングは、堅牢でありながらシンプルなメカニズムを通じて、トランザクションを処理しているクラスタ・ノードに障害が発生した場合 でも、クラスタに送信されたトランザクションが失われないようにします。 ここでは、WebLogic Serverインスタンスからなるクラスタに、シンプルな証券取引捕捉アプリケーションを構成する方法について説明した後で、1台のWebLogic Serverがトランザクションの処理中に停止した場合にも、トランザクションが失われない様子をデモンストレーションします。 また同時に、1つのテンプレートから、いかに簡単に、配置済みアプリケーションを含む、完全なクラスタリングWebLogicドメインを作成できるかを示 すとともに、クラスタのトランザクション・パスにトレース機能を導入するためのメカニズムとして、WebLogic診断フレームワーク(WLDF)を紹介 します。

ソリューションの説明

次の図に、4ノードのWebLogicクラスタと、サーブレットをホストしている5番目のノード(管理サーバー)を示します。 サーブレットは、ブラウザから取引注文を受け取り、処理を行うクラスタへ送信します。 ラウンドロビン方式のロードバランシングにより、クラスタ・ノード上のステートレスEJBが1つ選択され、2つのデータソースに対して、取引注文レコード と取引メッセージ・レコードの両方の書込みが行われます。 この2つのレコードは1つのXAトランザクションに含まれますが、ここでは、説明を簡単にするため、1つのOracle XEインスタンスを使用します。


トランザクション中にクラスタ・ノードに障害が発生すると、トランザクションは再試行されます。 次に、ロードバランシングによりクラスタ内の別のノードが選ばれ、うまくいけば処理は成功します。 実際のノードによる取引トランザクションの受取りとコミットを追跡するため、ここでは、WebLogic診断フレームワーク(WLDF)を使用します。 WLDFは、一意のコンテキストIDを持つEJBリクエストにdyeフラグを"注入"するための、使いやすいメカニズムを提供します。WLDFは、EJB メソッドの実行前後に、ノード名を含むイベント・レコードをデータベースに書き込みます。
このノードでトランザクションのコミットが成功すると、このコンテキストIDを持つWLDFイベントは2つになります(メソッド実行の前と後)。

反対に、コミットに失敗すると(ノード停止など)、WLDFレコードは、最初のノードによる1番目のレコードとリカバリ・ノードによる2レコードの3つに なります。 新しいノードが選択されても、WLDFでは同じコンテキストIDが維持されることを確認してください。コンテキストIDを追跡して記録されたノード名を比 較すると、いつトランザクションが失敗し、リカバリされたかがすぐに分かります。


デモンストレーションをセットアップする方法として、ここでは2種類の方法を紹介しています。 1番目は、事前に設定が行われたWebLogicドメイン・テンプレートを使用した、非常に簡単な方法です。WebLogicドメイン・テンプレートに は、クラスタ・サーバー、WLDF設定、配置済みアプリケーションが含まれています。 すぐに実行できるデモンストレーションを利用し、ドメインの設定については後から学習する場合、この方法が便利です。 2番目は、新規のWebLogicドメインから、ドメイン、クラスタ、WLDF、およびデータソースを再構築し、アプリケーションのみを配置する方法で す。 "ボトムアップ"アプローチを使用してアプリケーションを実行したい場合は、この方法が役に立つでしょう。

テンプレートを使用したドメイン作成

1. 構成ウィザードを起動します(「 スタート」→「 プログラム」→「 Oracle WebLogic」 →「 WebLogic Server 11gR1」→「 Tools」→「 Configuration Wizard」)。

2. 「 Create a new WebLogic domain」を選択し、「 Next」をクリックします。

3. 「 Base this domain on an existing template」を選択し、「 Browse」 をクリックします。「 zeroloss_domain_10.3.1.0.jar 」 ファイルを選択し、「 OK」に続いて「 Next」をクリックします。

4. ドメインの名前と場所について、デフォルトのままにするか、または新しい値を選択します(デフォルトでは、 user_projectsディレクトリ内にドメインが配置されます)。 「 Next」をク リックします。

5. デフォルトの管理者用資格証明(weblogic/abcd1234)を使用するか、または新しい資格証明を選択します。 「 Next」 をクリックします。

6. サーバー起動モードおよびJDKをデフォルトのままにします。 「 Next」をクリックします。

7. JDBCデータソースは、localhost:1521上で実行されるOracle XE用にあらかじめ設定されており、ユーザーおよびパスワードには、それぞれ'weblogic'と'abcd1234'が指定されています。 ご使用のデータベースに合わせて、適宜変更してください。 取引注文用に2つ、またWLDFイベント・レコード処理用に1つ、合計3つのデータソースが設定されています。 「 Next」をクリックす ると、接続のテストが実行されます。 接続が確認されたら、もう一度「 Next」をクリックします。

8. ドメイン・テンプレートには、一連のデータベース・スクリプトも含まれています。このスクリプトにより、WLDFおよびアプリケーションに必要な表とシー ケンスが設定されます。 「 Run Scripts」ボタンをクリックし、Resultsペインにエラーが表示されないことを確認します。 CFGFWK-20839:  Database Load Successful!というメッ セージが表示されます。 「 Next」をクリックします。

9. オプション設定は変更しません。 「 Next」をクリックします。

10. 構成サマリーに目を通し、すべてが正しいことを確認したら、「 Create」をクリックします。

11. 「 Done」をクリックして、構成ウィザードを終了します。

"アプリケーションの実行"セクションへスキップし、アプリケーションを実行します。

手動によるドメインの作成

1. 構成ウィザードを起動します(「 スタート」→「 プログラム」→「 Oracle WebLogic」 →「 WebLogic Server 11gR1」→「 Tools」→「 Configuration Wizard」)。

2. 「 Create a new WebLogic domain」を選択し、「 Next」をクリックします。

3. 「 Generate a domain configured automatically to support the following products:」を選択します。 "Basic WebLogic Server Domain"がチェックされていることを確認し、「 Next」をクリックします。

4. ドメイン名を'zeroloss_domain'に変更します。 デフォルトの場所を使用するか、または別のディレクトリを選択します。 「 Next」 をクリックします。

5. 管理者用ユーザー名を'weblogic'と設定します。 パスワードに、'abcd1234'または基準を満たす任意のパスワードを指定します。 「 Next」をクリックします。

6. サーバー起動モードおよびJDKをデフォルトのままにします。 「 Next」をクリックします。

7. オプション設定は変更しません。 「 Next」をクリックします。

8. 構成サマリーに目を通し、すべてが正しいことを確認したら、「 Create」をクリックします。

9. 「 Done」をクリックして、構成ウィザードを終了します。

WebLogicコンソールへのログイン

    1. 先ほど作成した管理サーバーを起動します(「 スタート」→「 プログラム」→「 Oracle WebLogic」 →「 User_Projects」→「 zeroloss_domain」→「S tart Admin Server for WebLogic Server Domain」)。 または、 %DOMAIN_HOME%\startWebLogic.cmdス クリプトを実行します。
    2. http://localhost:7001/consoleをブラウザで開きます。 ログイン画面が表示されたら、ステップ5で指定した資格証明を入力します。 すると、次の画面が表示されます。


       

      クラスタの作成

      1. Domain Structureツリー内の「 Environments」ノードを開きます。 「 Clusters」 ノードをクリックします。



      2. 「 Add」をクリックし、クラスタ名に"cluster1"を指定し、メッセージング・モードとして"Unicast"が選択されて いることを確認します。 「 OK」をクリックします。

      3. 新規クラスタである「 cluster1」をクリックします。 「 Servers」タブに続いて、「 Add」 をクリックします。



      4. Domain Structureツリーで、"Environment"ノードの下の「 Machines」ノードをクリックします。



      5. 「 New」をクリックし、名前を"machine1"に変更します。 UnixやLinuxを使用している場合、Machine OSを変更します。Windowsの場合は、そのままにします。 「 OK」をクリックします。

      Domain Structureツリーで、"Environment"ノードの下の「 Servers」ノードをクリックします。



      7. 「 New」をクリックしたら、新規サーバー名を"node0"に変更し、リスニング・アドレスに"localhost"を、リスニン グ・ポートに"7003"を指定します。 「 Yes, make this server a member of an existing cluster」にチェックを付け、"cluster1"が選択されていることを確認します。 「 Finish」をクリックしま す。



      8. ステップ7を繰り返して、以下のサーバーおよびリスニング・ポートを設定します。

      node1 7004
      node2 7005
      node3 7006

      各サーバーを実行するときに、それぞれ約250MBのRAMが必要となることに注意してください。 2GBまたはそれ以下のマシンを使用している場合、node2とnode3の設定を省略しても構いません。この場合、取引のロードバランシングにおいて使 用可能なノード数が変わるだけであり、アプリケーションの動作に影響はありません。



      9. クラスタ内の各サーバーをクリックし、マシンを"machine1"に変更します。 「 Save」をクリックします。


      データソースとデータベース表の設定

      10. Domain Structureツリーで、「 Services」ノードを開き、「 JDBC」→「 Data Sources」の順に選択します。



      11. 「 New」をクリックします。 以下のとおり、名前を"OracleDS"と入力し、JNDI名に"jdbc/OracleDS"を使用します。また、ドライバに"Oracle's Driver (Thin XA) for Instance connections"が選択されていることを確認します。 「 Next」 をクリックします。



      12. 「 Next」をクリックしてトランザクション・オプションをスキップし、適切なデータベース接続情報を入力します(以下は、 localhost上のXE)。 「 Next」をクリックします。



      13. 「 Test Configuration」をクリックし、確認が終わったら「 Next」をクリックします。 このデータソースのターゲットとして、「 AdminServer」と「 cluster1」にチェックを付けます。 「 Finish」 をクリックします。



      14. ステップ11からステップ13をあと2回繰り返し、以下のデータソースおよびJNDI名を設定します。 WLDF-DSのターゲットには、クラスタ内の各ノードを直接指定することに注意してください。

      OracleDS2 jdbc/OracleDS2
      WLDF-DS jdbc/WLDF-DS



      15. 次に、WLDFおよびアプリケーションに必要なデータベース表を設定します。 SQL Plusまたはその他のデータベース・クライアントを使用して、 %APP_HOME%\src\sqlに ある次のスクリプトを実行します。
      1. cre_seq.sql
      2. sleep_wait.sql
      3. trade_message.sql
      4. trade_order.sql
      5. wldf.sql

      WebLogic診断フレームワークの設定

      16. ドメインに対して、新しい診断モジュールを設定する必要があります。 Domain Structureツリーで、"Diagnostics"ノードの下の「 Diagnostic Modules」ノードをクリックします。



      17. 「 New」をクリックします。 名前を"ZeroLossModule"に変更します。 「 OK」をクリックしま す。 リストから、「 ZeroLossModule」をクリックします。 EJBトランザクションをトレースするため、ドメインに診断モニターを設定する必要があります。 「 Instrumentation」タブ をクリックします。 「 Enabled」をチェックします。これにより、暗黙的なDyeInjectionモニターが有効化され、各リクエ ストに一意のコンテキストIDが割り当てられます。 アーカイブへのレコード書込みは、このモニターではなく、アプリケーションに配置された診断モニターによって行われます(後述)。 最後に、「 Save」 をクリックします。



      18. "ZeroDataLossModule"設定ページで、「 Targets」タブをクリックします。 クラスタに対してのみ、ターゲットを設定します。 「 Save」をクリックします。



      19. デフォルトでは、WLDFモニターの書込み先はファイル・システムです。モニターのアーカイブ・ターゲットを変更し、WLDF-DSデータソースを使用す ることで、イベントがデータベースに書き込まれます。 Domain Structureツリーで、"Diagnostics"ノードの下の「 Diagnostic Modules」ノードをクリックします。



      20. 「 node0」エントリをクリックします。 タイプを"JDBC"に、データソースを"WLDF-DS"に変更します。 「 Save」 をクリックします。



      21. 各クラスタ・ノードに対して、ステップ20を繰り返します。

      アプリケーションの構築と配置

      22. %APP_HOME%ディレクトリに、 zeroloss.zipファ イルを解凍します。 コマンド・プロンプトを開いて、 %APP_HOME%ディレクトリへ移動しま す。 %FMW_HOME%の値が、使用しているWebLogic Serverに適していることを確認します。 setenv.cmdスクリプトを実行して、環境 を設定します。

      23. ant buildを実行して、アプリケーションEARを作成します。



      24. 生成されたEARファイルを、管理サーバーとクラスタに配置します。 Domain Structureツリーで、「 Deployments」 ノードをクリックします。



      25. 「 Install」をクリックしたら、 %APP_HOME%\distディ レクトリへ移動し、 ZeroLossProject.earファイルを確認します。 「 Next」 をクリックします。



      26. 次のオプション画面で「 Next」をクリックしたら、アプリケーションのターゲットとして管理サーバーとクラスタを適宜設定しま す。 「 Next」をクリックします。



      27. 「 Finish」をクリックして、すべてのデフォルト設定を受け入れます。 アプリケーションのステータスにActiveが表示され、状態がOKになります。



      これで、ドメイン設定とアプリケーション配置が完了しました。

      アプリケーションの実行

      1. ノード・マネージャを起動します(「 スタート」→「 プログラム」→「 Oracle WebLogic」 →「 WebLogic Server 11gR1」→「 Tools」→「 Node Manager」、または コマンドラインから、 %FMW_HOME%\wlserver_10.3\server\bin\startNodeManager.cmd)。

      2. 管理サーバーが稼働していない場合は、%FMW_HOME%\user_projects\domains\zeroloss_domain\ startWebLogic.cmdというコマンドを実行して管理サーバーを起動します。

      3. ドメイン作成中に指定した資格証明を使用して、WebLogic管理コンソール( http://localhost:7001/console) へログインします。

      Domain Structureツリーで、"Environment"ノードの下の「 Servers」ノードをクリックします。



      5. Summary of Serversページで「 Control」タブを選択します。 クラスタ内の各ノードをチェックしたら、「 Start」 をクリックします。



      数分後にすべてのノードが開始されたら、ブラウザをリフレッシュします。サーバー一覧は、次のように表示されます。



      6. Trade Captureページ( http://localhost:7001/ZeroLossProjectWeb/trade.jsp) へ移動します。



      Submit」ボタンをクリックし、取引注文を作成します。 "message output"行に、デバッグ出力として、データベースへの書込み内容が表示されます。 2行目のノード名が表示された部分に特に注意してください。 "Submit"ボタンを数回クリックすると、ノード名が周期的に変わることが確認できます。これは、クラスタにおいて、ラウンドロビン方式が正しく機能 していることを示します。 正確な順序はWebLogicにより内部的に決定されるため、ノード番号に直接従うとは限りません。 確認した順序を書き留めておきます。 たとえば、ここでは"node0"、"node1"、"node3"、"node2"という順序が確認されました。

      7. 別のブラウザ・ウィンドウで、 http://localhost:7001/ZeroLossProjectWeb/LastTradesServlet?numResults=20へ 移動します。



      このページでは、最後の取引を先頭に、直近の20件の取引が表示されています。 この表には、トランザクションを開始したクラスタ・ノードとトランザクションをコミットしたクラスタ・ノードが表示されます。 ステップ4で実行したそれぞれの処理については、(うまくいけば)両方の列に同じノード名が表示されます。

      8. 次にノード障害をシミュレーションします。 Trade Captureページへ戻り、最後に完了したトランザクションを表示します。 どのノードが使用されたかを書き留めてください。下のスクリーンショットでは"node2"が使用されているため、ラウンドロビン方式に従うと、次に選択 されるノードは"node0"になります。


      9. WebLogic Serverコンソールへ戻り、サーバー・リストを表示します。 "Control"タブが選択されていることを確認します。 次のトランザクションで使用される予定のノードの隣にあるボックスにチェックを付けます。   まだノードを停止しないでください。 トランザクションを受け取るまで、このノードを停止しません。 次のステップのために、このページの準備を整えておきます。



      10. Trade Captureページへ戻ったら、Sleepパラメータを20秒に設定します。 これにより、EJBはトランザクション中に一時停止するため、その間にノードを停止してリトライを発生させることができます。 「 Submit」 をクリックし、すぐにはページの表示が変わらないことを確認します。

      11. WebLogic Serverコンソール・ページへ戻り、「 Shutdown」ボタンをクリックし、「 Force Shutdown Now」を選択します。



      12. Trade Captureページへ切り替えると、ラウンドロビン・スケジュールに従って、停止されたノードの次のノードによって取引が処理されたことが分かります。 ここでは、"node0"で処理に失敗したため、"node1"が選択されました。


      これにより、"node0"がトランザクション中に停止されても、クラスタは別のノードでトランザクションをリトライし、データ損失を防いだことが分かり ます。

      13. Control Panelページに移動し、「 Show the last trades」リンクをクリックして表をリフレッシュ します。以下のとおり、最新の取引がハイライト表示されます。 ここから、トランザクションを受けとったノードと最終的にトランザクションをコミットしたノードが異なることを確認できます。


      WebLogic診断フレームワークの使用法の理解

      最新取引表を生成するサーブレットは、WLDFによって wls_events表に書き込まれたコン テキストIDを使用し、 trade_order表のレコードに対して関連付けを行います。 クラスタ内でノード障害が発生してもコンテキストIDは変わらないため、WLDFはこのような処理に理想的なメカニズムです。 これには、ドメインで有効化されたDyeInjectionモニターが貢献しています。 EARに配置されたDyeInjectionモニターは、暗黙的なDyeInjectionモニターによって生成されたコンテキストIDを使用して、 EJBの"buy"メソッドの前後にイベント・レコードを書き出します。 アプリケーション・コールにおいてイベント生成を注入する方法をWLDFに対して正確に伝える必要があるため、この特定の設定はアプリケーションEAR自 体に含まれています。

      実際に設定されている場所を確認するには、以下の手順に従います。
      1. WebLogic Serverコンソールの"Summary of Deployments"ページで、EARファイル「 ZeroLossProject」 をクリックします。 「 Configuration」タブをクリックします。 次に、「 Instrumentation」サ ブタブをクリックします。



      2. 以下に示した診断モニター(TradeMonitor)は、アプリケーションの一部として配置されています。 これは、アクション"TraceElapsedTimeAction"を含むカスタム・モニターであることが分かります。 「 TradeMonitor」 をクリックします。



      Pointcutフィールドの式を使用して、イベント・レコードを書き込むコールでEJBのbuyメソッドを"ラップ"する方法が、WLDFに指定されて います。 レコードに書き込まれる情報は、指定されたアクション(TraceElapsedTimeAction)によって指示されます。

      まとめ

      WebLogic Serverのクラスタリングは、個別のノードに障害が発生した場合もデータ整合性を保証するための、堅牢でありながら使いやすいメカニズムを提供しま す。  
      • リクエストがサーブレットにより送信されると、クラスタ内で自動的にロードバランシングが行われます。
      • リトライされたトランザクションは、ロードバランシング・アルゴリズムに従って、次に使用可能なノードによって処理されます。
      WebLogic診断フレームワークは、ドメイン内で発生するリクエストの動作を詳細に把握するための、理想的なメカニズムです。 ドメイン・レベルで簡単に設定できるだけでなく、デプロイメント・ディスクリプタを使用して、アプリケーション内部で固有の設定を行えます。

      追加情報

      WebLogic Serverの使用に関する詳細情報、ドキュメント、およびホワイト・ペーパーについては、Oracle Technology Networkの WebLogic Serverページを参照してください。

      WLDFの使用法の詳細は、次の記事を参照してください。

      Introduction to the WebLogic Diagnostics Framework (WLDF), by Rebecca Sly
      Monitoring Performance Using the WebLogic Diagnostics Framework, by Mike Cico