如何在 N 个 Apache 服务器之间平衡传入的网络流量?

如何在 N 个 Apache 服务器之间平衡传入的网络流量?

我正在考虑使用 Heartbeat/Squid/Varnish/etc 之类的东西来平衡内部 Apache 实例之间的传入流量。这必须是软件而不是硬件,因为我所有的东西都在 VPS 上运行。我在这方面没有太多经验,所以如果我误用了术语并选择了错误的软件包,请原谅。

我画了一些东西来说明我所追求的。绿色部分是初始设置的样子,蓝色部分是由于流量增加而添加更多 Apache 实例后的样子。这可能不是这些事情的工作原理,但理想情况下,我会将平衡器的 IP 添加到域的 DNS。然后,平衡器将看到每个 Apache 实例上有多少个连接(通过一些内部 IP 或永久 IP 的配置列表)并平均分配连接。蓝色部分是第二个平衡器,因为我确信平衡器在某些时候也需要帮助。

也许我的做法是错误的,但我正在寻求帮助,了解“平衡器”应该是什么,以及如何设置它们的最佳实践。

任何帮助都将非常有帮助。 替代文本

答案1

几乎任何“反向代理”都会按照您的要求执行。

例如,Varnish、Pound 和 HAProxy 各有千秋,但也有不同之处 - 不过,对于您要问的问题,它们中的任何一个都可以。就我个人而言,我认为 HAProxy 是最好的选择,但这只是猜测。

您最好阅读一篇有关负载均衡器的文章,以帮助您确定需要哪种负载均衡器:http://1wt.eu/articles/2006_lb/

此外,您可以考虑为此使用预先构建的服务 - 例如在 Amazon 的 Elastic Compute Cloud 上运行您的软件并使用其 Elastic Load Balancing。

答案2

首先,必须回答一个重要的问题:
您是否需要由负载均衡器处理用户会话并始终将其驱动到同一个 Web 服务器(如果处于活动状态)?

  • 不需要会议:在这种情况下,你应该使用高效的nginx程序作为负载平衡器。配置很容易设置,基本上您只需要在语句中指示 Web 服务器列表upstream upstream_name { server1, ..., serverN },然后,对于给定的域,您需要一个简单的proxy_pass upstream_name指令。
    请参阅Nginx 维基百科

  • 需要会话有一个类似的设置在其中指定 cookie 的名称,该 cookie 将主持人会话 ID ( ),然后是所有服务器ID MYCOOKIENAME的列表。例如,请参阅BACKEND
    磅设置示例

当需要多个负载均衡器时,您可能需要进行配置heartbeat,以确保只有一个均衡器为给定域安装虚拟 IP(如果需要会话,或者同时安装两个均衡器并使用两个 IP 地址为 DNS 提供信息)。也许这应该在必要时在另一个问题中详细说明(因为工具发展很快)。
另请参阅此链接例如。

答案3

您需要一个非常好的理由来在您的架构中引入额外的复杂性和单点故障。

循环负载平衡

  • 无需花费任何费用
  • 易于实施和管理
  • 在客户端实现故障转移 - 这是唯一可以可靠地检测到故障的地方
  • 隐式支持服务器亲和性,但仍允许故障转移,而不存在与粘性会话相关的会话管理问题
  • 不需要集群节点上的额外软件/硬件/配置

关于循环调度的错误信息之多让我大吃一惊。如果我是个愤世嫉俗的人,我可能会怀疑这是否与生产昂贵的大型负载平衡硬件的供应商有关。

我唯一承认的一点是

  1. IPV4 地址变得稀缺因此价格昂贵 - 但仍然比思科 CSS 便宜得多。

  2. 互联网越来越多地依靠网络服务运行 - 但并非所有开发人员都按照以下要求实现 DNS 支持:规格但我使用过的所有浏览器都运行正常

答案4

对于平衡器,你可以查看 LVShttp://www.linuxvirtualserver.org/,也许运行 ldirectord 和 heartbeat 来引导流量并执行故障转移。

相关内容