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. |
|