EC2弹性负载平衡器DNS和路由问题

我们正在尝试在Amazon EC2上运行一个相当简单的设置 – 位于Amazon Elastic Load Balancer(ELB)后面的多个HTTP服务器。

我们的域名是在Route53pipe理的,我们有一个CNAMElogging被设置为指向ELB。

我们遇到了一些问题,其中一些(但不是全部)地点间歇性地无法连接到负载均衡器; 看来这可能是ELB域名的parsing。

亚马逊的支持build议我们,负载平衡器的底层弹性IP一直在变化,问题是有些ISP的DNS服务器不遵守TTL。 我们对这个解释不满意,因为我们使用Amazon自己的DNS服务器从EC2实例以及澳大利亚的本地ISP和Google的DNS服务器( 8.8.8.8 )中复制了这个问题。

亚马逊还证实,在我们注意到某些地方出现停机的时候,通过ELB的stream量显着下降 – 所以问题不在于我们的端点。

有趣的是,域似乎解决了无法连接的服务器上的正确的IP – 但build立TCP连接的尝试失败。

ELB的所有实例始终保持健康。 他们都是

有没有人知道我们可以更深入地诊断这个问题? 有没有其他人经历过Elastic Load Balancer的这个问题?

谢谢,

我在谷歌search如何诊断亚马逊弹性负载平衡器(ELB)时发现了这个问题,我想为像我这样的人谁没有太多的指导有这个麻烦回答它。

ELB属性

ELB有一些有趣的属性。 例如:

  • ELB由1个或多个节点组成
  • 这些节点被发布为ELB名称的Alogging
  • 这些节点可能会失败或被closures,连接将不会正常closures
  • 通常需要与亚马逊的支持($$$)build立良好的关系才能让人们深入研究ELB的问题

注意:另一个有趣的属性,但稍微不太恰当的是,ELB并没有devise来处理突然的交通高峰。 他们通常需要15分钟的交通量,然后才能扩大规模,或者可以通过支持票据预先加热

ELB故障排除(手动)

更新: AWS已经迁移了所有的ELB,使用Route 53作为DNS。 另外,所有ELB现在都有一个all.$elb_namelogging,它将返回ELB节点的完整列表。 例如,如果您的ELB名称是elb-123456789.us-east-1.elb.amazonaws.com ,那么您可以通过执行诸如dig all.elb-123456789.us-east-1.elb.amazonaws.com类的操作来获得完整的节点列表dig all.elb-123456789.us-east-1.elb.amazonaws.com 对于IPv6节点, all.ipv6.$elb_name也适用。 此外,路由53仍然可以使用UDP返回高达4KB的数据,因此使用+tcp标志可能不是必需的。

知道这一点,你可以自己做一些故障排除。 首先,将ELB名称parsing为节点列表(作为Alogging):

 $ dig @ns-942.amazon.com +tcp elb-123456789.us-east-1.elb.amazonaws.com ANY 

build议使用tcp标志,因为你的ELB可能有太多的logging要放在单个UDP数据包中。 我也被告知,但没有亲自证实,亚马逊将只显示多达6个节点, 除非你执行ANY查询。 运行这个命令会给你看起来像这样的输出(为简洁起见而修剪):

 ;; ANSWER SECTION: elb-123456789.us-east-1.elb.amazonaws.com. 60 IN SOA ns-942.amazon.com. root.amazon.com. 1376719867 3600 900 7776000 60 elb-123456789.us-east-1.elb.amazonaws.com. 600 IN NS ns-942.amazon.com. elb-123456789.us-east-1.elb.amazonaws.com. 60 IN A 54.243.63.96 elb-123456789.us-east-1.elb.amazonaws.com. 60 IN A 23.21.73.53 

现在,对于每个Alogging使用例如curl来testing与ELB的连接。 当然,你也想把你的testing隔离到ELB而不连接你的后端。 关于ELB的最终财产和鲜为人知的事实:

  • 可以通过ELB发送的请求方法(动词)的最大大小是127个字符 。 任何更大的和ELB将答复一个HTTP 405 – 方法不允许

这意味着我们可以利用这种行为来仅testingELB的响应:

 $ curl -X $(python -c 'print "A" * 128') -i http://ip.of.individual.node HTTP/1.1 405 METHOD_NOT_ALLOWED Content-Length: 0 Connection: Close 

如果您看到HTTP/1.1 405 METHOD_NOT_ALLOWED则ELB正在成功响应。 您可能还想将curl的超时调整为您可以接受的值。

使用elbping对ELB进行故障排除

当然,这样做可能会非常乏味,所以我build立了一个工具来自动化这个叫做elbping的工具。 它是一个rubygem,所以如果你有rubygems,那么你可以通过简单的安装它:

 $ gem install elbping 

现在你可以运行:

 $ elbping -c 4 http://elb-123456789.us-east-1.elb.amazonaws.com Response from 54.243.63.96: code=405 time=210 ms Response from 23.21.73.53: code=405 time=189 ms Response from 54.243.63.96: code=405 time=191 ms Response from 23.21.73.53: code=405 time=188 ms Response from 54.243.63.96: code=405 time=190 ms Response from 23.21.73.53: code=405 time=192 ms Response from 54.243.63.96: code=405 time=187 ms Response from 23.21.73.53: code=405 time=189 ms --- 54.243.63.96 statistics --- 4 requests, 4 responses, 0% loss min/avg/max = 187/163/210 ms --- 23.21.73.53 statistics --- 4 requests, 4 responses, 0% loss min/avg/max = 188/189/192 ms --- total statistics --- 8 requests, 8 responses, 0% loss min/avg/max = 188/189/192 ms 

请记住,如果您看到code=405那么这意味着ELB正在响应。

下一步

无论您select哪种方法,您至less都会知道您的ELB节点是否正在响应。 掌握了这些知识后,您可以将注意力转移到堆栈的其他部分,或者对AWS做出相当合理的处理,以避免出现问题。

希望这可以帮助!

修复其实很简单:在Route53中使用Alogging而不是CNAME

在AWSpipe理控制台中,select“Alogging”,然后将标记为“别名”的单选button移动到“是”。 然后从下拉菜单中select您的ELB。

您可以在此AWS开发者论坛中尝试一些可能的解决scheme。 https://forums.aws.amazon.com/message.jspa?messageID=387552

例如:

潜在的修复#1

当我们搬到ELB时,我们遇到了类似的问题,我们通过将ELB的名称缩减为单个字符来解决这个问题。 即使是ELB的2个char名称也会导致networking解决schemeDNS解决scheme的随机问题。

您的ELB的DNS名称应该像 – > X. <9chars> .us-east-1.elb.amazonaws.com

潜在的修复#2

我是原始的海报。 感谢所有的答复。 通过将TTL设置得非常高(我们可以通过非networking解决scheme服务器caching),从而降低了我们遇到DNS问题的频率。 然而,我们仍然得到了足够的问题,我们不能再留在networking解决scheme。 我们想到基于服务的良好报告转移到UltraDNS,但看起来像Route 53(使用UltraDNS,它会出现)将会更便宜。 由于切换到路由53,我们没有更多的DNS问题,我们的ELB名称可以很好,也很长。

那个post还有其他的东西要尝试,但是这些似乎是最好的线索。