3.2.4 ノード間負荷バランス
OpenTP1は,サービス要求処理の負荷を分散して各ノードに振り分けています。
この負荷分散をノード間負荷バランスといいます。
- 〈この項の構成〉
(1) ノード間負荷バランス機能の前提条件
ノード間負荷バランス機能を使用するには,次の条件を満たしている必要があります。
-
複数のノードに同一のサービスを提供するユーザサーバが起動されている
-
各OpenTP1ノード間は,システム共通定義のall_nodeオペランドに自分以外のノードを定義することで,お互いのOpenTP1ノードで起動されているユーザサーバの情報(ネーム情報)をやり取りしている
- 注
-
ノード間負荷バランス機能は,ノード間でユーザサーバの動作条件がほぼ同じであることを前提としています。選択されるノードによって次に示す条件が大きく異なる場合は,ノード間負荷バランス機能に不適当な環境ですので,同じ名前のサービスグループを複数のノードに配置しないでください。
-
公衆回線の回線料金などの通信コスト
-
回線速度
-
回線品質
-
ノードの単体性能
-
(2) ノード間負荷バランス機能の運用形態
ノード間負荷バランス機能を使用する際の運用形態には,次の二つがあります。
- サーバ側の判断でノード間負荷バランスを行う
-
サーバ側(TP1/Server Base)のスケジューラが,より負荷レベルの低いノードへ要求を転送し,処理を実行します。
- サーバからの負荷情報を基にクライアント側の判断でノード間負荷バランスを行う
-
この形態では,クライアントとして使用しているプログラムによって処理が異なります。
-
クライアントにTP1/Client/PまたはTP1/Client/Wを使用
クライアント側(TP1/Client/PまたはTP1/Client/W)は,サーバ側から得たサーバの負荷レベルの情報を基に,クライアント側でサービス要求を行うOpenTP1ノードを決めてからRPCを行います。
-
クライアントにTP1/Server Baseを使用
クライアント側(TP1/Server Base)は,これから要求を出そうとしているサーバの負荷レベルをすでに知っているため,最初から負荷レベルの低いノードに対してRPCを行います。要求を受け取った時点で,スケジューラは負荷レベルの評価による転送はしないで,自ノードで要求を処理できる状態であれば自ノードで処理し,サーバが閉塞しているとき,および,自ノードのサーバの負荷レベルがLEVEL2で,他ノードに負荷レベルの低いサーバがあるときだけ,ほかのノードに対して処理要求を転送します。
-
ノード間負荷バランスを使用する場合は,次のように定義します。
ノード間負荷バランスの運用形態 |
種別 |
定義内容 |
---|---|---|
サーバ側の判断で負荷分散を行う |
サーバ (TP1/Server Base) |
スケジュールサービス定義
|
クライアント (TP1/Client/P,TP1/Client/W) |
クライアント環境定義
|
|
クライアント側の判断で負荷分散を行う (クライアントにTP1/Client/P,TP1/Client/Wを使用) |
サーバ (TP1/Server Base) |
スケジュールサービス定義
|
クライアント (TP1/Client/P,TP1/Client/W) |
クライアント環境定義
|
|
クライアント側の判断で負荷分散を行う (クライアントにTP1/Server Baseを使用) |
サーバ (TP1/Server Base) |
スケジュールサービス定義
|
クライアント (TP1/Server Base) |
(3) 負荷状態の参照
スケジュールサービス定義でscd_announce_server_status=Yを指定すると,OpenTP1は,30秒以上の任意の間隔でサーバの負荷状態をすべてのノードに通知します。OpenTP1は,サービス要求処理をサーバの負荷状態に応じたノードを選択してスケジュールします。
scd_announce_server_status=Nを指定した場合は,サーバの負荷状態はほかのノードに通知されません。したがって,OpenTP1はランダムにノードを選択してサーバをスケジュールします。
scd_announce_server_statusオペランドの指定は,分散環境を構成するすべてのノードで同じにしてください。指定が異なると,特定のノードに負荷が集中します。
次に示す両方の条件に該当する場合は,scd_announce_server_status=Nを指定してください。
-
同一サービスグループが複数ノードに存在しない環境
-
通信コストの掛かる回線を使用しているなどの理由で,できるだけ通信をしたくない環境
この場合,ノード間負荷バランスをする必要はありません。したがって,そのほかのノードにサーバの負荷状態を通知する必要もありません。scd_announce_server_status=Yを指定すると,サーバの負荷状態を通知するために回線を使用します。サーバが一つのノードだけで起動されている場合は,そのすべてのノードでscd_announce_server_status=Nを指定して,サーバの負荷状態の通知を抑止してください。
(4) 自ノードの優先
ノード間負荷バランスでは,サーバが自ノードにあっても,必ず自ノードにスケジュールされるとは限りません。
要求されたサーバが自ノードにある場合に,自ノードのサーバを優先してスケジュールするときは,スケジュールサービス定義でscd_this_node_first=Yを指定してください。ただし,要求されたサーバが自ノードにない場合,自ノードのサーバが過負荷状態や閉塞状態などでスケジュールできない場合は,ほかのノードにスケジュールします。
ノード間の通信を少なくしたいシステムに有効です。
scd_announce_server_statusオペランドとscd_this_node_firstオペランドの組み合わせを次の表に示します。
(5) ノード間負荷バランスとほかの機能との組み合わせ
ノード間負荷バランスをほかの機能と組み合わせて使用する場合の動作を次の表に示します。
組み合わせる機能 |
ノード間負荷バランスの 使用形態 |
動作 |
---|---|---|
TP1/Clientで常設コネクション |
|
TP1/Server Base側のCUP実行プロセスが,常設コネクションを張ったノードでRPCを行うため,ノード間負荷バランスは,「クライアント側の判断で負荷分散を行う(クライアントにTP1/Server Baseを使用)」と同じ結果になります。 |
TP1/Clientでトランザクション制御API |
|
TP1/Server Base側のトランザクショナルRPC実行プロセスがRPCを行うため,ノード間負荷バランスは,「クライアント側の判断で負荷分散を行う(クライアントにTP1/Server Baseを使用)」と同じ結果になります。 |
リモートAPI機能 |
|
TP1/Server Base側のrapサーバが実際にRPCを行うため,ノード間負荷バランスは,「クライアント側の判断で負荷分散を行う(クライアントにTP1/Server Baseを使用)」と同じ結果になります。 |
(6) ノード間負荷バランスの拡張機能
ノード間の負荷を分散するための拡張機能として,次の指定ができます。
-
LEVEL0のノードへのスケジュール比率の指定
スケジュールサービス定義のschedule_rateオペランドを指定することによって,負荷レベルがLEVEL0のノードへ優先的にスケジュールさせることができます。
-
負荷監視のインタバル時間の指定
ユーザサービス定義およびユーザサービスデフォルト定義のloadcheck_intervalオペランドを指定することによって,サービスグループごとに負荷監視インタバル時間を指定できます。
-
負荷レベルのしきい値の指定
ユーザサービス定義およびユーザサービスデフォルト定義のlevelup_queue_countオペランドおよびleveldown_queue_countオペランドを指定することによって,負荷レベルを決定するしきい値(サービス要求滞留数)をサービスグループごとに指定できます。
-
通信障害時のリトライ回数の指定
スケジュールサービス定義のscd_retry_of_comm_errorオペランドを指定することによって,サービス要求のスケジュール時に通信障害が発生した場合でも,障害ノード以外へのスケジュールをリトライさせることができます。
この指定をしない場合は,通信障害時に再スケジュールしないでエラーリターンします。
なお,この機能は,TP1/Extension 1をインストールしていることが前提です。TP1/Extension 1をインストールしていない場合の動作は保証できませんので,ご了承ください。