2013-10-23 120 views
3

我已經定義了一個自定義LoadBalancerProbe我webrole如下天青LoadBalancerProbe迴應

<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="CloudService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2013-03.2.0"> <LoadBalancerProbes> <LoadBalancerProbe name="MyProbe" protocol="http" intervalInSeconds="15" path="/api/ping" port="80" timeoutInSeconds="30" /> </LoadBalancerProbes> <WebRole name="TestApp" vmsize="Small"> <Sites> <Site name="Web"> <Bindings> <Binding name="Endpoint1" endpointName="Endpoint1" /> </Bindings> </Site> </Sites> <Endpoints> <InputEndpoint name="Endpoint1" protocol="http" port="80" localPort="80" loadBalancerProbe="MyProbe"/> </Endpoints> <Imports> <Import moduleName="Diagnostics" /> <Import moduleName="RemoteAccess" /> <Import moduleName="RemoteForwarder" /> </Imports> </WebRole> </ServiceDefinition>

當Azure中我有2個實例。我已啓用trace.axd並可以看到負載均衡器調用ping方法,所以這肯定是發生的。

當我希望我的實例出現(我改變了實例的配置設置)時,我還可以在我的測試應用程序中看到我的「503」響應(服務器不可用)。我可以看到來自負載平衡器X-MS-LB-MonitorStatus Down的自定義HTTP頭。

當我使用Curl請求來訪問負載平衡的url時,它總是返回正確的結果(如果我設置了一個實例返回503而不是200,它不會出現在響應結果中)。當我使用瀏覽器(在本例中爲Chrome)時,我仍然可以從應該關閉的實例中獲取結果(即實例可用,禁用它,然後調用負載平衡url仍然解析爲「禁用」實例)。

我可以證實,使用的trace.axd信息

我掙扎相信Azure是在做正確的負載均衡這裏解決每個請求的實際情況。

  1. 爲什麼瀏覽器仍然能夠訪問一個據推測不能旋轉的實例?
  2. 爲什麼捲曲「總是得到它的權利」?

回答

4

Azure負載平衡器是第3層負載平衡器,只負載平衡新的傳入TCP連接。它不知道有關HTTP流量的任何信息。

通常,瀏覽器將建立TCP連接並將keep-alive設置爲true,並將保持該TCP連接打開一段時間,並且對網站的任何後續請求將僅爲現有TCP連接上的HTTP流量。諸如curl之類的應用程序通常會在每次請求後關閉TCP連接。

因此,在您的情況下,Azure負載平衡器運行正常,但您的瀏覽器已經爲未旋轉的實例建立了TCP連接,所以未來的HTTP請求仍然會轉到相同的未輪換實例。

要驗證這是發生了什麼事情,您可以在客戶端或服務器端使用netmon/wireshark。

要解決這一點,你有幾種選擇:

  1. 4分鐘的空閒時間後,連接將被終止 和瀏覽器應該建立一個新的TCP連接,並得到 路由到一個實例,它是在迴轉。
  2. 關閉所有瀏覽器窗口並重新打開瀏覽器應該建立新的TCP 連接。
  3. 在服務器端,您可以將keep-alive設置爲false,這將終止Azure實例上的TCP連接。

請參閱第3期Q & A在http://blogs.msdn.com/b/kwill/archive/2013/02/28/heartbeats-recovery-and-the-load-balancer.aspx瞭解更多信息。

+0

哇,感謝 - 它是駕駛我瘋了:) –

+0

你應該更新你的答案,因爲它已經過時了。 –

+0

非常有幫助的答案。使用瀏覽器測試負載均衡器探測器時遇到同樣的問題。切換到爲每個請求創建新連接的命令行工具可解決此問題。 – Nik