我在 Windows 2000 中將 WLBS 用於 2 個 Web 伺服器,以實現冗餘和負載平衡。當我想要關閉其中一項服務時,我從命令列使用“WLBS Drainstop”。然而從監控IIS中開啟的連線數來看,現有的連線需要相當長的一段時間才能關閉。如果我運行“WLBS stop”,剩餘的連接將掛起幾分鐘,同時他們發現連接的另一端不再存在。我們不需要長時間運行的連接,頁面請求將在 10 秒內返回。 WLBS 或 IIS 是否有某種方法可以關閉任何打開的非活動連接,以便我可以從負載平衡中刪除伺服器,而無需等待所有打開的連接自行關閉?
答案1
使用喬爾討論小組的老把戲關閉 keep-alive,然後運行 WLBS Drainstop 是使其正常工作的關鍵。然後我用 VBS 編寫了一個腳本來自動化整個過程。有2個腳本。一個腳本用於從叢集中刪除節點,另一個腳本用於使節點重新上線。
刪除腳本如下。
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"
使機器重新上線的腳本如下。
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"
您可以變更腳本頂部的 IISInstanceName 變數以符合您的 Web 伺服器的名稱。這是當您前往「管理工具」下的「Internet 資訊服務」部分時顯示的名稱。您可以將其變更為您為 Web 伺服器命名的任何名稱。總的來說,它有點笨拙,但很有效。也可以將第一行改為
Set IISInstance = getObject("IIS://LocalHost/W3SVC/1")
然後剪掉按名稱查找伺服器的整個 for 循環,但我認為按名稱查找伺服器而不是按某個數字查找伺服器更“正確”,我不確定 Windows 是否會在以下情況下改變新增和刪除Web伺服器實例的某些情況。