我们正在尝试在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并没有devise来处理突然的交通高峰。 他们通常需要15分钟的交通量,然后才能扩大规模,或者可以通过支持票据预先加热
更新: AWS已经迁移了所有的ELB,使用Route 53作为DNS。 另外,所有ELB现在都有一个all.$elb_name
logging,它将返回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
现在,对于每个A
logging使用例如curl
来testing与ELB的连接。 当然,你也想把你的testing隔离到ELB而不连接你的后端。 关于ELB的最终财产和鲜为人知的事实:
这意味着我们可以利用这种行为来仅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的超时调整为您可以接受的值。
当然,这样做可能会非常乏味,所以我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中使用A
logging而不是CNAME
。
在AWSpipe理控制台中,select“Alogging”,然后将标记为“别名”的单选button移动到“是”。 然后从下拉菜单中select您的ELB。
您可以在此AWS开发者论坛中尝试一些可能的解决scheme。 https://forums.aws.amazon.com/message.jspa?messageID=387552 。
例如:
当我们搬到ELB时,我们遇到了类似的问题,我们通过将ELB的名称缩减为单个字符来解决这个问题。 即使是ELB的2个char名称也会导致networking解决schemeDNS解决scheme的随机问题。
您的ELB的DNS名称应该像 – > X. <9chars> .us-east-1.elb.amazonaws.com
我是原始的海报。 感谢所有的答复。 通过将TTL设置得非常高(我们可以通过非networking解决scheme服务器caching),从而降低了我们遇到DNS问题的频率。 然而,我们仍然得到了足够的问题,我们不能再留在networking解决scheme。 我们想到基于服务的良好报告转移到UltraDNS,但看起来像Route 53(使用UltraDNS,它会出现)将会更便宜。 由于切换到路由53,我们没有更多的DNS问题,我们的ELB名称可以很好,也很长。
那个post还有其他的东西要尝试,但是这些似乎是最好的线索。