ヘッダーをスキップ

Oracle HTTP Server スタンドアロン・デプロイの管理Apache 2.0ベース
10g(10.1.3.1.0)

B31848-02
目次
目次
索引
索引

戻る 次へ

A mod_oc4jを使用したロード・バランシング

この付録では、メトリック・ベースのロード・バランシングも含め、mod_oc4jによるロード・バランシングについて説明します。

内容は、次のとおりです。

A.1 ロード・バランシング・ポリシー

この項では、mod_oc4jでサポートされているロード・バランシング・ポリシーについて説明します。

A.1.1 ランダム

mod_oc4jは、リクエストを処理する候補である、OC4JインスタンスのリストからOC4Jインスタンスをランダムに選択します。

A.1.2 ラウンドロビン

mod_oc4jは、リクエストを処理する候補である、OC4Jインスタンスの順序付きリストからランダムにOC4Jインスタンスを選択します。他のOC4Jインスタンスは、最初に選択されたサーバーが再度選択されるまで、順序付きリストから順番に選択されます。この順序が繰り返されます。特定のOC4Jインスタンスが停止されるか使用不可になると、そのインスタンスは稼働状態に戻れるまでスキップされます(選択されません)。

A.1.3 ローカル・アフィニティを考慮したランダム

mod_oc4jは、リクエストを処理するローカルOC4Jプロセスをランダムに選択します。使用可能なローカルOC4Jプロセスがない場合、mod_oc4jはリモートOC4Jプロセスをランダムに選択し、選択の機会を均等にします。

A.1.4 ローカル・アフィニティを考慮したラウンドロビン

mod_oc4jは、すべてのリクエストをローカルOC4Jプロセスにラウンドロビン方式でルーティングします。使用可能なローカル・プロセスがない場合、mod_oc4jはリクエストを様々なホスト上の各OC4Jプロセスに均等にルーティングします。

A.1.5 ルーティングの重みを使用したランダム

mod_oc4jは、各ホストに対して構成されているルーティングの重みに従ってリクエストを配分します。そのホスト上のOC4Jプロセスから1つがランダムに選択されます。

A.1.6 ルーティングの重みを使用したラウンドロビン

mod_oc4jは、各ホストに対して構成されているルーティングの重みに基づいて、リクエスト・ロードの合計を各ホスト上のOC4Jプロセスに配分します。そのホスト上のOC4Jプロセスの中からラウンドロビン方式で1つ選択されます。

A.1.7 メトリック・ベース

mod_oc4jは、OC4Jプロセスに対して発生可能なロードの量を示す、OC4Jプロセスからのランタイム・メトリックに基づいて、リクエストをルーティングします。

A.1.8 ローカル・アフィニティを考慮したメトリック・ベース

mod_oc4jは、OC4Jプロセスのランタイム・パフォーマンス・メトリックに基づいて、すべてのリクエストをローカルOC4Jプロセスにルーティングします。使用可能なローカルOC4Jプロセスがない場合、mod_oc4jはパフォーマンス・メトリックのみに従って異なるホスト上の各OC4Jプロセスにリクエストをルーティングします。

A.2 ロード・バランシング・パラメータ

この項では、次のロード・バランシング・パラメータについて説明します。

A.2.1 Oc4jSelectMethod

ロード・バランシング用のOC4Jインスタンスを選択します。

カテゴリ   

構文 

Oc4jSelectMethod roundrobin | roundrobin:local | roundrobin:weighted | random | random:local | random:weighted | metric | metric:local  

必須 

なし 

デフォルト 

Oc4jSelectMethodを指定しないと、Oc4jSelectMethod roundrobinがデフォルトになります。  

例 

Oc4jSelecctMethod random:local

Oc4jSelecctMethod metric 

使用方法 

 

このディレクティブは、Oracle Application Server 10gリリース3(10.1.3.1.0)のベース・サーバーに対してのみ適用され、VirtualHostコンテナ内で指定された場合は、起動時にエラーが出力されます。

A.2.2 Oc4jRoutingWeight

ロード・バランシング中に、リクエストのルーティングの重みを各マシンに関連付けます。重み付けされたルーティングとは、予測されるロード処理能力に基づいて各マシンに割り当てられた、事前定義済の値に従ってリクエストを分散するロード・バランシング手段です。

カテゴリ   

構文 

Oc4jRoutingWeight <node_name> <routing_weight> 

必須 

なし 

デフォルト 

ルーティングの重みが1である、全ノード上のOC4Jプロセスがデフォルトです。Oc4jRoutingWeightが指定され、一部のホストが指定されていない場合は、ルーティングの重みが1である非指定ノード上のOC4Jプロセスがデフォルトになります。  

