Haproxy Load Balancer,EC2,编写我自己的可用性脚本

Jon*_*n E 4 ping amazon-ec2 haproxy

我一直在寻找心跳等高可用性解决方案,并在haproxy负载均衡器出现故障时保持故障转移.我意识到虽然我们希望高可用性,但是在这个时间点并不是真正要求在任何时候运行2个负载均衡器实例的支出程度,以便我们获得即时故障转移(特别是一磅)在我们的设置中将是多余的).

我的替代解决方案是,如果当前负载均衡器已停止工作,则从AMI启动新的负载均衡器EC2实例,并将其与我们的域名指向的弹性IP相关联.这应该确保停机时间仅限于启动新实例和关联弹性IP所需的时间,这是因为我们目前的情况似乎是高可用性的合理成本效益解决方案,特别是因为我们可以轻松地实现多个av区.我希望使用以下步骤执行此操作:

  1. 准备负载平衡器的AMI
  2. 启动作为负载均衡器的单个ec2实例,并为其分配弹性IP
  3. 让微服务器定期ping当前的负载均衡器(我们总是运行一个额外的微服务器)
  4. 如果ping超时,则使用负载均衡器AMI启动新的EC2实例
  5. 将弹性IP与新实例关联
  6. 关闭旧的负载均衡器实例
  7. 使用新实例重复步骤3

我知道如何在我的脚本中运行命令来启动和关闭EC2实例,将弹性IP地址与实例关联,并ping服务器.

我的问题是这里有什么合适的ping?标准ping是否足够定期,什么是良好的间隔?或者这是一种相当简单的方法,我应该做一个更聪明的健康检查?

如果有人预见到这种方法有任何问题,请随时发表评论

bwi*_*ght 6

我完全理解你来自哪里,我的公司处于相同的位置.我们关心拥有一个高度可用的容错系统,但是开销成本对于我们获得的流量来说根本不可行.

  1. 我对你的解决方案的一个问题是你假设微实例和负载均衡器不会同时死亡.根据我对亚马逊的经验,我可以告诉你,这可能会发生,但不太可能发生,无论是什么原因导致你的负载平衡器死亡也会导致微观实例失效.
  2. 另一个潜在的问题是您还假设您将始终能够在停机期间启动另一个替换实例.事实并非如此,例如亚马逊几天前在他们的美国东部地区发生的停电事件.停电导致其中一个区域断电.当他们恢复供电并开始恢复实例时,由于负载过大,他们的API无法正常工作.在此期间,它们可用时间差不多1小时.如果像这样的停电击中了你的负载均衡器,而你无法启动另一个,你就会失败.

话虽如此.我发现亚马逊提供的ELB对我来说是更好的解决方案.我不确定使用HAProxy背后的原因是什么,但我建议调查ELB,因为它们可以让你做一些事情,比如自动缩放等.

对于每个ELB,您创建的amazon会在每个已注册实例的区域中创建一个负载均衡器.在如上所述的亚马逊严重停电期间,这些仍然容易受到某些问题的影响.例如,在此停机期间,我无法向负载均衡器添加新实例,但我当前的实例(不受停电影响的实例)仍在处理请求.

更新2013-09-30

最近我们改变了我们的基础设施,使用了ELB和HAProxy的组合.我发现ELB提供了最佳可用性,但它使用DNS负载平衡这一事实对我的应用程序不起作用.因此,我们的设置是在2节点HAProxy集群前面的ELB.使用此工具我为AWS创建的HAProxyCloud可以轻松地将自动扩展组添加到HAProxy服务器.

  • 如果ELB无法处理您需要的突发,请请求AWS支持人员增加ELB实例的默认大小.他们会将您的ELB移动到可以处理负载的实例.这是测试时的常见问题,我从未在真实用户场景下发生这种情况.CNAME分辨率应该非常小.希望这可以帮助. (2认同)