大型、多站点、面向互联网的系统,包括内容分发网络 (CDN) 和云提供商,有多种选择来平衡进入其网络的流量。在本文中,我们将介绍常见的流量平衡设计,包括技术和权衡。
如果您是早期的云计算提供商,您可以采用单个客户 Web 服务器,为其分配一个 IP 地址,配置域名系统 (DNS) 记录以将其与人类可读的名称关联,并通过边界网关协议 (BGP) 公告 IP 地址,这是在网络之间交换路由信息的标准方法。
它本身不是负载均衡,但可能存在跨冗余网络路径和网络技术的负载分配,以通过绕过不可用的基础设施来提高可用性(从而产生了诸如非对称路由之类的现象)。
进行简单的 DNS 负载均衡
随着客户服务流量的增长,企业所有者希望更高的可用性。您添加了第二个 Web 服务器,它具有自己的公共可访问 IP 地址,并更新 DNS 记录以将用户定向到两个 Web 服务器(希望在某种程度上均匀地分配)。这在一段时间内还可以,直到其中一个 Web 服务器意外脱机。假设您快速检测到故障,您可以更新 DNS 配置(手动或使用软件)以停止引用已损坏的服务器。
不幸的是,由于 DNS 记录被缓存,大约 50% 的服务请求可能会失败,直到记录从客户端缓存和 DNS 层次结构中的其他名称服务器中过期。DNS 记录通常具有几分钟或更长的生存时间 (TTL),因此这可能会对系统的可用性产生重大影响。
更糟糕的是,某些比例的客户端完全忽略 TTL,因此在一段时间内,某些请求将被定向到您的脱机 Web 服务器。设置非常短的 DNS TTL 也不是一个好主意;这意味着 DNS 服务上的负载更高,并且由于客户端必须更频繁地执行 DNS 查找,因此延迟也会增加。如果您的 DNS 服务因任何原因不可用,则使用较短的 TTL,对您服务的访问将更快地降级,因为缓存您的服务 IP 地址的客户端会更少。
添加网络负载均衡
为了解决这个问题,您可以添加一对冗余的 第 4 层 (L4) 网络负载均衡器,它们服务于相同的虚拟 IP (VIP) 地址。它们可以是硬件设备,也可以是像 HAProxy 这样的软件均衡器。这意味着 DNS 记录仅指向 VIP,不再进行负载均衡。

第 4 层负载均衡器在两个 Web 服务器之间平衡来自用户的连接。
L4 均衡器将来自互联网的流量负载均衡到后端服务器。这通常基于每个 IP 数据包的 5 元组的哈希值(数学函数)完成:源和目标 IP 地址和端口加上协议(例如 TCP 或 UDP)。这既快速又高效(并且仍然保持 TCP 的基本属性),并且不需要均衡器维护每个连接的状态。(有关更多信息,谷歌关于 Maglev 的论文详细讨论了软件 L4 均衡器的实现。)
L4 均衡器可以进行健康检查,并且仅将流量发送到通过检查的 Web 服务器。与 DNS 均衡不同,如果一个 Web 服务器崩溃,将流量重定向到另一个 Web 服务器的延迟很小,尽管现有连接将被重置。
L4 均衡器可以进行加权均衡,处理具有不同容量的后端。L4 均衡在计算能力方面相对便宜,同时为运营商提供了强大的功能和灵活性。
走向多站点
系统继续增长。即使您的数据中心宕机,您的客户也希望保持正常运行。您构建了一个新的数据中心,其中包含自己的一组服务后端和另一个 L4 均衡器集群,它们服务于与以前相同的 VIP。DNS 设置没有更改。
两个站点的边缘路由器都公告了地址空间,包括服务 VIP。发送到该 VIP 的请求可以到达任一站点,具体取决于最终用户和系统之间每个网络的连接方式以及其路由策略的配置方式。这称为任播。大多数时候,这工作正常。如果一个站点没有运行,您可以停止通过 BGP 公告服务的 VIP,流量将快速移动到备用站点。

使用任播从多个站点提供服务。
此设置有几个问题。它最严重的缺点是您无法控制流量的流向或限制发送到给定站点的流量。您也没有明确的方法将用户路由到<0xC2><0xA0>最近的站点(就网络延迟而言),但是确定路由的网络协议和配置在大多数情况下应该将请求路由到最近的站点。
在多站点系统中控制入站请求
为了保持稳定性,您需要能够控制向每个站点提供的流量。您可以通过为每个站点分配不同的 VIP 并使用 DNS 使用简单或加权轮循来平衡它们来获得该控制权。

使用每个站点的主要 VIP 提供服务,由辅助站点备份,并具有地理感知 DNS。
现在您有两个新问题。
首先,使用 DNS 均衡意味着您有缓存的记录,如果您需要快速重定向流量,这不是好事。
其次,每当用户进行新的 DNS 查找时,VIP 都会将他们连接到任意站点的服务,这可能不是离他们最近的站点。如果您的服务在广泛分离的站点上运行,则单个用户将在您的系统的响应速度方面体验到很大的变化,这取决于他们与他们正在使用的服务实例之间的网络延迟。
您可以通过让每个站点不断公告并服务于所有其他站点的 VIP(以及因此任何故障站点的 VIP)来解决第一个问题。网络技巧(例如,从备份公告不太具体的路由)可以确保 VIP 的主站点是首选的,只要它可用即可。这通过 BGP 完成,因此我们应该看到流量在更新 BGP 后的一两分钟内移动。
对于从最近的健康站点以外的其他站点为用户提供服务的问题,没有优雅的解决方案。许多大型面向互联网的服务使用 DNS 服务,这些服务尝试向不同位置的用户返回不同的结果,并取得了一定的成功。鉴于互联网寻址方案不是按地理位置组织的,<0xC2><0xA0>地址块可能会更改位置(例如,当公司重组其网络时),并且许多最终用户可以从单个缓存名称服务器获得服务,因此这种方法始终有些复杂且容易出错。
添加第 7 层负载均衡
随着时间的推移,您的客户开始要求更多高级功能。
虽然 L4 负载均衡器可以有效地在多个 Web 服务器之间分配负载,但它们仅在源和目标 IP 地址、协议和端口上运行。他们不了解请求的内容,因此您无法在 L4 均衡器中实现许多高级功能。第 7 层 (L7) 负载均衡器知道请求的结构和内容,并且可以做更多的事情。
可以在 L7 负载均衡器中实现的一些功能包括缓存、速率限制、故障注入和成本感知负载均衡(某些请求需要更多的服务器时间来处理)。
它们还可以根据请求的属性(例如,HTTP cookie)进行均衡,终止 SSL 连接,并帮助防御应用程序层拒绝服务 (DoS) 攻击。大规模 L7 均衡器的缺点是成本 - 它们需要更多的计算来处理请求,并且每个活动请求都会消耗一些系统资源。在一个或多个 L7 均衡器池的前面运行 L4 均衡器可以帮助扩展。
结论
负载均衡是一个困难而复杂的问题。除了本文中描述的策略外,还有不同的负载均衡算法、用于实现负载均衡器的高可用性技术、客户端负载均衡技术以及最近兴起的服务网格。
核心负载均衡模式随着云计算的增长而发展,并且随着大型 Web 服务努力改进负载均衡技术提供的控制和灵活性,它们将继续改进。
劳拉·诺兰和穆拉里·苏里亚将在 LISA18(10 月 29 日至 31 日,美国田纳西州纳什维尔)上展示保持平衡:负载均衡揭秘。
评论已关闭。