| Oracle HTTP Server 管理者ガイド
10g(10.1.3.1.0) B31847-01 |
|
この付録では、メトリックベースのロード・バランシングを含む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)のベース・サーバーに対してのみ適用され、VirtualHostコンテナ内で指定された場合は、起動時にエラーが出力されます。
ロード・バランシング中に、リクエストのルーティングの重みを各マシンに関連付けます。重み付けされたルーティングとは、予測されるロード処理能力に基づいて各マシンに割り当てられた、事前定義済の値に従ってリクエストを分散するロード・バランシング手段です。
| カテゴリ | 値 |
|---|---|
|
構文 |
|
|
必須 |
なし |
|
デフォルト |
ルーティングの重みが1である、全ノード上のOC4Jプロセスがデフォルトです。 |
|
例 |
|
|
使用方法 |
|
このディレクティブは、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側では、Oc4jSelectMethod metricまたはOc4jSelectMethod metric:localをmod_oc4j.confで指定します。
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.xmlのOC4J <process-set>構成要素の下で、次の指定を行います。
<module-data> <category id="start-parameters"> <data id="java-options" value="-DopmnPingInterval=<new ping interval value>"/> </category> </module-data>
OC4Jのメトリックは、次の2つの方法を使用して指定できます。
この付属のメソッドで、<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>
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インタフェースは、次のとおりです。
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 © 2006 Oracle Corporation. All Rights Reserved. |
|