Estou usando WLBS no Windows 2000 para 2 servidores web para redundância e balanceamento de carga. Quando quero desativar um dos serviços, uso "WLBS drenastop" na linha de comando. No entanto, ao monitorar o número de conexões abertas no IIS, demora um pouco para que as conexões existentes sejam fechadas. Se eu executar "WLBS stop", as conexões restantes serão interrompidas por alguns minutos enquanto descobrem que a outra extremidade da conexão não está mais lá. Não precisamos de conexões de longa duração e as solicitações de página são retornadas em menos de 10 segundos. Existe alguma maneira de o WLBS ou o IIS fechar quaisquer conexões abertas e não ativas, para que eu possa remover um servidor do balanceamento de carga sem esperar que todas as conexões abertas fechem sozinhas?
Responder1
Usandoum velho truque dos grupos de discussão de Joeldesligar o keep-alive e, em seguida, executar o WLBS Drainstop foi a chave para que isso funcionasse corretamente. Então escrevi um script em VBS para automatizar tudo. Existem 2 scripts. Um script para remover o nó do cluster e outro para colocar o nó online novamente.
O script de remoção é o seguinte.
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"
E o script para colocar a máquina online novamente é o seguinte.
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"
Você pode alterar a variável IISInstanceName na parte superior do script para corresponder ao nome do seu servidor web. Este é o nome que aparece quando você vai para a seção “Serviços de Informações da Internet” em “Ferramentas Administrativas”. Você pode alterar isso para o nome que você deu ao seu servidor web. No geral é um pouco desajeitado, mas funciona. Também é possível alterar a primeira linha para
Set IISInstance = getObject("IIS://LocalHost/W3SVC/1")
e, em seguida, corte todo o loop for que procura o servidor pelo nome, mas acho que é um pouco mais "correto" encontrar o servidor pelo nome, em vez de por algum número, que não tenho certeza se o Windows mudaria em algumas circunstâncias de adição e remoção de instâncias de servidor web.
Responder2
Apenas reduzir o tempo limite de manutenção de atividade de dois minutos para cerca de 20 segundos pode ser suficiente.