私は冗長性と負荷分散のために、Windows 2000 で 2 台の Web サーバーに WLBS を使用しています。サービスの 1 つを停止したいときは、コマンド ラインから「WLBS ドレインストップ」を使用します。しかし、IIS で開いている接続の数を監視すると、既存の接続が閉じられるまでにかなり時間がかかります。「WLBS 停止」を実行すると、残りの接続は、接続のもう一方の端がなくなったと判断するまで数分間ハングします。長時間の接続は必要なく、ページ要求は 10 秒未満で返されます。WLBS または IIS で開いている非アクティブな接続をすべて閉じて、開いている接続がすべて閉じられるのを待たずに負荷分散からサーバーを削除できるようにする方法はありますか?
答え1
使用ジョエルのディスカッショングループからの古いトリックキープアライブをオフにして、WLBS ドレインストップを実行することが、これを適切に動作させるための鍵でした。次に、全体を自動化するスクリプトを VBS で作成しました。スクリプトは 2 つあります。1 つはノードをクラスターから削除するスクリプトで、もう 1 つはノードをオンラインに戻すスクリプトです。
削除スクリプトは次のとおりです。
Set IISOBJ = getObject("IIS://LocalHost/W3SVC")
Dim IISInstance
Dim FoundIIS
Dim IISInstanceName
Dim NumConnections
Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
IISInstanceName = "Default Web Site"
FoundIIS = False
For each IISInstance in IISOBJ
If (IISInstance.Class = "IIsWebServer") Then
If (IISInstance.ServerComment = IISInstanceName) Then
IISInstance.Put "AllowKeepAlive", False
IISInstance.SetInfo()
FoundIIS = True
Exit For
End If
End If
Next
If Not FoundIIS Then
WScript.Echo "Could Not Find IIS. Exiting."
Wscript.quit()
End If
WSHShell.Run "wlbs drainstop" , 0, true
WScript.Echo " Going To Sleep For: " & IISInstance.Get("ConnectionTimeout") & " Seconds"
WScript.Sleep IISInstance.Get("ConnectionTimeout") * 1000
WSHShell.Run "wlbs stop" , 0, true
WScript.Echo "Successfully removed node from load balancing"
マシンをオンラインに戻すためのスクリプトは次のとおりです。
Set IISOBJ = getObject("IIS://LocalHost/W3SVC")
Dim IISInstance
Dim FoundIIS
Dim IISInstanceName
IISInstanceName = "Default Web Site"
FoundIIS = False
For each IISInstance in IISOBJ
If (IISInstance.Class = "IIsWebServer") Then
If (IISInstance.ServerComment = IISInstanceName) Then
IISInstance.Put "AllowKeepAlive", True
IISInstance.SetInfo()
FoundIIS = True
Exit For
End If
End If
Next
If Not FoundIIS Then
WScript.Echo "Could Not Find IIS. Exiting."
Wscript.quit()
End If
Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.Run "wlbs start" , 0, true
WScript.Echo "Successfully added node to load balancing"
スクリプトの先頭にある IISInstanceName 変数を、Web サーバーの名前に合わせて変更できます。これは、「管理ツール」の「インターネット インフォメーション サービス」セクションに移動したときに表示される名前です。これを、Web サーバーに付けた名前に変更できます。全体的に少し不格好ですが、機能します。最初の行を次のように変更することもできます。
Set IISInstance = getObject("IIS://LocalHost/W3SVC/1")
次に、サーバーを名前で検索する for ループ全体を削除しましたが、サーバーを番号ではなく名前で検索する方が少し「正しい」と思います。Web サーバー インスタンスの追加や削除などの状況によっては、Windows が変更するかどうかはわかりません。
答え2
キープアライブのタイムアウトを 2 分から約 20 秒に短縮するだけで十分かもしれません。