¿Cómo cierro limpiamente todas las conexiones en WLBS?

¿Cómo cierro limpiamente todas las conexiones en WLBS?

Estoy usando WLBS en Windows 2000 para 2 servidores web para redundancia y equilibrio de carga. Cuando quiero desactivar uno de los servicios, uso "WLBS Drainstop" desde la línea de comando. Sin embargo, al monitorear la cantidad de conexiones abiertas en IIS, lleva bastante tiempo cerrar las conexiones existentes. Si ejecuto "WLBS stop", las conexiones restantes se bloquearán durante un par de minutos mientras descubren que el otro extremo de la conexión ya no está allí. No necesitamos conexiones de larga duración y las solicitudes de página se devuelven en menos de 10 segundos. ¿Hay alguna forma de que WLBS o IIS cierren las conexiones abiertas no activas, de modo que pueda eliminar un servidor del equilibrio de carga sin esperar a que todas las conexiones abiertas se cierren solas?

Respuesta1

Usandoun viejo truco de los grupos de discusión de JoelDe desactivar Keep-Alive y luego ejecutar WLBS Drainstop fue la clave para que esto funcionara correctamente. Luego escribí un script en VBS para automatizar todo. Hay 2 guiones. Un script para eliminar el nodo del clúster y otro para volver a poner el nodo en línea.

El script de eliminación es el siguiente.

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"

Y el script para volver a poner la máquina en línea es el siguiente.

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"

Puede cambiar la variable IISInstanceName en la parte superior del script para que coincida con el nombre de su servidor web. Este es el nombre que aparece cuando vas a la sección "Servicios de información de Internet" en "Herramientas administrativas". Puede cambiar esto al nombre que haya asignado a su servidor web. En general es un poco complicado, pero funciona. También es posible cambiar la primera línea a

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

y luego corte todo el bucle for que busca el servidor por nombre, pero creo que es un poco más "correcto" encontrar el servidor por nombre, en lugar de por algún número, lo cual no estoy seguro si Windows cambiaría en algunas circunstancias de agregar y eliminar instancias de servidor web.

Respuesta2

Simplemente reducir el tiempo de espera de mantenimiento de dos minutos a ~20 segundos podría ser suficiente.

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

información relacionada