我有一个 Web 应用,它位于两个 AWS 实例上 - 一个实例托管网站,另一个实例托管实际数据库 (MySQL)。托管网站的实例有一个指向它的弹性 IP,该 IP 与我的域名绑定。
显然,AWS 的主要优势之一是能够在繁忙时同时运行大量实例,AWS 甚至提供自动化解决方案来实现这一点。很好。但如果我的域指向一个 IP,并且该 IP 绑定到一个实例,我该如何在多个实例之间分散流量?我是否让主机充当负载均衡器?如果是,是否有一种常用的负载均衡解决方案可用于 LAMP?
答案1
您可以使用循环 DNS,如前所述。如果您正在寻找一种快速简便的解决方案,那么这可能也是我推荐的。
但是,EC2 实例并不耐用,您不应该这样对待它们。这意味着,它们可能像风中放屁一样突然出现并消失,您的应用程序必须对此有所容忍。RR DNS 可能会给您带来麻烦,因为它不够智能,无法处理容错/高可用性。如果您的某个 Web 服务器死机了,用户将不得不尝试连接到死机,直到记录中的 TTL 失效。前面提到的设置极低 TTL 的技巧不起作用。下游缓存 DNS 服务器不会遵守如此低的 TTL。如果您的 TTL 为一小时,那就算幸运了。许多用户可能会被迫尝试连接到同一个死机 Web 服务器 24 小时或更长时间。
我建议你看一下HAProxy。Reddit.com使用 EC2 上的 HAproxy 在数十个 Web 服务器实例上对每月约 2 亿次页面浏览量进行负载平衡。我相信它也能处理您的应用程序。
答案2
亚马逊还提供弹性负载平衡服务。
答案3
正如 April 所提到的,您可以将 EIP 与弹性负载平衡一起使用;但是,当我对其进行评估时,它存在一些缺陷,使得它不太适合我的部署。
我有 2 个弹性 IP,它们被分配给几个用作前端 Web 服务器的 EC2 实例。这些只是运行线程化的 Apache2 服务器,负责处理它们后面的应用程序服务器的负载平衡。这两个 EIP 随后被放入标准 DNS 循环中。
Apache2 配置使用 mod_balancer 在后端服务器实例之间平衡请求,后端服务器实例的数量不会少于 3 个。数据库在其自己的独立 EC2 实例上运行,后端系统可以连接到该实例。
您可以用 HAProxy 替换我前端系统上的 Apache2 配置。我确实考虑过这一点,但需要进行比我认为使用 HAProxy 更智能的路由,但有一天我可能会回过头来重新评估这一立场。
在这种配置下,我处理了六个以上访问量很大的网站,这些网站的月访问量达到数千万次。线程化的前端 Apache2 服务器几乎没有负载,因为它们只是充当中间人,而真正的工作是在后端服务器上完成的。我注意到,与我们在同地数据中心使用传统专用服务器时相比,速度性能有了显著提升。
答案4
超级基本解决方案:
您可以使用以下方式配置网站的 DNS 条目DNS 循环指向多个主机 IP。为每个前端实例分配一个单独的弹性 IP。在 DNS 方面,只需为同一主机名添加第二个条目,并使用备用 IP。将每个条目的 TTL 设置得相当低(5-60 秒)。
更多信息请点击这里: http://en.wikipedia.org/wiki/Round_robin_DNS