Oracle HTTP Server スタンドアロン・デプロイの管理Apache 2.0ベース 10g(10.1.3.1.0) B31848-02 |
|
この付録では、メトリック・ベースのロード・バランシングも含め、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プロセスにリクエストをルーティングします。
この項では、次のロード・バランシング・パラメータについて説明します。
ロード・バランシング用のOC4Jインスタンスを選択します。
カテゴリ | 値 |
---|---|
構文 |
|
必須 |
なし |
デフォルト |
|
例 |
|
使用方法 |
|
このディレクティブは、Oracle Application Server 10gリリース3(10.1.3.1.0)のベース・サーバーに対してのみ適用され、VirtualHost
コンテナ内で指定された場合は、起動時にエラーが出力されます。
ロード・バランシング中に、リクエストのルーティングの重みを各マシンに関連付けます。重み付けされたルーティングとは、予測されるロード処理能力に基づいて各マシンに割り当てられた、事前定義済の値に従ってリクエストを分散するロード・バランシング手段です。
カテゴリ | 値 |
---|---|
構文 |
|
必須 |
なし |
デフォルト |
ルーティングの重みが1である、全ノード上のOC4Jプロセスがデフォルトです。 |
例 |
|
使用方法 |
|
このディレクティブは、Oracle Application Server 10gリリース3(10.1.3.1.0)のベース・サーバーに対してのみ適用され、VirtualHost
コンテナ内で指定された場合は、起動時にエラーが出力されます。
メトリック・ベースのロード・バランシングとは、各OC4Jから報告される負荷状態メトリックに基づいて、OC4J間でリクエスト・ロードを分散する方法です。メトリックの範囲は0〜100です。0は非常にビジーな(過負荷の)状態、100はビジーではない(負荷のかかっていない)状態を示します。メトリック・ベースのロード・バランシングが有効になっている場合、個々のOC4Jから受信したメトリックをすべてのOC4Jから受信したメトリックの合計で割った比率に基づいて、OC4J間でリクエストが分散されます。
たとえば、OC4Jプロセスp1がメトリック20を、プロセスp2がメトリック40を、プロセスp3がメトリック90を報告したとします。リクエストは次のように分散されます。
メトリック・ベースのロード・バランシングを有効化するには、Oracle HTTP ServerとOC4Jを構成する必要があります。次の各項で、必要な構成について説明します。
Oracle HTTP Server側で、mod_oc4j.confにOc4jSelectMethod metric
またはOc4jSelectMethod
metric:local
を指定します。
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.xml
のOC4J <process-set>
構成要素の下に、次のように指定します。
<module-data> <category id="start-parameters"> <data id="java-options" value="-DopmnPingInterval=<new ping interval value>"/> </category> </module-data>
次の2つの方法でOC4Jのメトリックを指定できます。
このデフォルトの方法では、<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>
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
に送信されます。
インタフェース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"/>
次に、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(); }
|
![]() Copyright © 2007 Oracle Corporation. All Rights Reserved. |
|