Ich verwende WLBS in Windows 2000 für 2 Webserver zur Redundanz und zum Lastenausgleich. Wenn ich einen der Dienste herunterfahren möchte, verwende ich „WLBS drainstop“ von der Befehlszeile aus. Wenn ich jedoch die Anzahl der offenen Verbindungen in IIS überwache, dauert es ziemlich lange, bis die bestehenden Verbindungen geschlossen werden. Wenn ich „WLBS stop“ ausführe, bleiben die verbleibenden Verbindungen einige Minuten hängen, während sie herausfinden, dass das andere Ende der Verbindung nicht mehr vorhanden ist. Wir brauchen keine lang laufenden Verbindungen und Seitenanforderungen werden in deutlich unter 10 Sekunden zurückgegeben. Gibt es eine Möglichkeit für WLBS oder IIS, alle offenen, nicht aktiven Verbindungen zu schließen, sodass ich einen Server aus dem Lastenausgleich entfernen kann, ohne darauf warten zu müssen, dass alle offenen Verbindungen von selbst geschlossen werden?
Antwort1
Verwenden vonein alter Trick aus den Joel-DiskussionsgruppenKeep-Alive auszuschalten und dann WLBS Drainstop auszuführen, war der Schlüssel, damit das Ganze richtig funktionierte. Dann habe ich ein Skript in VBS geschrieben, um das Ganze zu automatisieren. Es gibt zwei Skripte. Ein Skript, um den Knoten aus dem Cluster zu entfernen, und ein anderes, um den Knoten wieder online zu bringen.
Das Entfernungsskript lautet wie folgt.
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"
Und das Skript, um die Maschine wieder online zu bringen, lautet wie folgt.
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"
Sie können die Variable IISInstanceName oben im Skript so ändern, dass sie dem Namen Ihres Webservers entspricht. Dies ist der Name, der angezeigt wird, wenn Sie unter „Verwaltung“ zum Abschnitt „Internetinformationsdienste“ gehen. Sie können dies in den Namen ändern, den Sie Ihrem Webserver gegeben haben. Insgesamt ist es ein wenig klobig, aber es funktioniert. Es ist auch möglich, die erste Zeile zu ändern in
Set IISInstance = getObject("IIS://LocalHost/W3SVC/1")
und dann die gesamte For-Schleife herausschneiden, die den Server nach Namen sucht, aber ich denke, es ist etwas „richtiger“, den Server nach Namen zu suchen, als nach einer Nummer, bei der ich nicht sicher bin, ob Windows sie unter bestimmten Umständen beim Hinzufügen und Entfernen von Webserverinstanzen ändern würde.
Antwort2
Möglicherweise reicht es schon aus, das Keepalive-Timeout von zwei Minuten auf etwa 20 Sekunden zu verkürzen.