ヘッダーをスキップ

Oracle HTTP Server 管理者ガイド
10g(10.1.3.1.0)

B31847-01
目次
目次
索引
索引

戻る 次へ

D mod_oc4jを使用するロード・バランシング

この付録では、メトリックベースのロード・バランシングを含むmod_oc4jロード・バランシングについて説明しています。内容は、次のとおりです。

ロード・バランシングのポリシー

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

ランダム

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

ラウンドロビン

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

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

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

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

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

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

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

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

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

メトリックベース

mod_oc4jは、OC4Jプロセスで許容できるロードの量を示す、OC4Jプロセスからのランタイム・メトリックに基づいてリクエストをルーティングします。

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

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

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

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

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)のベース・サーバーに対してのみ適用され、VirtualHostコンテナ内で指定された場合は、起動時にエラーが出力されます。

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では1倍、Host_Dでは1倍のリクエストをルーティングします。

  • 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)のベース・サーバーに対してのみ適用され、VirtualHostコンテナ内で指定された場合は、起動時にエラーが出力されます。

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

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

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

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

Oracle HTTP Serverの構成

Oracle HTTP Server側では、Oc4jSelectMethod metricまたはOc4jSelectMethod metric:localmod_oc4j.confで指定します。

関連項目

 

OC4Jの構成

OC4J側で、UNIXの場合はORACLE_HOME/j2ee/home/config/server.xml、Windowsの場合はORACLE_HOME\j2ee\home\config\server.xmlのメトリック・コレクタを構成する必要があります。<metric-collector>要素を構成することで、OC4Jにmod_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を使用して構成できます。これは、OPMNによりOC4Jが起動されたときにコマンドラインで渡されます。通知の間隔を変更するには、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のメトリックの指定

OC4Jのメトリックは、次の2つの方法を使用して指定できます。

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

この付属のメソッドで、<metric-collector>要素は1つの属性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パフォーマンス・ガイド』を参照してください。 

メトリックベースのロード・バランシング用に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に送信されるものです。

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

独自のメトリック・コレクタをmod_oc4jに提供するために、インタフェースoracle.oc4j.api.MetricCollectorを実装できます。メトリックは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)が1回コールされます。これはメトリック・コレクタに、必要に応じてデータ収集を開始できることを知らせます。


注意

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


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

<library path="<path to>/mymetric.jar"/>
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 © 2006 Oracle Corporation.

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