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

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

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

似乎在 haproxy 节点前面有一个心跳层是可行的方法,可能使用 IPVS,但随着 EC2 集群的变化(无论是通过有意的更改,如扩展,还是无意的更改,如丢失 EC2 节点)处理配置更改似乎并不是一件容易的事。

最好解决方案能够跨越至少两个可用区域。

回答问题:不,会话不是粘性的。是的,我们需要 SSL,但理论上这完全可以通过另一种设置来处理 - 我们能够将 SSL 流量引导到与非 SSL 流量不同的位置。

答案1

好的,我自己从未构建过与 SmugMug 级别流量相同的 AWS 负载平衡解决方案,但只要考虑理论和 AWS 的服务,我就有几个想法。

原始问题缺少一些会影响负载平衡设计的内容:

  1. 是否使用粘性会话?最好不要使用粘性会话,而只让所有负载平衡器 (LB) 使用循环 (RR) 或随机后端选择。RR 或随机后端选择简单、可扩展,并且在所有情况下都能提供均匀的负载分布。
  2. 是否使用 SSL?是否使用 SSL,以及请求占多大比例,通常都会对负载平衡设计产生影响。通常最好尽早终止 SSL,以简化证书处理并使 SSL CPU 负载远离 Web 应用程序服务器。

我是从如何保持负载平衡层本身高可用性。保持应用服务器高可用性只需通过 L7 负载均衡器内置的健康检查即可。

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

1)“AWS 方式”:

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

好处/想法:L7 负载均衡器可以是相当简单的 EC2 AMI,全部从同一个 AMI 克隆并使用相同的配置。因此,亚马逊的工具可以处理所有 HA 需求:ELB 监控 L7 负载均衡器。如果 L7 LB 死机或无响应,ELB 和 Cloudwatch 会一起自动生成一个新实例并将其纳入 ELB 池。

2)“带监控的DNS轮询方式:”

  • 使用基本 DNS 轮询机制在几个 IP 地址上进行粗粒度负载分配。假设您为网站发布了 3 个 IP 地址。
  • 这 3 个 IP 中的每一个都是一个 AWS 弹性 IP 地址 (EIA),绑定到 EC2 实例,并带有您选择的 L7 负载均衡器。
  • 如果 EC2 L7 LB 崩溃,兼容的用户代理(浏览器)应该只需使用其他 IP 之一反而。
  • 设置外部监控服务器。监控 3 个 EIP 中的每一个。如果其中一个无响应,请使用 AWS 的命令行工具和一些脚本将 EIP 移至另一个 EC2 实例。

好处/想法:如果某个 IP 地址无响应,合规的用户代理应自动切换到另一个 IP 地址。因此,在发生故障的情况下,只有 1/3 的用户会受到影响,而且大多数用户不会注意到任何事情,因为他们的 UA 会默默地切换到另一个 IP。而且您的外部监控盒会注意到 EIP 无响应,并在几分钟内纠正这种情况。

3)DNS RR到HA服务器对:

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

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

好处/想法:在 AWS 完全虚拟化的环境中,推理 L4 服务和故障转移模式实际上并不容易。通过简化为仅保留 1 个 IP 地址的一对相同服务器,推理和测试变得更加简单。

结论:再次说明,我实际上还没有在生产中尝试过这些。仅从我的直觉来看,选项一是使用 L4 模式的 ELB,将自我管理的 EC2 实例作为 L7 LB,这似乎最符合 AWS 平台的精神,也是亚马逊以后最有可能投资和扩展的地方。这可能是我的第一选择。

答案2

如果您没有进行粘性会话,或者您使用的是 tomcat/apache 样式(将节点 ID 附加到 sessionid,而不是将状态存储在 LB 中),那么我会在一组 haproxies 前面使用 ELB。ELB 内置了健康检查,因此您可以让它监控 haproxies 并将任何宕机的 haproxies 从池中移除。设置起来比心跳故障转移少得多。

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

答案3

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

相关内容