Я использую WLBS в Windows 2000 для двух веб-серверов для резервирования и балансировки нагрузки. Когда я хочу отключить одну из служб, я использую "WLBS Drainstop" из командной строки. Однако из-за отслеживания количества открытых соединений в IIS для закрытия существующих соединений требуется довольно много времени. Если я запустил «WLBS stop», оставшиеся соединения зависнут на пару минут, пока они выяснят, что другого конца соединения больше нет. Нам не нужны длительные соединения, а запросы страниц возвращаются менее чем за 10 секунд. Есть ли способ для WLBS или IIS закрыть любые открытые, неактивные соединения, чтобы я мог отключить сервер от балансировки нагрузки, не дожидаясь, пока все открытые соединения закроются сами по себе?
С помощью старый трюк от дискуссионных групп Джоэла выключения 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, который ищет сервер по имени, но я думаю, что немного более «правильнее» найти сервер по имени, а не по некоторому номеру, который я не уверен, изменится ли окно под некоторые обстоятельства добавления и удаления экземпляров веб-сервера.
Достаточно просто уменьшить время ожидания поддержки активности с двух минут до ~ 20 секунд.