2.3.6 ノード間負荷バランス機能
OpenTP1では,RPCによる要求が特定のノードに集中しないようにノード間で負荷を分散する機能があります。これをノード間負荷バランス機能といいます。
ノード間負荷バランス機能を使用するためには,負荷分散の前提として次の条件を満たしている必要があります。
-
複数のノードに同じサービスを提供するユーザサーバが起動されていること。
-
各OpenTP1ノードはシステム共通定義のall_nodeオペランドに自分以外のノードを定義することによって,お互いのOpenTP1ノードで起動されているユーザサーバの情報(ネーム情報)をやり取りしていること。
ここでは,OpenTP1のノード間負荷バランス機能を使用する場合のクライアント側,サーバ側の関連する定義と処理,およびRPCの処理の内容を説明します。
(1) サーバ側の判断で負荷分散を行う場合
TP1/Serverのスケジュールサービスが,ノードのスケジュール状態に応じて,より効率的に処理できるノードへ負荷を分散させます。
(a) TP1/Client側の定義
クライアント環境定義に次のオペランドを指定または省略する必要があります。
-
DCCLTLOADBALANCE=N(デフォルト)
(b) TP1/Server側の定義
TP1/Server側の定義では,次の設定をする必要があります。
-
スケジュールサービス定義に次のオペランドを指定または省略する。
scd_this_node_first=N(デフォルト)
scd_announce_server_status=Y(デフォルト)
(2) サーバからの負荷情報からクライアント側で判断する場合
サーバから得たサーバの負荷レベルを基に,サービス要求を行うクライアントがOpenTP1ノードを決めてRPCを実行します。
(a) TP1/Client側の定義
クライアント環境定義に次の設定をする必要があります。
-
次のオペランドを指定または省略する。
DCSCDDIRECT=N(デフォルト)
-
次のオペランドを指定する。
DCCLTLOADBALANCE=Y
(b) TP1/Server側の定義
TP1/Server側の定義では,次の設定をする必要があります。
-
スケジュールサービス定義に次のオペランドを指定または省略する。
scd_announce_server_status=Y(デフォルト)
(3) RPC種別による動作の違い
(a) リモートAPI機能を組み合わせた場合
サーバ側の判断で負荷分散を行います。
(b) スケジューラダイレクト機能を組み合わせた場合
スケジューラダイレクト機能を使用したRPCでは,窓口となるTP1/Serverが複数ある場合,DCHOSTオペランドに指定された順番にスケジュールを依頼します。スケジュールを依頼するTP1/Serverは障害が発生するまで切り替えません。
最初のRPCでのサービス要求時に,サービス要求先スケジューラをランダムに選択するには,クライアント環境定義にDCHOSTSELECT=Yを指定します。詳細については,「2.3.12 窓口となるTP1/Serverの負荷分散」を参照してください。
(c) ネームサービスを使用したRPCを組み合わせた場合
ネームサービスを使用したRPCでは,窓口となるTP1/Serverのネームサービスにサービス情報を問い合わせ,ネームサービスからの応答メッセージを基にサービス要求先スケジューラを決定します。
RPCごとにサービス要求先スケジューラを分散させる場合は,クライアント環境定義にDCCLTLOADBALANCE=Yを指定します。これによって,TP1/Clientは,ネームサーバから複数のサービス要求先スケジューラの情報を取得し,負荷レベルが最も低いサービス要求先スケジューラの情報をキャッシュに格納します。
キャッシュに格納されるサービス要求先スケジューラの情報は,1つだけではなく,複数の場合もあります。
キャッシュに格納されたサービス要求先スケジューラの情報が複数ある場合,最初のサービス要求先スケジューラは,ランダムに選択されます。RPCでのサービス要求が2度目以降の場合は,サービス要求先スケジューラの情報を取得するためにキャッシュを参照し,RPCごとにラウンドロビン方式でサービス要求先スケジューラを切り替え,分散させます。
クライアントからのRPC実行時に,このキャッシュ領域中に該当するサービス情報が存在する場合には,窓口となるTP1/Serverのネームサービスに対してサービス情報の問い合わせを行いません。クライアントではLRU(Least Recently Used)方式でキャッシュを管理しているため,キャッシュ領域が不足した場合には参照されていないサービス情報から順に削除します。また,クライアント環境定義のDCCLTCACHETIMオペランドに指定した有効時間が過ぎたサービス情報は,RPC実行時にキャッシュ領域から削除され,ネームサービスに対してサービス情報を問い合わせます。
サーバが129以上のマルチノードサーバ構成で,窓口となるTP1/Serverでネームサービス定義に「nam_service_extend=1」を指定している場合,クライアント環境定義にDCCLTNAMEXTEND=1を指定してください。この定義の指定で,クライアントがネームサービスから一度に取得できるサービス情報の最大数を128個から512個に拡張できます。
- 注意事項
-
-
クライアント環境定義のDCCACHEオペランドの指定値を大きくすると,多くのサービス情報を格納でき,窓口となるTP1/Serverのネームサービスとの通信回数を削減できます。ただし,多くのキャッシュ領域中からサービス情報を検索するのでオーバヘッドが掛かります。
-
クライアント環境定義のDCCACHEオペランドの指定値を小さくすると,キャッシュ領域に該当するSPPの各ノードのサービス情報が入りきらないことがあります。その場合は,クライアントから再度RPCを実行しても,キャッシュ領域に入りきらなかったノードのスケジュールサービスに対してはRPC要求を実行しません。
-
クライアント環境定義のDCCLTCACHETIMオペランドの指定値を小さくすると,古いサービス情報は直ちに削除され,窓口となるTP1/Serverのネームサービスに新しいサービス情報を問い合わせます。この場合,常に最新のサービス情報をキャッシュ領域に保持できるため,サーバの負荷に応じてRPC要求を振り分けられます。ただし,ネームサービスとの通信回数が増え,また,キャッシュ領域の書き換え処理にもオーバヘッドが掛かります。
-
クライアント環境定義のDCCLTCACHETIMオペランドの指定値を大きくすると,窓口となるTP1/Serverのネームサービスとの通信回数を削減できます。ただし,SPPの状態変化への対応が遅れるため,SPPが停止したノードのスケジューラに対してRPC要求を実行してしまうことがあります。この場合は,クライアントが別のノードに対してRPC要求を実行する前に,キャッシュ領域中の該当するサービス情報を削除し,窓口となるTP1/Serverのネームサービスに対して,該当するサービス情報の削除要求をします。
-
(d) 通信先を指定したRPCを組み合わせた場合の動作
通信先を指定した遠隔サービスの要求の場合,クライアント環境定義のDCCLTONLYTHISNODEオペランドの指定値がN,または指定値を省略したときは,サービス要求を受け付けたスケジュールサービスのノード優先で負荷分散を行います。クライアント環境定義のDCCLTONLYTHISNODEオペランドの指定値がYのときは,負荷分散を行いません。
(e) サーバ側のクライアント拡張サービスを組み合わせた場合
サーバ側の判断で負荷分散を行います。