J'utilise WLBS dans Windows 2000 pour deux serveurs Web à des fins de redondance et d'équilibrage de charge. Lorsque je veux arrêter l'un des services, j'utilise "WLBS drainstop" à partir de la ligne de commande. Cependant, en surveillant le nombre de connexions ouvertes dans IIS, il faut un certain temps pour que les connexions existantes soient fermées. Si j'exécute "WLBS stop", les connexions restantes vont se bloquer pendant quelques minutes, le temps qu'elles comprennent que l'autre extrémité de la connexion n'est plus là. Nous n'avons pas besoin de connexions longues, et les demandes de pages sont renvoyées en moins de 10 secondes. Existe-t-il un moyen pour WLBS ou IIS de fermer toutes les connexions non actives ouvertes, de sorte que je puisse retirer un serveur de l'équilibrage de charge sans attendre que toutes les connexions ouvertes se ferment d'elles-mêmes ?
Réponses
Trop de publicités?Utilisation de un vieux truc des groupes de discussion Joel La désactivation de la fonction "keep-alive", puis l'exécution du drainstop WLBS ont permis de faire fonctionner le système correctement. Puis j'ai écrit un script en VBS pour automatiser le tout. Il y a 2 script. Un script pour retirer le nœud du cluster, et un autre pour remettre le nœud en ligne.
La suppression du script est la suivante.
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"
Et le script pour remettre la machine en ligne est le suivant.
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"
Vous pouvez modifier la variable IISInstanceName en haut du script pour correspondre au nom de votre serveur web. Il s'agit du nom qui apparaît lorsque vous allez dans la section "Internet Information Services" sous "Administrative Tools". Vous pouvez le changer pour le nom que vous avez donné à votre serveur Web. Dans l'ensemble, c'est un peu lourd, mais cela fonctionne. Il est également possible de modifier la première ligne en
Set IISInstance = getObject("IIS://LocalHost/W3SVC/1")
et ensuite couper tout le boucle for qui recherche le serveur par son nom, mais je pense qu'il est un peu plus "correct" de trouver le serveur par son nom, plutôt que par un certain nombre, que je ne suis pas sûr que Windows changerait dans certaines circonstances d'ajout et de suppression d'instances de serveur web.