複数の運用サーバによる処理の負荷分散を行う

 XCuteは運用サーバ機を最大26台まで増設し処理を分散することができます。
プロジェクトの増加やユーザーの増加により、結果を表示するまでの時間が掛かるなど1台のサーバ機でリソースが枯渇するような場合に運用サーバ機を増設して対処します。


 上の図はProwebXとProWebSの2台の実行サーバを使い負荷分散を行っている例です。
 各実行サーバのXCuteインストールフォルダに存在するproles.iniファイルのProWebA2ZXSなど重複しない値に設定します。 ProWebA2Zの値はリクエストの割り振りに使用され、アルファベットの逆順に優先度が高くなりますので、高スペックのコンピュータをZ側に割り当てると効率的です。
 [CGI]セクションの他の値は、2つのコンピュータで同じ値を保持するようにします。  特にCGI_PATH 項が各実行サーバ機共に同一のprocgiフォルダを参照するようにしてください。また、CGIに対するコンフィグレーションは、各ProWebごとのproles.iniファイルで共通化する必要があります。  これは、最後に立ち上がったProWebがCGI用のパラメータを上書きするためです。
 CGIパラメーターはC:\InetPub\procgi(バージョン番号)\initial\procgi.ini ファイルに設定が書き込まれます。  このファイルに書き込まれるパラメータはproles.iniファイルの説明に「複数の運用サーバによる処理の負荷分散時の共通項目」の記載がありますので参照願います。
 C:\InetPub\procgi(バージョン番号)\initial\procgi.ini ファイルを、C:\InetPub\procgi(バージョン番号)\initial\procgi_def.ini ファイルという名前でコピーして作成すると、そのファイルを優先してCGIが読み込むようになります。これにより、CGI用のパラメータの共通化を意識する必要がなくなります。この機能は、XCute Build (12or14).18.1以降より利用できます。

 動作メカニズムは、以下のようになります。まず、ProWeb.exeが起動する際、proles.iniファイルのProWebA2Zを読み取り自分はXマシンと理解し、Loginプロジェクトを起動すると共にHTTPサーバマシンのC:\InetPub\procgi(バージョン番号)\procgi\alive フォルダーにLogin_x.alvファイルを作成します。alvファイルはXCuteが起動中であることを意味します。
 HTTPサーバは、ブラウザからのリクエストを受け取ると、procgi.exe を起動しクエリーストリングを知らせます。起動されたprocgi.exe は、クエリーストリングを解析し P=Loginを見つけ出すとともに、C:\InetPub\procgi(バージョン番号)\alive フォルダーのLogin_x.alvファイルの存在からXマシンが生きていることを知り、C:\InetPub\procgi(バージョン番号)\temp フォルダーにこのクエリーストリングでLogin_x1234567890123.srt などのsrtファイルを作ります。 ファイル名の「1234567890123」は、13桁の重複しない固有番号です。

 ProWebXマシンは、C:\InetPub\procgi(バージョン番号)\temp フォルダーにLogin_X*.srtファイルを見つけると、LoginプロジェクトのProLes.exesrtファイルがあることを連絡します。  LoginプロジェクトのProLes.exeは、srtファイルを読み取って、パラメータを解析し、データベースにアクセスするなどしてExcelシートを作り、これをHTMLファイルに変換します。 その結果は、C:\InetPub\procgi(バージョン番号)\temp フォルダーに、HTMLファイルLogin_z1234567890123.htmp同名のendファイルを作成します。
 procgi.exe は、C:\InetPub\procgi(バージョン番号)\procgi\temp フォルダーにLogin_z1234567890123.htmpを見つけると、これを読み取ってHTTPサーバへ返しsrtファイルを削除し、ブラウザからのリクエストに応答した1サイクルの処理を終えます。endファイルはProWeb.exeにより削除されこの処理が正常終了と見なされます。
 なお、srtファイルが作られ、ProLes.exe側がproles.iniのTimeOut時間内にendファイルを作れなかった場合、ProWeb.exeの実行欄は赤色に変わり「Abnormal End」(異常終了)となり、ProWeb.exeによりalvファイルは削除されます。
 「Abnormal End」が発生しても、ProLes.exe側がendファイルの作成に成功すると、ProWeb.exeによりalvファイルは再び作成され、この「Abnormal End」は自動的に解除されサービスは続行されます。

