外部直通式网络负载平衡器的流量分发

本页介绍了以下概念,以帮助您进一步了解和自定义外部直通式网络负载均衡器如何分配流量:会话亲和性、连接跟踪、加权负载均衡、连接排空、UDP 碎片和故障切换。

外部直通式网络负载均衡器分配新连接的方式取决于您是否配置了故障切换:

  • 如果您未配置故障切换,并且至少有一个后端虚拟机健康状况良好,则外部直通式网络负载均衡器会为其健康状况良好的后端虚拟机分配新连接。当所有后端虚拟机均运行状况不佳时,作为最后的补救手段,负载均衡器会在所有后端之间分配新连接。在这种情况下,负载均衡器会将每个新连接路由到运行状况不佳的后端虚拟机。
  • 如果已配置故障切换,外部直通式网络负载均衡器会根据您配置的故障切换政策,在其活跃池中运行状况良好的虚拟机之间分配新连接。当所有后端虚拟机运行状况都不佳时,您可以从以下行为中选择一个
    • (默认)负载均衡器仅将流量分配到主虚拟机。这是最后的补救措施。此连接分配的最后补救措施不包括备用虚拟机。
    • 负载均衡器丢弃流量。

如需详细了解如何分配连接,请参阅下一部分后端选择和连接跟踪

如需详细了解故障切换的工作原理,请参阅故障切换部分。

后端选择和连接跟踪

外部直通式网络负载均衡器使用可配置的后端选择和连接跟踪算法来确定流量如何分配到后端虚拟机。