例 

  • Oracle Application Serverクラスタに2つのホストHost_AおよびHost_Bがあります。各ホストでは、Oracle HTTP ServerおよびOC4Jプロセスが実行されています。

    Oc4jSelectMethod random:local 
    Oc4jRoutingWeight Host_A 3 
    Oc4jRoutingWeight Host_B 2 
    

    Oc4jRoutingWeightディレクティブは無視されます。Host_Aのmod_oc4jはすべてのリクエストをHost_AのOC4Jプロセスにランダムにルーティングし、Host_Bのmod_oc4jはすべてのリクエストをHost_BのOC4Jプロセスにランダムにルーティングします。

  • Oracle Application Serverクラスタに4つのホストHost_A、Host_B、Host_CおよびHost_Dがあります。各ホストでは、Oracle HTTP ServerおよびOC4Jプロセスが実行されています。

    Oc4jSelectMethod roundrobin:weighted 
    Oc4jRoutingWeight Host_A 3 
    Oc4jRoutingWeight Host_B 2 
    

    すべてのマシン上のmod_oc4jはラウンドロビン方式に従って、Host_Aで実行中のOC4Jプロセスにリクエスト数の3倍をルーティングし、Host_Bでリクエスト数の2倍をルーティングし、Host_Cでリクエスト数をルーティングし、Host_Dでリクエスト数をルーティングします。

  • Oracle Application Serverクラスタに4つのホストHost_A、Host_B、Host_CおよびHost_Dがあります。各ホストでは、Oracle HTTP ServerおよびOC4Jプロセスが実行されています。

    Oc4jSelectMethod roundrobin:weighted 
    

    すべてのマシン上のmod_oc4jは、Host_A、Host_B、Host_CおよびHost_D上のOC4Jプロセスにラウンドロビン方式でリクエストを均等にルーティングします。

 

使用方法 

Oc4jRoutingWeightは、Oc4jSelectMethodで重み付けが指定された場合にのみ考慮されます。

Oc4jRoutingWeight <node_name> <routing_weight>は、各ノードにリクエストのルーティングの重みを関連付けます。node_nameは、ホスト名形式またはIPアドレス形式です。複数のインタフェースを持つホストで異なるインタフェースが指定された場合は、異なるホストとみなされます。 

このディレクティブは、Oracle Application Server 10gリリース3(10.1.3.1.0)のベース・サーバーに対してのみ適用され、VirtualHostコンテナ内で指定された場合は、起動時にエラーが出力されます。

A.3 メトリック・ベースのロード・バランシング

メトリック・ベースのロード・バランシングとは、各OC4Jから報告される負荷状態メトリックに基づいて、OC4J間でリクエスト・ロードを分散する方法です。メトリックの範囲は0〜100です。0は非常にビジーな(過負荷の)状態、100はビジーではない(負荷のかかっていない)状態を示します。メトリック・ベースのロード・バランシングが有効になっている場合、個々のOC4Jから受信したメトリックをすべてのOC4Jから受信したメトリックの合計で割った比率に基づいて、OC4J間でリクエストが分散されます。

たとえば、OC4Jプロセスp1がメトリック20を、プロセスp2がメトリック40を、プロセスp3がメトリック90を報告したとします。リクエストは次のように分散されます。

メトリック・ベースのロード・バランシングを有効化するには、Oracle HTTP ServerとOC4Jを構成する必要があります。次の各項で、必要な構成について説明します。

A.3.1 Oracle HTTP Serverの構成

Oracle HTTP Server側で、mod_oc4j.confOc4jSelectMethod metricまたはOc4jSelectMethod metric:localを指定します。

関連項目

 

A.3.2 OC4Jの構成

OC4J側では、UNIXの場合はORACLE_HOME/j2ee/home/config/server.xmlに、Windowsの場合はORACLE_HOME¥j2ee¥home¥config¥server.xmlに、メトリック・コレクタを構成する必要があります。<metric-collector>要素を構成することで、mod_oc4jへのメトリック送信を開始するようOC4Jに指示すると、mod_oc4jは使用可能なOC4Jインスタンスに受信リクエストを分散してロード・バランシングを行うためのルーティングの決定を下せるようになります。

OC4Jからmod_oc4jに送信されるメトリックは、メトリック・ベースのロード・バランシングがmod_oc4jに対して指定されており、かつOC4JがOracle Application Server環境で実行されている場合にのみ使用されます。

