如何在Amazon EC2上部署可扩展的,可靠的haproxy集群?


25

我们需要比ELB提供的功能更高级的功能(主要是L7检查),但是如何使用EC2使用haproxy处理诸如心跳和高可用性之类的事情尚不清楚。在集群中很可能需要3个或更多haproxy节点,因此两个节点之间的简单心跳将无法正常工作。

好像是在haproxy节点前面有一个心跳层是可行的方法,可能使用IPVS,但是随着EC2集群的变化(通过有意的变化(例如扩展)或无意的(例如丢失))处理配置更改。 EC2节点)似乎很重要。

优选地,该解决方案将跨越至少两个可用区。

回答问题:不,会议并不麻烦。是的,我们将需要SSL,但是从理论上讲,这可以完全由另一种设置处理-我们能够将SSL流量定向到与非SSL流量不同的位置。


我正在研究如何进行Canary部署,其中流向新版本软件的流量会以缓慢的百分比增长,而我对您最终在何处感到很好奇。您是否最终尝试了Jesper的任何建议?
伊恩2015年

Answers:


14

好的,我从来没有用自己的SmugMug级别构建流量的AWS负载平衡解决方案,但是仅考虑理论和AWS服务,就会想到一些想法。

最初的问题缺少一些会影响负载均衡设计的东西:

  1. 粘性会议吗?最好不要使用粘性会话,而应让所有负载均衡器(LB)使用轮询(RR)或随机后端选择。RR或随机后端选择非常简单,可扩展,并且可以在所有情况下均等地分配负载。
  2. 是否使用SSL?是否使用SSL,以及使用的请求百分比,通常都会对负载平衡设计产生影响。通常最好尽早终止SSL,以简化证书处理并使SSL CPU负载远离Web应用程序服务器。

我是从如何保持负载平衡层本身的高度可用性的角度来回答的。保留应用程序服务器HA只是通过L7负载平衡器中内置的运行状况检查来完成。

好的,有两个可行的想法:

1)“ AWS方式”:

  • 最顶层的第一层在L4(TCP / IP)模式下使用ELB。
  • 第二层,将EC2实例与您选择的L7负载均衡器(nginx,HAProxy,Apache等)一起使用。

优点/想法: L7负载平衡器可以是相当简单的EC2 AMI,所有这些都从同一AMI克隆并使用相同的配置。因此,Amazon的工具可以满足所有HA需求: ELB监视L7负载平衡器。如果L7 LB死亡或无响应,则ELB和Cloudwatch会自动产生一个新实例,并将其带入ELB池。

2)“具有监视方式的DNS轮询:”

  • 使用基本的DNS轮询可以在两个IP地址上获得粗粒度的负载分配。假设您为网站发布了3个IP地址。
  • 这3个IP中的每一个都是绑定到EC2实例的AWS弹性IP地址(EIA),具有您选择的L7负载均衡器。
  • 如果EC2 L7 LB死了,则兼容的用户代理(浏览器)仅使用其他IP之一
  • 设置一个外部监视服务器。监视3个EIP中的每一个。如果没有响应,请使用AWS的命令行工具和一些脚本将EIP移至另一个EC2实例。

好处/想法:如果一个用户没有响应,则符合要求的用户代理应自动切换到另一个IP地址。因此,在发生故障的情况下,应该只影响您的用户的1/3,并且这些用户中的大多数都不会注意到任何东西,因为他们的UA会静默地故障转移到另一个IP。而且您的外部监视盒会注意到EIP没有响应,并在几分钟之内纠正了这种情况。

3)对高可用性服务器对的DNS RR:

基本上,这是Don自己对一对服务器之间的简单心跳的建议,但对于多个IP地址却简化了。

  • 使用DNS RR,发布服务的多个IP地址。按照上面的示例,我们假设您发布了3个IP。
  • 这些IP中的每一个都连接到一 EC2服务器,因此总共有6个EC2实例。
  • 这些对中的每对都使用Heartbeat或另一个HA解决方案以及AWS工具,以在主动/被动配置中保持1个IP地址处于活动状态。
  • 每个EC2实例都安装了您选择的L7负载均衡器。

优势/想法:在AWS的完全虚拟化环境中,就L4服务和故障转移模式进行推理实际上并不那么容易。通过简化为一对仅保留1个IP地址的相同服务器,就可以简化推理和测试的过程。

