Azure LoadBalancerProbe响应被忽略

时间:2013-10-23 16:56:26

标签: azure load-balancing webrole

我为我的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)我仍然可以从应该关闭的实例返回结果(即实例可用,我禁用它,然后额外调用负载平衡网址仍然解析为“禁用”实例。)

我可以使用trace.axd信息确认解决每个请求的实际实例

我很难相信azure正在这里正确地进行负载平衡。

  1. 为什么浏览器仍然能够访问一个假定不在轮换状态的实例?
  2. 为什么curl“总能做对”?

2 个答案:

答案 0 :(得分: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连接。
  4. 请参阅http://blogs.msdn.com/b/kwill/archive/2013/02/28/heartbeats-recovery-and-the-load-balancer.aspx的第3个Q&amp; A获取更多信息。

答案 1 :(得分:2)

根据此博客文章(2014),Azure使用第4层负载均衡器: http://azure.microsoft.com/blog/2014/04/08/microsoft-azure-load-balancing-services/

因此它可以响应并监控HTTP 200和503。