mod_oc4jにメトリック・ベースのロード・バランシングを指定し、server.xml<metric-collector>要素を指定しない場合、mod_oc4jはOC4Jからメトリックが送信されることを期待しますが、OC4Jはメトリックを送信しません。この場合、mod_oc4jは次の警告メッセージを発します。

No run time metrics for oc4j(opmnid=%s) in notification Oc4jSelectMethod is
configured to use run time metrics, please make sure OC4J side is configured
accordingly. Default to 50.

この場合、mod_oc4jは各OC4Jプロセスに対して値50を使用し、続行します。

同様に、server.xml<metric-collector>要素を指定し、mod_oc4jにメトリック・ベースのロード・バランシングを指定しない場合、OC4Jはメトリックを送信しますが、mod_oc4jはメトリックを受信するように構成されていません。この場合、mod_oc4jはメトリックを無視し、構成されているロード・バランシング方式が何であろうとそれを使用します。ロード・バランシング方式はOc4jSelectMethodで指定します。Oc4jSelectMethodが指定されていない場合、mod_oc4jはデフォルトのラウンドロビン方式を使用します。

このOracle HTTP Serverインスタンスで使用されるOC4Jは、すべて同じ構成になるようにしてください。そうしないと、OC4Jから返された数を比較できず、ロード・バランシングの成果がほとんど得られない可能性もあります。

mod_oc4jがメトリック情報を含む通知をOC4Jから受信すると、リクエストのルーティング処理がただちに変更されます。OC4Jからのデフォルトの通知間隔は30秒です。この値は、システム・プロパティopmnPingIntervalを使用して構成できます。このプロパティは、OC4JがOPMNによって起動されるときに、コマンドライン上で渡されます。通知間隔を変更するには、opmn.xmlOC4J <process-set>構成要素の下に、次のように指定します。

<module-data> 
  <category id="start-parameters"> 
    <data id="java-options" value="-DopmnPingInterval=<new ping interval value>"/>
  </category> 
</module-data>

関連資料

『Oracle Process Manager and Notification Server管理者ガイド』 

OC4Jのメトリックの指定

次の2つの方法でOC4Jのメトリックを指定できます。

A.3.2.1 DMSMetricCollectorを使用するメトリック・ベースのロード・バランシングの構成

このデフォルトの方法では、<metric-collector>要素はclassnameという単一の属性を取ります。この属性は、サーバー単位のメトリックを収集および計算するためのインタフェースを定義します。DMSベースのメトリック・コレクタを使用する場合、classname属性でoracle.oc4j.server.DMSMetricCollectorを使用します。DMSMetricCollectorインスタンスはいくつかのパラメータを取ります。

DMSメトリックは、次の構成例のとおり、dms-nounパラメータを使用して指定します。このメトリックは、DMSMetricCollectorの計算のベースとなるものです。メトリック・ベースのロード・バランシングでは、DMSメトリック/oc4j/default/WEBS/processRequest.timeの使用をお薦めします。このメトリックは、デフォルトのWebアプリケーションにおけるサーブレットの処理時間を示します。

OC4Jに送信される値は、現在のDMSメトリック値に基づいて計算された値と前回の値の送信時に計算された値の平均に重み付けしたものです。デフォルトの重みは、現在の値に対しては0.7、前回の値に対しては0.3です。重みを変更するには、次の例に示すようにhistory-proportionを設定します。その結果、現在の値に対する重みは0.8に、前回の値に対する重みは0.2に変更されています。

<metric-collector classname="oracle.oc4j.server.DMSMetricCollector">
   <init-param>
     <param-name>
       dms-noun
     </param-name>
     <param-value>
       /oc4j/default/WEBs/processRequest.time
     </param-value>
   </init-param>
   <init-param>
     <param-name>
       history-proportion
     </param-name>
     <param-value>
       0.2
     </param-value>
   </init-param>
   <init-param>
     <param-name>
       debug
     </param-name>
     <param-value>
       false
     </param-value>
   </init-param>
</metric-collector>

関連資料

DMSメトリックの一覧は、『Oracle Application Serverパフォーマンス・ガイド』を参照してください。 

A.3.2.1.1 DMSメトリックをメトリック・ベースのロード・バランシング用に変換する方法

getMetrics()がコールされると、dms-nounパラメータで指定したDMSメトリックの値が取得されます。前回の測定値のdeltaが計算されます。

スケールは0〜100で、測定値は無限であるため、次の計算式が適用されます。

metric = 100 / (1 + (log (1 + delta)))

