2.3.12 窓口となるTP1/Serverの負荷分散
CUPから一斉にサービスを要求した場合,一つの窓口となるTP1/Serverのネームサービスに問い合わせが集中してしまうので,負荷が集中してしまうことになります。しかし,TP1/Clientが複数の窓口となるTP1/Serverの中からランダムに選択すれば,窓口となるTP1/Serverへの負荷を分散できます。
(1) 窓口となるTP1/Serverをランダムに選択する
窓口となるTP1/Serverをランダムに選択するには,クライアント環境定義DCHOSTSELECTにYを指定します。
CUPからサービスを要求する場合,dc_clt_cltin_s関数の引数target_host,またはクライアント環境定義DCHOSTに指定された窓口となるTP1/Serverのネームサービスに,要求するサービスがどのノードにあるかを問い合わせます。
複数の窓口となるTP1/Serverを指定している場合,複数指定されたホストの中からランダムに選択します。障害発生時は,障害となったホストを除外した残りのホストの中からランダムに選択します。
- 〈例〉次の指定の場合
DCHOST=hostA,hostB,hostC DCHOSTSELECT=Y
-
dc_clt_cltin_s関数発行
hostA,hostB,hostCからランダム選択
hostBとの接続に成功
-
dc_rpc_call_s関数発行
hostBとの接続障害発生
障害となったhostBを除いてランダム選択
hostAとの接続障害発生
hostCを選択
hostCとの接続に成功
-
dc_rpc_call_s関数発行
hostCとの接続障害発生
障害となったhostCを除いてランダム選択
hostBとの接続障害発生
hostAを選択
hostAとの接続障害発生
選択対象ホストがなくなり関数はエラーリターン
-
dc_rpc_call_s関数発行
hostAとの接続に成功
-
dc_clt_cltout_s関数発行
-
dc_clt_cltin_s関数発行
hostA,hostB,hostCからランダム選択
-
(2) 窓口となるTP1/Serverを優先して負荷分散する
TP1/Serverでは,サービス要求を各ノードに振り分けてノード間の負荷を分散しています。これによって,サービス要求を受け付けたノードのスケジュールサービスは,負荷を分散させるために,別のノードにあるTP1/Serverにサービス要求を転送する場合があります。
しかし,TP1/Client側で窓口となるTP1/Serverをランダムに選択していた場合は,すでに選択された窓口となるTP1/Serverから,さらに別のノードにあるTP1/Serverへ振り分けられることになります。このため,オーバヘッドが掛かることがあります。
このような現象を回避するために,TP1/Client側で選択した窓口となるTP1/Serverを優先して負荷を分散できます。窓口となるTP1/Serverを優先して負荷を分散するには,クライアント環境定義DCSCDLOADPRIORITYにYを指定します。
この定義は,ネームサービスを使用しないRPCを行う場合(クライアント環境定義DCSCDDIRECTにYを指定)だけ,有効です。
- 注意事項
-
窓口となるTP1/Serverを優先して負荷分散した場合,あるノードのTP1/Serverが障害によって停止すると,そのTP1/Serverを窓口としていたTP1/Clientは,別の窓口となるTP1/Serverに切り替えます。その後,停止したTP1/Serverが再起動されても,TP1/Clientは現時点で窓口となっているTP1/Serverを優先します。そのため,再起動したTP1/Serverは,負荷が低い状態であっても,このTP1/Clientからのサービス要求が入りにくくなります。
なお,窓口としているTP1/Serverを変えるには,クライアントユーザの認証解除(dc_clt_cltout関数またはdc_clt_cltout_s関数)およびクライアントユーザの認証要求(dc_clt_cltin_s関数)の再実行が必要です。これによって,再起動したTP1/Serverが窓口となるTP1/Serverに割り当てられることがあります。