外部直通式网络负载均衡器使用以下算法在后端虚拟机之间(如果已配置故障切换,则在其活跃池中)分配数据包:

  1. 如果负载均衡器的连接跟踪表中包含一个与传入数据包的特征匹配的条目,则该数据包会发送到由该连接跟踪表条目指定的后端。该数据包被视为之前建立的连接的一部分,因此数据包会发送到负载均衡器之前确定并记录在其连接跟踪表中的后端虚拟机。
  2. 当负载均衡器收到没有对应的连接跟踪条目的数据包时,负载均衡器会执行以下操作:

    1. 负载均衡器选择一个后端。负载均衡器根据配置的会话亲和性计算哈希值。它使用此哈希值从健康状况良好的后端中选择一个后端(除非所有后端健康状况不佳,在这种情况下,只要故障切换政策尚未配置为在这种情况下丢弃流量。默认会话亲和性 NONE 使用以下哈希算法:

      • 对于 TCP 和未分段的 UDP 数据包,使用数据包来源 IP 地址、来源端口、目的地 IP 地址、目的地端口和协议的 5 元组哈希。
      • 对于分段的 UDP 数据包和所有其他协议,使用数据包来源 IP 地址、目的地 IP 地址和协议的 3 元组哈希。

      您可以通过使用较少信息的哈希算法自定义后端选择。如需查看所有受支持的选项,请参阅会话亲和性选项

      此外,请注意以下事项:

      如果您启用加权负载均衡,则基于哈希的后端选择会根据后端实例报告的权重进行加权。例如:

      • 假设后端服务配置了设置为 NONE 的会话亲和性以及协议为 UDP 的转发规则。如果有两个健康状况良好的后端实例(权重为 1 和 4),则后端会分别收到 20% 和 80% 的 UDP 数据包。
      • 假设后端服务配置了 3 元组会话亲和性和连接跟踪。会话亲和性为 CLIENT_IP_PROTO,连接跟踪模式为 PER_SESSION。如果有三个运行状况良好的后端实例(权重分别为 0、2 和 6),则后端将分别获得 0%、25% 和 75% 的新来源 IP 地址(不存在现有的连接跟踪表条目的来源 IP 地址)的流量。现有连接的流量会流向之前分配的后端。
    2. 负载均衡器向其连接跟踪表中添加一个条目。此条目记录了所选数据包连接的后端,以便来自此连接的所有未来数据包都发送到同一后端。是否使用连接跟踪取决于协议:

      • TCP 数据包。连接跟踪始终处于启用状态,且无法关闭。默认情况下,连接跟踪为 5 元组,但也可以将其配置为小于 5 元组。如果是 5 元组,TCP SYN 数据包的处理方式会有所不同。与非 SYN 数据包不同,此类数据包会舍弃所有匹配的连接跟踪条目,并始终选择新的后端。

        在以下情况下,使用默认的 5 元组连接跟踪:

        • 跟踪模式为 PER_CONNECTION(所有会话亲和性),或
        • 跟踪模式为 PER_SESSION 且会话亲和性为 NONE,或
        • 跟踪模式为 PER_SESSION 且会话亲和性为 CLIENT_IP_PORT_PROTO
      • UDP、ESP 和 GRE 数据包。仅当会话亲和性设置为 NONE 以外的其他值时,系统才会启用连接跟踪。

      • ICMP 和 ICMPv6 数据包。无法使用连接跟踪。

      如需详细了解启用连接跟踪的时间以及启用连接跟踪时使用的跟踪方法,请参阅连接跟踪模式

      此外,请注意以下事项:

      • 在负载均衡器处理最后一个与条目匹配的数据包后 60 秒,连接跟踪表中的条目会过期。如需了解详情,请参阅空闲超时
      • 根据协议,负载均衡器可能会在后端不健康时移除连接跟踪表条目。如需了解详情以及如何自定义此行为,请参阅不健康的后端上的连接持久性

会话亲和性选项

会话亲和性控制从客户端到负载均衡器的后端虚拟机的新连接分配。会话亲和性是为整个区域级外部后端服务(而非单个后端)指定的。

外部直通式网络负载均衡器支持以下会话亲和性选项:

  • 无 (NONE)。来源 IP 地址、来源端口、协议、目的地 IP 地址和目的地端口的 5 元组哈希
  • 客户端 IP、目的地 IP (CLIENT_IP)。来源 IP 地址和目的地 IP 地址的 2 元组哈希
  • 客户端 IP、目的地 IP、协议 (CLIENT_IP_PROTO)。来源 IP 地址、目的地 IP 地址和协议的 3 元组哈希
  • 客户端 IP、客户端端口、目标 IP、目标端口、协议 (CLIENT_IP_PORT_PROTO)。来源 IP 地址、来源端口、协议、目标 IP 地址和目标端口的 5 元组哈希

如需了解这些会话亲和性选项如何影响后端选择和连接跟踪方法,请参阅此表

连接跟踪政策

本部分介绍了用于控制外部直通式网络负载平衡器连接跟踪行为的设置。连接跟踪政策包括以下设置:

连接跟踪模式

是否启用连接跟踪仅取决于负载均衡流量的协议和会话亲和性设置。跟踪模式指定启用连接跟踪时要使用的连接跟踪算法。跟踪模式有两种:PER_CONNECTION(默认)和 PER_SESSION

  • PER_CONNECTION(默认值)。这是默认的跟踪模式。使用此连接跟踪模式时,TCP 流量始终按 5 元组进行跟踪,无论会话亲和性如何设置。对于 UDP、ESP 和 GRE 流量,当所选会话亲和性不是 NONE 时,系统会启用连接跟踪。UDP、ESP 和 GRE 数据包会使用此中所述的跟踪方法进行跟踪。

  • PER_SESSION。如果会话亲和性为 CLIENT_IPCLIENT_IP_PROTO,则配置此模式会分别生成 2 元组和 3 元组连接跟踪。所有协议(ICMP 和 ICMPv6 除外,不可跟踪连接)。对于其他会话亲和性设置,PER_SESSION 模式的行为与 PER_CONNECTION 模式相同。

如需了解这些跟踪模式如何与每个协议的不同会话亲和性设置结合使用,请参阅下表。

后端选择 连接跟踪模式
会话亲和性设置 用于选择后端的哈希方法 PER_CONNECTION(默认) PER_SESSION
默认:无会话亲和性

NONE

TCP 和未分段的 UDP:5 元组哈希

分段的 UDP 和所有其他协议:3 元组哈希

  • TCP:5 元组连接跟踪
  • 所有其他协议:连接跟踪关闭
  • TCP:5 元组连接跟踪
  • 所有其他协议:连接跟踪关闭
客户端 IP、目标 IP

CLIENT_IP

所有协议:2 元组哈希
  • TCP 和未分段的 UDP:5 元组连接跟踪
  • 分段的 UDP、ESP 和 GRE:3 元组连接跟踪
  • 所有其他协议:连接跟踪关闭
  • TCP、UDP、ESP、GRE:2 元组连接跟踪
  • 所有其他协议:连接跟踪关闭
客户端 IP、目标 IP、协议

CLIENT_IP_PROTO

所有协议:3 元组哈希
  • TCP 和未分段的 UDP:5 元组连接跟踪
  • 分段的 UDP、ESP 和 GRE:3 元组连接跟踪
  • 所有其他协议:连接跟踪关闭
  • TCP、UDP、ESP、GRE:3 元组连接跟踪
  • 所有其他协议:连接跟踪关闭
客户端 IP、客户端端口、目的地 IP、目的地端口、协议

CLIENT_IP_PORT_PROTO

TCP 和未分段的 UDP:5 元组哈希

分段的 UDP 和所有其他协议:3 元组哈希

  • TCP 和未分段的 UDP:5 元组连接跟踪
  • 分段的 UDP、ESP 和 GRE:3 元组连接跟踪
  • 所有其他协议:连接跟踪关闭
  • TCP 和未分段的 UDP:5 元组连接跟踪
  • 分段的 UDP、ESP 和 GRE:3 元组连接跟踪
  • 所有其他协议:连接跟踪关闭

如需了解如何更改连接跟踪模式,请参阅配置连接跟踪政策

运行状况不佳的后端的连接持久性

连接持久性设置用于控制现有连接在后端运行状况不佳后是否持续存在于所选后端虚拟机或端点上,前提是该后端保留在负载均衡器的已配置后端组中(在实例组中或 NEG 中)。

本部分介绍的行为不适用于从实例组中移除后端实例、从 NEG 中移除后端端点或者从后端服务移除实例组或 NEG 的情况。在这种情况下,已建立的连接仅会按连接排空中所述持续存在。

以下连接持久性选项可用:

  • DEFAULT_FOR_PROTOCOL(默认)
  • NEVER_PERSIST
  • ALWAYS_PERSIST

下表总结了连接持久性选项,以及连接针对不同协议、会话亲和性选项和跟踪模式的持久程度。

不健康的后端上的连接持久性选项 连接跟踪模式
PER_CONNECTION PER_SESSION
DEFAULT_FOR_PROTOCOL

TCP:连接持续存在于运行状况不佳的后端上(所有会话亲和性)

所有其他协议:连接始终不持续存在于运行状况不佳的后端上

TCP:如果会话亲和性为 NONECLIENT_IP_PORT_PROTO,则连接会持续存在于运行状况不佳的后端上

所有其他协议:连接始终不持续存在于运行状况不佳的后端上

NEVER_PERSIST 所有协议:连接始终不持续存在于运行状况不佳的后端上
ALWAYS_PERSIST

TCP:连接持续存在于不健康的后端上(所有会话亲和性)

ESP、GRE、UDP:如果会话亲和性不是 NONE,则连接会持续存在于健康状况不佳的后端上

ICMP、ICMPv6:不适用,因为它们不可跟踪连接

此选项应仅用于高级使用场景。

无法进行配置

运行状况不佳的后端上的 TCP 连接持久性行为

每当采用 5 元组跟踪的 TCP 连接持续存在于运行状况不佳的后端上时:

  • 如果运行状况不佳的后端继续响应数据包,则连接将持续存在,直到运行状况不佳的后端或客户端将其重置或关闭。
  • 如果运行状况不佳的后端发送 TCP 重置 (RST) 数据包或未响应数据包,则客户端可能会使用新连接重试,让负载均衡器选择其他运行状况良好的后端。TCP SYN 数据包始终选择运行状况良好的新后端。

如需了解如何更改连接持久性行为,请参阅配置连接跟踪政策

空闲超时

在负载均衡器处理最后一个与条目匹配的数据包后 60 秒,连接跟踪表中的条目会过期。此空闲超时值无法修改。

加权负载均衡

您可以将网络负载均衡器配置为根据使用加权负载均衡的 HTTP 健康检查报告的权重,在负载均衡器的后端实例之间分配流量。

加权负载均衡要求您配置以下两项:

  • 您必须将后端服务的位置负载均衡器政策 (localityLbPolicy) 设置为 WEIGHTED_MAGLEV
  • 您必须配置具有 HTTP 健康检查的后端服务。HTTP 健康检查响应必须包含自定义 HTTP 响应标头字段 X-Load-Balancing-Endpoint-Weight,以指定每个后端实例的值为 01000 的权重。

如果您为使用加权负载均衡的多个基于后端服务的外部直通式网络负载均衡器使用相同的后端(实例组或 NEG),我们建议为后端服务的每项健康检查使用唯一的 request-path。这让端点实例可以为不同的后端服务分配不同的权重。如需了解详情,请参阅 HTTP、HTTPS、HTTP/2 健康检查的成功标准

为了为新连接选择后端,系统会根据后端的权重和运行状况为其分配严格的优先级顺序,如下表所示:

权重 健康状况良好 后端选择优先级
权重大于零 4
权重大于零 3
权重等于零 2
权重等于零 1

只有优先级最高的后端才有资格参与后端选择。如果所有符合条件的后端的权重为零,则负载均衡器会在所有符合条件的后端之间分配新连接,并将这些后端视为具有相同的权重。如需查看加权负载均衡的示例,请参阅后端选择和连接跟踪

加权负载均衡适用于以下情况:

  • 如果某些连接处理的数据比其他连接多,或者某些连接持续的时间比其他连接长,则后端负载分配可能会变得不均匀。通过发出信号指示较低的实例权重,具有高负载的实例可以减少其新连接所占的份额,同时保持为现有连接提供服务。

  • 如果后端过载,分配更多连接可能会中断现有连接,则此类后端会为自身分配零权重。通过发出信号指示零权重,后端实例会停止为新连接提供服务,但继续为现有连接提供服务。

  • 如果后端在维护之前正在耗尽现有连接,则会为自身分配零权重。通过发出信号指示零权重,后端实例会停止为新连接提供服务,但继续为现有连接提供服务。

如需了解详情,请参阅配置加权负载均衡

连接排空

在以下情况下,连接排空是应用于已建立的连接的过程:

  • 从后端(实例组或 NEG)移除虚拟机或端点。
  • 后端(在滚动升级或缩减时通过替换、放弃的方式)移除虚拟机或端点。
  • 从后端服务中移除后端。

默认情况下,连接排空处于停用状态。如果停用,尽快建立连接。启用连接排空后,可允许已建立的连接保留可配置的超时,在此之后终止后端虚拟机实例。

如需详细了解如何触发连接排空以及如何启用连接排空,请参阅启用连接排空

UDP 分段

基于后端服务的外部直通式网络负载均衡器可以处理分段和未分段的 UDP 数据包。如果您的应用使用分段的 UDP 数据包,请注意以下几点:

  • UDP 数据包在到达 Google CloudVPC 网络之前可能会被分段。
  • Google Cloud VPC 网络会在 UDP 分段到达时进行转发(无需等待所有分段到达)。
  • 非Google Cloud 网络和本地网络设备可以在收到 UDP 片段时进行转发,将经过分段的 UDP 数据包延迟到所有片段到达,或舍弃经过分段的 UDP 数据包。如需了解详情,请参阅网络提供商或网络设备的文档。

如果您预期会对 UDP 数据包进行分段并需要将其路由到相同的后端,请使用以下转发规则和后端服务配置参数:

  • 转发规则配置:每个负载平衡的 IP 地址只使用一个 UDPL3_DEFAULT 转发规则,并将转发规则配置为接受所有端口的流量。这确保了所有数据段到达相同的转发规则。即使分段的数据包(第一个数据段除外)缺少目标端口,但在配置转发规则以处理所有端口的流量时,也会将其配置为接收没有端口信息的 UDP 数据段。如需配置所有端口,请使用 Google Cloud CLI 设置 --ports=ALL,或使用 API 将 allPorts 设置为True

  • 后端服务配置:将后端服务的会话亲和性设置为 CLIENT_IP(2 元组哈希)或 CLIENT_IP_PROTO(3 元组哈希),以便为包含端口信息的 UDP 数据包和缺少端口信息的 UDP 数据段(第一个数据段除外)选择同一后端。将后端服务的连接跟踪模式设置为 PER_SESSION,以便使用相同的 2 元组或 3 元组哈希构建连接跟踪表条目。

故障切换

您可以将外部直通式网络负载均衡器配置为在主要后端(实例组或 NEG)中的虚拟机实例或端点之间分配连接,然后在需要时切换为使用故障切换后端。故障切换提供了另一种提高可用性的方法,同时还可让您在主要后端健康状况不佳时更好地控制管理工作负载的方式。

默认情况下,您向外部直通式网络负载均衡器的后端服务添加后端时,该后端是主要后端。您可以在将某个后端添加到负载均衡器的后端服务时将其指定为故障切换后端,或者在以后通过修改后端服务将该后端指定为故障切换后端。

如需详细了解故障切换的工作原理,请参阅外部直通式网络负载均衡器的故障切换概览

后续步骤