2013-10-23 188 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