大多数负载均衡器使用轮循或基于流的哈希方法来分配流量。但是,当需求超出可用传送容量时,使用此方法的负载平衡器可能难以适应。本文介绍了如何使用 Cloud Load Balancing 来解决这些问题并优化您的全球应用容量。与传统的负载平衡实现相比,此方法通常可以改进用户体验和降低费用。
本文属于针对 Google 的 Cloud Load Balancing 产品的最佳做法系列文章。如需了解本文附带的教程,请参阅使用负载平衡进行容量管理。 如需深入了解延迟,请参阅通过负载平衡优化应用延迟。
全球应用的容量难题
扩缩全球应用可能具有挑战性,特别是在您的 IT 预算有限且工作负载具有不可预测性和突发性的情况下。在 Google Cloud 等公共云环境中,自动扩缩和负载平衡等功能提供的灵活性非常有用。但是,如本部分所述,自动扩缩器有一些限制。
启动新实例的延迟
自动扩缩的最常见问题是请求的应用尚未准备好以足够快的速度传送流量。通常必须在虚拟机实例就绪前运行脚本并加载信息,具体取决于您的虚拟机实例映像。负载平衡通常需要几分钟才能将用户定向到新的虚拟机实例。在此期间,流量将分配到现有的虚拟机实例,而这些实例可能已经超出容量限制。
应用受后端容量限制
有些应用根本无法进行自动扩缩。例如,数据库的后端容量通常有限。只有特定数量的前端才能访问不能水平扩缩的数据库。如果您的应用依赖于仅支持每秒有限数量请求的外部 API,则该应用也无法自动扩缩。
非弹性许可
使用许可的软件时,许可通常会将您限制为预设的最大容量。因此,您的自动扩缩能力可能会受到限制,因为您不能即时添加许可。
虚拟机实例空余带宽太小
为了应对流量的突然爆发,自动调节程序应该包括充足的空余带宽(例如,当 CPU 容量达到 70% 时触发自动调节程序)。为了节省成本,您可能希望将此目标设置得更高,例如 CPU 容量达到 90%。但是,较高的触发值在流量爆发(例如突然增加需求的广告活动)的情况下可能会导致扩缩瓶颈。您需要根据流量的峰值以及新虚拟机实例的准备时间来平衡空余带宽的大小。
区域配额
如果某个区域出现意外爆发,现有的资源配额可能不足以将可以扩缩的实例数增加到支持当前爆发所需的水平。处理资源配额的增量可能需要几个小时或几天。
通过全球负载平衡解决这些难题
外部应用负载均衡器和外部代理网络负载均衡器是通过全球同步的 Google Front End (GFE) 服务器代理的全球负载均衡产品,可以更轻松地缓解这些类型的负载均衡难题。这些产品提供了解决这些难题的解决方案,因为流量分配给后端的方式与大多数区域负载平衡解决方案不同。
以下各部分介绍了这些差异。
其他负载平衡器使用的算法
大多数负载平衡器使用相同的算法在后端之间分配流量:
- 轮循机制。无论数据包的源和目标位置是什么,均在所有后端之间均匀分配。
- 哈希技术。根据流量信息(包括源 IP、目标 IP、端口和协议)的哈希来识别数据包流。生成相同哈希值的所有流量都流向同一后端。
哈希负载均衡是外部直通式网络负载均衡器目前使用的算法。 此负载平衡器支持 2 元组哈希技术(基于源和目的地 IP),3 元组哈希技术(基于源 IP、目的地 IP 和协议)和 5 元组哈希技术(基于源 IP、目的地 IP、源端口、目的地端口和协议)。
对于这两种算法,运行状况不佳的实例将不会进行分配。但是,后端上的当前负载几乎不影响负载分配。
某些硬件或软件负载平衡器使用根据其他指标(例如加权轮询、最低负载、最快响应时间或有效连接数)转发流量的算法。但是,如果由于突然的流量爆发而导致负载的增加超过预期水平,则流量仍会分配到已超出容量的后端实例,从而导致延迟时间急剧增加。
某些负载平衡器允许高级规则,超出后端容量的流量将转发到其他池或重定向到静态网站。这使您可以有效地拒绝此流量并发送“服务不可用,请稍后重试”消息。某些负载平衡器允许您将请求添加到队列。
全球负载平衡解决方案通常使用基于 DNS 的算法实现,根据用户的位置和后端负载为不同的区域负载平衡 IP 提供服务。这些解决方案为区域部署提供故障切换,将某区域的全部或部分流量转移到其他区域。但是,在任何基于 DNS 的解决方案上,故障切换通常需要几分钟,具体取决于 DNS 条目的生存时间 (TTL) 值。通常,少量流量将继续定向到旧服务器,远远超过任何位置的 TTL 过期时间。因此,基于 DNS 的全球负载平衡不是处理爆发情景中流量的最佳解决方案。
外部应用负载均衡器的工作原理
外部应用负载均衡器使用不同的方法。通过在大多数 Google 全球网络边缘位置部署的 GFE 服务器来经由代理处理流量。目前,GFE 服务器遍布全球 80 多个地点。系统会在 GFE 服务器应用负载均衡算法。
外部应用负载均衡器可通过在边缘节点全球通告的单一稳定 IP 地址提供,并且连接可以由任何 GFE 终止。
GFE 通过 Google 全球网络相互连接。描述每个负载平衡资源的可用后端和可用传送容量的数据将使用全球控制层面连续分配到所有 GFE。
通过使用称为 Waterfall by Region 的特殊负载均衡算法,将流向负载均衡 IP 地址的流量经由代理路由到在外部应用负载均衡器配置中定义的后端实例。该算法通过考虑实例与用户的距离、传入的负载以及每个地区和区域中后端的可用容量来确定传送请求的最佳后端。最后,还会考虑全球负载和容量。
外部应用负载均衡器根据可用实例分配流量。要根据负载添加新实例,请将该算法与自动扩缩实例组搭配使用。
地区内的流量
在正常情况下,所有流量都会被发送到离用户最近的区域。然后根据以下准则执行负载平衡:
在每个区域内,流量在实例组中进行分配,实例组可以根据每个组的容量分布在多个地区中。
如果地区之间的容量不相等,则按地区可用传送容量的比例加载地区。
在地区内,请求均匀地分布在每个实例组中的实例上。
会话根据客户端 IP 地址或 cookie 值进行保留,具体取决于会话粘性设置。
除非后端变得不可用,否则现有 TCP 连接永远不会移动到其他后端。
下图显示了此情况下的负载分配,其中每个地区均未超出容量,可以处理离该地区最近的用户的负载。
流量溢出到其他地区
如果整个区域达到由后端服务中设置的传送容量所确定的容量,则会触发 Waterfall by Region 算法,并且流量会溢出到具有可用容量的最近区域。当每个区域达到容量时,流量会溢出到下一个最近区域,依此类推。区域与用户的距离由从 GFE 到实例后端的网络往返时间定义。
下图显示当一个地区接收的流量超过其可处理的流量时,溢出到下一个最近地区。
由运行状况不佳的后端导致的跨地区溢出
如果健康检查发现某个区域中超过一半的后端健康状况不佳,则 GFE 会抢先将一些流量溢出到下一个最近区域。这是为了避免由于该区域运行状况不佳而导致流量传送完全失败。即使具有运行状况不佳的后端的区域中所剩余的容量足够,也会发生此溢出。
下图显示了此溢出机制的实际情况,因为某区域中的大多数后端运行状况不佳。
所有地区均超出容量
当流向所有区域的流量均达到或超出容量时,流量会进行平衡,以便每个区域处于相同的相对溢出水平(与其容量相比)。例如,如果全球需求超过全球容量 20%,则流量会通过以下方式分配:所有区域均接收超过其区域容量 20% 的请求,同时尽可能保持流量本地化。
下图显示了此全球溢出规则的实际情况。在此情况下,单个地区接收的流量非常大,以致于无法根据可用的传送容量在全球进行分配。
自动扩缩期间的临时溢出
自动扩缩基于每个后端服务上配置的容量限制,并在流量接近配置的容量限制时调用新实例。根据请求数量的上升速度以及新实例的启用速度,可能不需要溢出到其他区域。在其他情况下,溢出可以充当临时缓冲区,直到新的本地实例启用并准备好传送实时流量。如果通过自动扩缩扩展的容量足够,所有新会话都将分配到最近区域。
溢出的延迟效应
根据 Waterfall by Region 算法,可以通过外部应用负载均衡器将一些流量溢出到其他区域。但是,TCP 会话和 SSL 流量仍然以离用户最近的 GFE 为终点。这有利于降低应用延迟;如需了解详情,请参阅通过负载平衡优化应用延迟。
实践:衡量容量管理的效果
要了解溢出是如何发生的以及如何使用 HTTP 负载平衡器对其进行管理,请参阅本文附带的使用负载平衡进行容量管理教程。
使用外部应用负载均衡器解决容量难题
为帮助解决前文所述的难题,外部应用负载均衡器和外部代理网络负载均衡器可以将容量溢出到其他区域。对于全球应用,使用略高的总体延迟响应用户可以实现比使用地区后端更好的体验。 使用地区后端的应用名义上延迟较低,但它们可能会过载。
我们来回顾一下外部应用负载均衡器如何帮助应对本文开头提到的情形:
启动新实例的延迟。如果自动扩缩器无法在本地流量爆发期间足够快速地增加容量,外部应用负载均衡器便会暂时将连接溢出到下一个最近区域。这可以确保以最佳速度处理原始区域中的现有用户会话,因为它们仍然位于现有后端,而新用户会话只会遇到轻微的延迟。只要在原始区域中增加了其他后端实例,新流量就会再次路由到离用户最近的区域。
应用受后端容量限制。当某区域的需求超出为通常的流量需求部署的容量时,无法自动扩缩但在多个区域可用的应用仍可溢出到下一个最近区域。
非弹性许可。如果软件许可数量有限,并且当前区域中的许可池已用尽,外部应用负载均衡器就可以将流量移至有可用许可的另一个区域。为此,最大实例数会设置为自动调节程序上的最大许可数。
虚拟机空余带宽太小。可能发生的区域溢出有助于节省费用,因为您可以设置在高 CPU 使用率时触发自动扩缩。您还可以将可用的后端容量配置为低于每个区域峰值,因为溢出到其他区域可确保全球容量始终充足。
区域配额。如果 Compute Engine 资源配额无法满足需求,外部应用负载均衡器的溢出机制就会自动将部分流量重定向到仍可在自身配额范围内扩缩的区域。
后续步骤
以下页面提供了有关 Google 负载平衡选项的详情和背景: