WLBS 上のすべての接続を正常に閉じるにはどうすればいいですか

WLBS 上のすべての接続を正常に閉じるにはどうすればいいですか

私は冗長性と負荷分散のために、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 秒に短縮するだけで十分かもしれません。

http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/ea116535-8eb9-4c80-8b14-b34418dbfe42.mspx

関連情報