Como faço para fechar corretamente todas as conexões no WLBS

2

Estou usando o WLBS no Windows 2000 para 2 servidores da Web para redundância e balanceamento de carga. Quando eu quero tirar um dos serviços, eu uso "WLBS drainstop" na linha de comando. No entanto, a partir do monitoramento do número de conexões abertas no IIS, leva um bom tempo para as conexões existentes serem fechadas. Se eu executar "WLBS stop", as conexões restantes serão interrompidas por alguns minutos, enquanto elas descobrirem que a outra extremidade da conexão não está mais lá. Não temos necessidade de conexões de longa duração e as solicitações de páginas são retornadas em menos de 10 segundos. Existe alguma maneira de o WLBS ou 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 sejam fechadas por conta própria?

    
por Kibbee 11.07.2009 / 03:43

2 respostas

2

Usando um velho truque dos grupos de discussão do Joel de desligar o keep-alive, e em seguida, executar o WLBS drainstop foi a chave para fazer isso funcionar corretamente. Então eu escrevi um script na VBS para automatizar a coisa toda. Existem 2 scripts. Um script para remover o nó do cluster e outro para colocar o nó novamente online.

O Script Remover é 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 novamente on-line é 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 da 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 mudar isso para o que você nomeou 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, recorte o loop inteiro 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 do servidor da web.

    
por 25.09.2009 / 22:18
1

Apenas abaixar o tempo limite de atividade de dois minutos para ~ 20 segundos pode ser suficiente.

link

    
por 11.07.2009 / 10:47