複数の運用サーバによる処理の負荷分散
 運用サーバを複数使うと、通常版より高度な負荷分散を行うことができます。
この時は、proles.iniファイルの[Proweb]セクションのScalableを「1」にします。

Scalable=1 の効果
 上図でXマシンが、httpサーバとのネットワークの通信障害や、XあるいはSマシンのダウンが発生した際、リクエストはダウンしたマシンに送信されず、生きているマシンにのみ送信されます。
 さらに、ネットワーク通信が回復した時、XCuteも自動復旧します。
 なお、「Scalable=1」でない場合は、httpサーバとのネットワークの通信障害が発生しても、procgi.exe よりsrtファイルは送られてしまい、ダウンしているマシンにもリクエストが要求されてしまいます。

通信障害発生時のXCuteの動作の詳細)
 alvファイルの作成や削除はProWeb.exeの役割です。しかし、通信障害が発生したらProWeb.exeはこの役割を行えません。  このため、「Scalable=1」の時に限り、procgi.exe srtファイルを作成した後にTimeOutが発生したなら、すなわち時間内にhtmlファイルが作られなかったら、alvファイルを削除することにしています。  すなわち、通信障害が発生したことをprocgi.exeが検知し、障害発生先のサーバにはsrtファイルを送らない仕組みを成り立たせています。

 通信障害が発生した時の最初のブラウザ画面で、「Scalable=1」が設定されているなら、この画面でprocgi.exeは障害を検知しalvファイルを削除し、通信が復旧するまで当該マシンへsrtファイルを依頼することはなくなります。  なお、「Scalable=1」以外の場合は、障害マシンへsrtファイルを依頼してしまいます。

下記は、この時のProWeb.exeがログで、通信障害(パスがみつからない)の発生と、その後の通信障害の復旧(Err Recovered) のログです。
-----
20/07/07 16:15:50 [3037] ネットワーク パスが見つかりません。
 Err=57
 Fatal Disk Err Occured.
20/07/07 16:17:02 [3036]  Err=57
 Fatal Disk Err  Recovered.
-----

ProWeb.exeは、「Scalable=1」とは関係なく常に、procgi.exeとの通信を監視して通信障害が復旧すると、alvファイルを再度作成して、XCuteの自動復旧に貢献しています。

ODBC接続障害発生時のXCuteの動作の詳細)
 ODBC接続障害を検出するのは、データベースと接続しているProLes.exe側です。  ODBC接続障害を検知し、且つ「Scalable=1」が設定されているなら、タイマーを掛けてODBC接続障害の復旧を待ちます。
 ODBC接続障害が復旧すれば、endファイルを作りProWeb.exe「Abnormal End」を解消させ、alvファイルも作成して、サービスは再開されます。
「Scalable=1」のとき、ODBC接続障害発生時のブラウザ画面には、以下のようなメッセージ画表示されます。
-----
エラー: 処理がタイムアウトしました。 経過時間(秒) = 40 Error Code = procgi10
-----

「Scalable=0」、すなわちScalable無効のときは、ODBC接続障害発生時のブラウザ画面には、以下のようなメッセージが表示されます。
-----
[6044] 3146ODBC;DSN=aaaa;UID=bbbb;PWD=cccc;Err Read Table=ERR=接続が無効にされています。
-----

下記は、「Scalable=1」のProLes.exe側のエラーログで、「[6044] 3146ODBC」でエラーが発生し、その後、何らかの手段でODBCエラーを復旧し、自動でODBC Recover「 [2093] Err DB接続に失敗後回復(Recover:)」 された様子を示します。
-----
20/07/07 14:52:48 tests!aaa [6044] 3146ODBC;DSN=aaaa;UID=bbbb;PWD=cccc;Err Read Table=ERR=接続が無効にされています。 CGIPara=...
20/07/07 14:53:20 tests!aaa [2093] Err DB接続に失敗後回復(Recover:)[6044] 3146ODBC;DSN=aaaa;UID=bbbb;PWD=cccc;Err Read Table=ERR=接続が無効にされています。 CGIPara=...
-----

※ODBC Recoverをご利用の際は、実際に動作させる環境で動作を検証したのちご利用ください。

利用用可能バージョン(Scalable)
XCute Ver11.6.1以降

参照
 ○運用サーバについて
 ○proles.iniファイル