前述のとおり、このメトリックは現在の状況に一致するだけでなく、前回のメトリック履歴も反映している必要があります。新しいメトリックを作成するために、前回の履歴に1/3の重みを割り当て、今回収集された平均値に2/3の重みを割り当てることができます。

この新しいメトリックは次のメトリックにとっての履歴となり、考慮される度合いは時間がたつにつれて次第に小さくなります。構成例に示したように、history-proportionパラメータを0.0〜1.0の浮動小数点値に設定することで、前回のメトリックを新しいメトリックに組み込む割合を指定できます。値が大きければ大きいほど履歴値が重要視され、メトリックの揮発性は低くなります。値が小さい場合は、最新のメトリックが反映されます。返されるメトリックは、次のとおりです。

smoothedmetric = ((1 - history-proportion) * metric) + (history-proportion * 
previousmetric)

smoothedmetricが、ロード・バランシング用にmod_oc4jに送信されます。

A.3.2.2 独自のメトリック・コレクタの作成

インタフェースoracle.oc4j.api.MetricCollectorを実装すれば、mod_oc4jに独自のメトリックを送信することができます。メトリックは0〜100の値であることが必要です。

メトリック・コレクタはすべて、インタフェースoracle.oc4j.api.MetricCollectorを実装する必要があります。実際のメトリック・コレクタは、インスタンス化できるように、パラメータの指定されていないコンストラクタを必要とします。

この機能のスキーマ要素は、server.xmlに次のように定義されています。

<metric-collector classname="my.package.name.MyClassName">
  <init-param>
    <param-name>
      mysetting
    </param-name>
    <param-value>
      12345
    </param-value>
  </init-param>
</metric-collector>

前の例のとおり、0個以上のパラメータをメトリック・コレクタに対して設定でき、setParameters()メソッドがコールされると、設定したパラメータがメトリック・コレクタに渡されます。setParameters()の後、setEnabled(true)が一度コールされます。このメソッドは、必要に応じてデータの収集を開始できることをメトリック・コレクタに知らせます。


注意

カスタム・メトリック・コレクタがスレッドを開始する場合、そのスレッドはデーモン・スレッドであることが必要です。デーモン・スレッドでないと、サーバーを正常に停止できない可能性があります。 


oracle.oc4j.api.MetricCollectorの実装後、メトリックをjarファイルにパッケージし、次のコマンドを使用してserver.xmlのライブラリ・パスに追加します。

<library path="<path to>/mymetric.jar"/>
A.3.2.2.1 oracle.oc4j.api.MetricCollector

次に、oracle.oc4j.api.MetricCollectorインタフェースを示します。

package oracle.oc4j.api;
 
 import java.util.Map;
 
 /**
  * Defines an interface for gathering and obtaining a server-wide metric.
  * The metric is used in iAS mode, by mod_oc4j, to load balance between
  * virtual oc4j instances.
  * The metric value is relative, and should be between 0 and 100, both
  * inclusive.
  * When configured for metric load balancing,
  * Mod_oc4j will route preferably to an oc4j with the greater value.
  * <p>Concrete instances of this class must have a public empty constructor in
  * order to be loaded and instantiated.
  */
 public interface MetricCollector {
   /**
    * Support for debugging: This is a property name to set to true in order
    * to display the metric that is sent from the server
    */
   String OC4J_METRIC_DEBUG_PROPERTY = "oc4j.metric.debug";
 
   /**
    * Debugging flag that depends on @{link #OC4J_METRIC_DEBUG_PROPERTY}
    */
   boolean DEBUG = Boolean.getBoolean( OC4J_METRIC_DEBUG_PROPERTY );
 
   /**
    * Initial metric to return when no measurement has been made (property key)
    */
   String OC4J_INITIAL_METRIC_PROPERTY = "oc4j.metric.initial";
   /**
    * Initial metric to return when no measurement has been made.
    * Default is 50
    */
   int INITIAL_METRIC = Integer.getInteger( OC4J_INITIAL_METRIC_PROPERTY, 50 
).intValue();
 
   /**
    * Enabled flag for the collector.
    * @return true if the collector is collecting data
    */
   boolean isEnabled();
 
   /**
    */
   void setEnabled( boolean enabled);
 
   /**
    * The parameters the metric collector is configured with.
    * This method will be called even when the set of parameters is null.
    * @param params the key/value pairs the metric collector is configured with,
    * or <code>null</code> if none
    */
   void setParameters( Map params );
 
   /**
    * @return a metric between 0 and 100, inclusive. 100 is better, 0 is worse
    */
   int getMetric();
 
 }

戻る 次へ
Oracle
Copyright © 2007 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引