使用 AWS Global Accelerator 进行部署的最佳实践
在本文中,我们确定了使用 Global Accelerator 可能导致连接冲突的场景,并解释了为什么会发生这种情况以及如何缓解它。我们还提供了有关如何使用 Global Accelerator 设计应用程序架构以防止连接冲突的指导。
世界各地的用户都期望应用程序稳定、一致且性能良好,无论应用程序托管在何处。然而,终端用户通常会遇到公共互联网上的变化和拥塞,当用户与应用程序的地理位置相距较远时,这个问题尤为突出。这些问题可能成为为用户提供预期在线体验的主要障碍。
AWS Global Accelerator 是一项网络服务,有助于缓解这些挑战。该服务通过将您的流量引导到快速、可靠的 AWS 全球网络基础设施,提高了面向互联网的应用程序的可用性和性能。使用 Global Accelerator,您的终端用户可以通过全局静态 IP 地址访问您的应用程序,这些地址基于地理位置和应用程序健康状况指向 AWS 网络的边缘位置,您还可以配置路由策略。
为了帮助您的用户最大限度地提高 Global Accelerator 的性能,请配置 Global Accelerator 中的加速器以避免可能导致网络延迟的连接冲突问题。在本文中,我们将解释导致连接冲突的场景,并提供您可以用来避免这些冲突及其可能造成的延迟的配置和架构。
概述
Global Accelerator 提供全局静态公共 IP 地址,这些地址充当应用程序端点的固定入口点。这些端点是 AWS 资源,如应用程序负载均衡器、网络负载均衡器、Amazon Elastic Compute Cloud (Amazon EC2) 实例和弹性 IP 地址。对于添加到 Global Accelerator 的大多数资源,您可以启用客户端 IP 地址保留,包括网络负载均衡器。此外,通过安全组提供额外支持的加速器可以通过限制对目标端点的访问来增加Amazon Virtual Private Cloud (VPC) 内的安全性。
在部署 Global Accelerator 时,您可以通过注意并配置加速器以避免可能导致连接冲突的场景来最大化用户的性能。连接冲突是指目标端点看到来自同一客户端 IP 地址的并发连接,且源端口和目标端口相同。这些冲突会导致负载均衡器丢弃连接,从而导致用户出现网络延迟。
使用客户端 IP 地址保留
在我们查看避免连接冲突的最佳实践之前,了解 Global Accelerator 的客户端 IP 地址保留功能如何工作会很有帮助。创建新的加速器时,您可以为支持的端点配置客户端 IP 地址保留:应用程序负载均衡器、EC2 实例和带有安全组的网络负载均衡器。Global Accelerator 通过 5 元组来识别每个连接:源 IP 地址、源端口、目标 IP 地址、目标端口和协议。当禁用客户端 IP 地址保留时,5 元组中的源 IP 地址变为 Global Accelerator 的网络地址转换(NAT)IP 地址。启用客户端 IP 地址保留功能后,源 IP 地址是实际的客户端 IP 地址。
作为客户,您可以将客户端 IP 地址保留用于多种用例。例如,您可以满足围绕客户端 IP 地址的安全和合规限制,应用基于 IP 地址或位置的过滤器的客户端特定逻辑,收集连接统计信息,或在应用程序中提供个性化内容。但是,启用客户端 IP 地址保留后,由于 5 元组哈希机制,可能会出现 Global Accelerator 将不同的连接视为相同的潜在场景。
在本文中,我们定义了造成这种情况的具体场景,并提出了您可以用来避免这些情况的不同架构选项。当为加速器流量启用 NAT 路由时,也可能发生连接冲突。在以下部分中,我们描述了您可以用来防止连接冲突的方法,而无需禁用客户端 IP 地址保留。
有关使用客户端 IP 地址保留的更多信息,请参阅 Global Accelerator 开发者指南。
连接冲突场景
客户使用以下架构之一与 Global Accelerator 一起使用并不少见,每种架构都可能导致连接冲突,从而导致连接时间延迟:
- 将同一负载均衡器配置为多个(单独的)加速器的端点
- 将负载均衡器配置为 Global Accelerator 后面的端点,同时还直接通过公共互联网从终端用户向相同的负载均衡器发送流量
- 将启用了跨可用区流量的负载均衡器配置为加速器的端点
对于每种场景,您可以遵循此处提供的指导来避免连接冲突。
将同一负载均衡器用作多个加速器的端点
要避免在使用同一资源作为多个加速器的端点的架构中出现连接冲突,可以在 Global Accelerator 中为加速器配置端口覆盖。通过端口覆盖,您可以在加速器路由到同一后端资源时,为加速器的侦听器使用不同的端口映射来避免端口冲突。设置端口映射覆盖后,每个加速器使用不同的目标端口(在同一资源上),因此 Global Accelerator 用于哈希的 5 元组是不同的,从而避免了冲突。
这是如何工作的。默认情况下,加速器使用您在为加速器创建侦听器时指定的协议和端口范围将用户流量路由到端点。例如,如果您指定加速器的侦听器接受端口 80 和 443 上的 TCP 流量,加速器会自动将流量路由到其端点上的相同端口。但是,您可以使用端口覆盖重新映射 Global Accelerator 用于将流量路由到端点的侦听器端口。例如,您可以创建一个端口覆盖,使侦听器在端口 80 和 443 上接收用户流量,但加速器将该流量分别路由到其端点上的端口 8080 和 8443。
让我们使用下图(图 1)中所示的简单基础设施示例来说明这在实践中是如何工作的。在此示例中,我们假设您有两个加速器 myTestAcceleratorA 和 myTestAcceleratorB,以及一个单一的应用程序负载均衡器资源。
图 1:配置为覆盖目标端点应用程序负载均衡器的默认端口映射的两个加速器
为避免连接冲突,请按照此图所示为两个加速器的侦听器配置端口覆盖。将 myTestAcceleratorA 的侦听器在端口 443 上设置为映射到目标端口 8443,然后将 myTestAcceleratorB 的侦听器在端口 443 上设置为映射到目标端口 9443。最后,配置应用程序负载均衡器端点以侦听端口 8443 和 9443。
现在,当来自单个用户 IP 地址的流量在两个加速器的侦听器的 443 端口上进入时,它将在不发生连接冲突的情况下到达目标应用程序负载均衡器的不同目标端口号。由于端口覆盖将流量映射到应用程序负载均衡器上的不同端口,Global Accelerator 用于哈希的 5 元组具有不同的值,但流量仍然到达正确的资源。有关如何配置端口覆盖的更多信息,请参阅避免导致 TCP 连接时间延迟的连接冲突。
通过 Global Accelerator 和直接互联网访问使资源可访问
当客户将 Global Accelerator 添加到现有架构时,通常会先将少量流量迁移到该服务,以测试新配置。例如,您可能会创建一个加速器,然后只将一小部分流量移动到全局静态 IP 地址,以验证一切是否正常工作。但是,在此测试阶段,客户端的连接可能会通过多个路径进入您的应用程序:直接从公共互联网使用现有架构,以及通过新加速器的侦听器,这可能会创建连接冲突。
为防止这种情况,请在加速器的侦听器上创建端口覆盖以重新映射默认端口映射。这类似于将一个资源配置为两个加速器的端点时的解决方案。与那种情况一样,您将配置传入流量以在两个不同的目标端口到达端点资源。当您将流量映射到两个不同的目标端口时,流量仍然到达资源,但由于目标端口不同,Global Accelerator 为每个流量流创建的 5 元组哈希也不同。不同的 5 元组哈希可以防止直接客户端流量和通过加速器到达的流量之间的冲突。
让我们使用另一个常见设置来演示这是如何工作的,如下图(图 2)所示。
图 2:配置了应用程序负载均衡器端点的加速器,其中应用程序负载均衡器也可在公共互联网上访问
在我们的示例中,我们有一个公共应用程序负载均衡器,它已被添加到 Global Accelerator 中的加速器以提高性能。当 Global Accelerator 和通过互联网网关到达的流量都使用应用程序负载均衡器的默认目标端口时,无论是来自 Global Accelerator 还是直接来自公共互联网,进入应用程序的传入流量看起来都是相同的。为了区分流量并防止来自同一用户和客户端 IP 地址的流量发生冲突,我们将 Global Accelerator 配置为覆盖负载均衡器上加速器流量的目标端口(应用程序负载均衡器的侦听器端口),从端口 443 到端口 8443。然后,我们将负载均衡器配置为侦听端口 8443 上的加速器流量和端口 443 上的直接互联网流量。
配置具有跨可用区负载均衡的客户端 IP 地址保留
当您为启用了跨可用区负载均衡的网络负载均衡器端点在 Global Accelerator 中启用客户端 IP 保留时,使用加速器访问网络负载均衡器上不同 IP 地址的客户端可能会被路由到同一个目标。如果客户端对两个连接使用相同的源端口,目标将收到看似重复的连接,这可能导致连接冲突错误和建立新连接时的 TCP 延迟。为防止这种情况,您可以禁用网络负载均衡器的跨可用区负载均衡。然后,客户端的连接将被路由到不同的目标,避免潜在的重复连接和相关问题。
要了解有关网络负载均衡器和跨可用区流量的更多信息,请参阅网络负载均衡器网络负载均衡器文档。
最佳实践:复制具有不同路径的基础设施
作为最佳实践,您可以更改应用程序架构来防止问题,而不是使用端口覆盖来纠正连接冲突问题。
当您考虑如何通过修改架构来避免或解决连接冲突时,您可能会采取不同的方法,这取决于您的应用程序和需求。例如,您可能正在探索转向更小的基础设施占用,或者您可能需要一个支持持续 A/B 测试的基础设施。或者,您可能想在架构中创建冗余,以便将来更容易扩展基础设施。
考虑以下解决方案,以确定这些缓解措施是否符合您的业务和技术路径。
- 缓解潜在连接冲突问题的一种方法是复制您的基础设施,然后使用两个加速器将流量定向到应用程序的冗余实例。这不仅解决了连接冲突的问题,还使您能够轻松地为新功能或应用程序更新运行 A/B 测试。
- 当您将 Global Accelerator 添加到现有架构时,缓解连接冲突的另一种方法是创建一个只能通过加速器访问的附加端点。就像您创建两个加速器的场景一样,您添加第二个应用程序负载均衡器来支持客户端流量,但在这里,您只有一个加速器。根据您的应用程序,您可能会将这个额外的应用程序负载均衡器与现有的后端堆栈一起使用。或者,您可能会复制您的应用程序堆栈,在迁移期间暂时拥有两个冗余堆栈,每个堆栈都由不同的应用程序负载均衡器前端。
下图(图 3)说明了第一个建议,其中有一个配置了两个加速器和两个应用程序负载均衡器的配置,每个应用程序负载均衡器的前端都有一个单独的冗余应用程序堆栈。
图 3:配置了两个加速器和两个应用程序负载均衡器端点的配置,每个端点针对一个冗余应用程序副本
总结
在本文中,我们确定了使用 Global Accelerator 可能导致连接冲突的场景,并解释了为什么会发生这种情况以及如何缓解它。我们还提供了有关如何使用 Global Accelerator 设计应用程序架构以防止连接冲突的指导。要开始将 Global Accelerator 与您的 AWS 应用程序一起使用,请立即访问我们的入门页面!
*本文翻译自:Best practices for deployment with AWS Global Accelerator
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前