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.