Как правильно закрыть все соединения на WLBS

Как правильно закрыть все соединения на WLBS

Я использую WLBS в Windows 2000 для 2 веб-серверов для избыточности и балансировки нагрузки. Когда я хочу отключить одну из служб, я использую "WLBS drainstop" из командной строки. Однако, отслеживая количество открытых соединений в IIS, можно сказать, что закрытие существующих соединений занимает довольно много времени. Если я запускаю "WLBS stop", оставшиеся соединения зависнут на пару минут, пока они не поймут, что другой конец соединения больше не существует. Нам не нужны долго работающие соединения, а запросы страниц возвращаются менее чем за 10 секунд. Есть ли какой-то способ для WLBS или IIS закрыть любые открытые неактивные соединения, чтобы я мог удалить сервер из балансировки нагрузки, не дожидаясь, пока все открытые соединения закроются сами собой?

решение1

С использованиемстарый трюк из дискуссионных групп Джоэлавыключения keep-alive и последующего запуска WLBS drainstop было ключом к тому, чтобы все это работало правильно. Затем я написал скрипт на VBS, чтобы автоматизировать все это. Есть 2 скрипта. Один скрипт для удаления узла из кластера, а другой для того, чтобы вернуть узел в строй.

Скрипт удаления выглядит следующим образом.

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 в верхней части скрипта, чтобы она соответствовала имени вашего веб-сервера. Это имя отображается, когда вы переходите в раздел «Службы информации Интернета» в разделе «Административные инструменты». Вы можете изменить его на то, как вы назвали свой веб-сервер. В целом это немного неуклюже, но это работает. Также возможно изменить первую строку на

Set IISInstance = getObject("IIS://LocalHost/W3SVC/1")

и затем вырезать весь цикл for, который ищет сервер по имени, но я думаю, что было бы немного «правильнее» искать сервер по имени, а не по какому-то номеру, который, я не уверен, изменится ли в Windows при некоторых обстоятельствах добавления и удаления экземпляров веб-сервера.

решение2

Может быть достаточно просто уменьшить время ожидания keepalive с двух минут до ~20 секунд.

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

Связанный контент