结论:同样,我实际上还没有在生产中尝试任何一种方法。仅凭我的直觉,选择L4模式下的ELB以及作为L7 LB的自我管理型EC2实例的选择似乎最符合AWS平台的精神,并且亚马逊极有可能在此后进行投资和扩展。这可能是我的首选。


1
所以我喜欢方法1,这就是我一直在努力的方向,但是仍然有一些有趣的陷阱-其中最重要的一点是ELB无法很好地处理整个可用区(我们已经发生过的事情) )。简单但麻烦的“解决方案”是将ELB后面的配置配置为穿越AZ(也许在另一个AZ中带有备用群集),因此,如果每个AZ中至少有一个haproxy,我们应该没事。但这只是最小化,而不能消除问题。关于这个问题有什么想法吗?
Don MacAskill 2010年

@Don MacAskill:我知道AWS曾经发生过两次大规模的服务停机,但是在AWS上做得比AZ可靠性要好。转向前端的多可用区操作可能很容易成为整个堆栈的多可用区操作的第一步,那真是一团蛇......
Jesper M,2010年

@Don MacAskill:一种选择是采用地理感知的DNS解析,例如DynDNS Dynect->一个AZ中的ELB + L7 LB,而另一个ELB + L7在另一个AZ中处于热备用状态。(除了具有地理感知功能外,Dynect还进行了一些运行状况检查。)DynDNS在正常运行时间方面拥有良好的记录,但是即使如此,添加具有地理感知功能的DNS也是另一个SPOF。我尚不清楚2个可用区中的Dynect +负载平衡是否具有比仅一个AWS可用区更好的长期正常运行时间。无需
Jesper M,2010年

@Don MacAskill:最后一件事-请记住,一个ELB实例可以跨越多个AZ。它不能跨越EC2 区域。但是,如果仅使用ELB来处理同一区域内两个可用区中的L7 LB,那将是迄今为止最简单的方法……您写道“ ELB不能很好地处理整个可用区的失败”,也许您已经知道我做。
Jesper M,2010年

是的,如果ELB跨越多个可用区,并且发生某种故障,导致它无法到达可用区中的任何后端节点(它们过载,崩溃,返回503,无论如何),最终用户会看到这些错误-它不会t重新路由到其他可用区。我希望这是计划好的,但是已经把我们咬了。
Don MacAskill 2010年

2

如果您不进行粘性会话,或者您使用的是tomcat / apache样式(将节点ID附加到sessionid,而不是将状态存储在LB中),那么我将在一组haprox前面使用ELB。ELB具有内置的运行状况检查,因此您可以监控它,并从池中取出所有故障。与心跳故障转移相比,建立起来要少得多。

至于传播更改,我没有很好的答案。Puppet非常适合初始配置和实施更改,但是对于添加/删除节点,您往往想要比其30分钟的轮询间隔更快的响应。


1
这是一个很好的解决方案(也是一个很好的问题!),您可以使用Amazon SNS以推送方式传播配置更改。您需要一个通知系统来从haproxy配置中添加/删除节点。
Rafiq Maniar 2010年

管理后端服务器(haproxy要转发到的服务器)的另一种选择是让每个后端服务器发送所有请求或配置服务器的定期注册(大约30秒)。如果死了,它很快就会被取消注册(无论如何,haproxy应该引起注意);如果出现一个新的,它会自动旋转。显然,这就是Netflix所做的。
本·詹克斯

1

我自己没有用过,但是我看到很多人提到使用p来处理EC2上的这类问题


是的,EC2上的Puppet使管理群集非常简单。只需创建一个微型实例并将其用作您的人偶大师即可。
汤姆·奥康纳

1
我们在数据中心中使用了puppet,但尚未尝试使用EC2。木偶EC2是否以某种方式感知到,因此它可以使用ec2-describe-instances或其他对象找到节点,并根据输出自动配置/重新配置?以及您如何处理人偶大师突然消失?
Don MacAskill 2010年

为什么会突然消失?
汤姆·奥康纳

它不支持EC2,但是您可以对其进行设置,以便在启动新节点时将其标记为要签名,并使用外部节点脚本来描述它们。我编写了一些python,以使用SimpleDB(外部节点)和SQS(对新节点的签名请求队列)完成此操作;Ubuntu的开发写脚本,以使用S3:ubuntumathiaz.wordpress.com/2010/04/07/...
本·詹克斯

如果戏梦人生消失突然,它只是不运行清单,即在离开节点他们在任何状态。
本·詹克斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.