内部直通式网络负载平衡器的流量分布

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

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

  • 如果您尚未配置故障切换,并且至少有一个后端虚拟机健康,则内部直通式网络负载均衡器会将新连接分配到其健康的后端虚拟机。当所有后端虚拟机均不健康时,作为最后的补救手段,负载均衡器会在所有后端之间分配新连接。在这种情况下,负载平衡器会将每个新连接路由到运行状况不佳的后端虚拟机。

  • 如果已配置故障切换,内部直通式网络负载均衡器会根据所配置的故障切换政策在其活跃池中的虚拟机之间分配新连接。当所有后端虚拟机都不健康时,您可以从以下行为中选择一个:

    • 默认)负载均衡器仅将流量分配到主虚拟机。这是最后的补救措施。此连接分配的最后补救措施不包括备用虚拟机。
    • 负载均衡器配置为舍弃流量

分配新连接的方法取决于负载均衡器的会话亲和性设置

健康检查状态控制新连接的分配。默认情况下,TCP 连接保留在不健康的后端上。如需了解详情以及如何更改此行为,请参阅不健康的后端上的连接持久性

后端选择和连接跟踪

内部直通式网络负载均衡器使用可配置的后端选择和连接跟踪算法来确定流量如何分配到后端虚拟机。内部直通式网络负载均衡器使用以下算法在后端虚拟机之间(如果已配置故障切换,则在其活跃池中)分配数据包:

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

    1. 负载均衡器选择一个后端。负载均衡器根据配置的会话亲和性计算哈希值。它使用此哈希来选择一个后端:

      • 如果至少有一个后端健康,则该哈希会选择其中一个健康的后端。
      • 如果所有后端都不健康,并且未配置故障切换政策,则哈希会选择其中一个后端。
      • 如果所有后端都不健康,但配置了故障切换政策,并且故障切换政策配置为在这种情况下丢弃流量,则哈希会选择一个主要虚拟机后端。

      默认会话亲和性 NONE 使用数据包的来源 IP 地址、来源端口、目的地 IP 地址、目的地端口和协议的 5 元组哈希。

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

    2. 负载均衡器向其连接跟踪表中添加一个条目。此条目记录了所选数据包连接的后端,以便来自此连接的所有未来数据包都发送到同一后端。是否使用连接跟踪取决于协议:

      对于 TCP 和 UDP 数据包,连接跟踪始终处于启用状态且无法关闭。默认情况下,连接跟踪为 5 元组,但也可以将其配置为小于 5 元组。

      当连接跟踪哈希为 5 元组时,TCP SYN 数据包始终会在连接跟踪表中创建一个新条目。

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

      • 跟踪模式为 PER_CONNECTION(所有会话亲和性),或
      • 跟踪模式为 PER_SESSION 且会话亲和性为 NONE,或
      • 跟踪模式为 PER_SESSION 且会话亲和性为 CLIENT_IP_PORT_PROTO

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

      此外,请注意以下事项:

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

会话亲和性选项

会话亲和性控制从客户端到负载均衡器的后端虚拟机的新连接分配。当您的后端虚拟机需要跟踪其客户端的状态信息时,您可以设置会话亲和性。这是 Web 应用的常见要求。

会话亲和性以尽力而为的方式工作。

内部直通式网络负载均衡器支持您为整个内部后端服务(而非每个后端实例组)指定的以下会话亲和性选项。

  • 无 (NONE)。来源 IP 地址、来源端口、协议、目的地 IP 地址和目的地端口的 5 元组哈希
  • 客户端 IP,无目的地 (CLIENT_IP_NO_DESTINATION)。仅从来源 IP 地址创建的 1 元组哈希。
  • 客户端 IP (CLIENT_IP)。来源 IP 地址和目的地 IP 地址的 2 元组哈希。外部直通式网络负载均衡器将此会话亲和性选项称为“客户端 IP、目的地 IP”
  • 客户端 IP、目的地 IP、协议 (CLIENT_IP_PROTO)。来源 IP 地址、目的地 IP 地址和协议的 3 元组哈希
  • 客户端 IP、客户端端口、目标 IP、目标端口、协议 (CLIENT_IP_PORT_PROTO)。来源 IP 地址、来源端口、协议、目标 IP 地址和目标端口的 5 元组哈希

除非将负载均衡器用作自定义静态路由的下一个跃点,否则数据包的目的地 IP 地址必须与负载均衡器转发规则的 IP 地址匹配才能将数据包发送到负载均衡器。如需了解将负载均衡器用作自定义静态路由的下一个跃点时的注意事项,请参阅会话亲和性和下一个跃点内部直通式网络负载均衡器

会话亲和性和下一个跃点内部直通式网络负载均衡器

当您将静态路由配置为使用下一个跃点内部直通式网络负载均衡器时,负载均衡器会使用之前讨论过的相同的后端选择和连接跟踪方法。后端选择的实现方式仍然是根据配置的会话亲和性计算哈希。除了 CLIENT_IP_NO_DESTINATION 会话亲和性之外,后端选择哈希还部分取决于数据包目标 IP 地址。

当内部直通式网络负载均衡器是静态路由的下一个跃点时,目标 IP 地址不限于负载均衡器的转发规则 IP 地址。相反,数据包的目标 IP 地址可以是处于静态路由目标范围内的任何 IP 地址。

如果已配置且健康状况良好的后端虚拟机的数量保持不变(未配置故障切换时,或者配置了故障切换但未发生故障切换或故障恢复事件时),负载均衡器的行为如下:

  • 如果只有一个已配置且健康状况良好的后端虚拟机(在活跃池中,如果已配置故障切换),那么您使用哪种会话亲和性都无关紧要,因为所有哈希都会映射到一个后端虚拟机。

  • 如果有两个或更多已配置且健康状况良好的后端虚拟机(在活跃池中,如果已配置故障切换),那么会话亲和性的选择非常重要:

    • 如果您需要同一后端虚拟机仅根据数据包的来源 IP 地址(而不考虑数据包目标 IP 地址)处理来自客户端的所有数据包,请使用 CLIENT_IP_NO_DESTINATION 会话亲和性。根据流量模式,某些后端虚拟机可能会比其他后端虚拟机接收更多数据包或更多连接。

    • 如果您使用的会话亲和性选项不是 CLIENT_IP_NO_DESTINATION,负载均衡器会根据至少包含数据包的来源 IP 地址和目标 IP 地址两者的信息来选择后端虚拟机。如果从同一客户端发送的数据包使用相同的来源 IP 地址,但使用不同的目标 IP 地址,它们可以路由到不同的后端虚拟机。

连接跟踪政策

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

连接跟踪模式

跟踪模式指定要使用的连接跟踪算法。跟踪模式有两种:PER_CONNECTION(默认)和 PER_SESSION

  • PER_CONNECTION(默认值)。在此模式下,无论会话亲和性设置如何,系统始终会按照每个 5 元组来跟踪 TCP 和 UDP 流量。这意味着用于连接跟踪(5 元组)的键可能与配置的会话亲和性设置(例如,具有 CLIENT_IP_PROTO 设置的 3 元组)不同。因此,会话亲和性可能会被拆分,并且如果一组后端或其健康状况发生更改,会话的新连接可能会选择其他后端。

  • PER_SESSION。在此模式下,将会根据配置的会话亲和性对 TCP 和 UDP 流量进行跟踪。也就是说,如果会话亲和性为 CLIENT_IPCLIENT_IP_PROTO,则配置此模式会分别生成 2 元组和 3 元组连接跟踪。这在破坏亲和性开销很大并且在添加更多后端之后甚至应该避免破坏亲和性的情况下是可取的。

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

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

NONE

5 元组哈希 5 元组连接跟踪 5 元组连接跟踪

客户端 IP,无目的地

CLIENT_IP_NO_DESTINATION

1 元组哈希 5 元组连接跟踪 1 元组连接跟踪

客户端 IP

CLIENT_IP

(与用于外部直通式网络负载均衡器的客户端 IP、目的地 IP 相同)

2 元组哈希 5 元组连接跟踪 2 元组连接跟踪

客户端 IP、目的地 IP、协议

CLIENT_IP_PROTO

3 元组哈希 5 元组连接跟踪 3 元组连接跟踪

客户端 IP、客户端端口、目的地 IP、目的地端口、协议

CLIENT_IP_PORT_PROTO

5 元组哈希 5 元组连接跟踪 5 元组连接跟踪

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

不健康的后端的连接持久性

不健康的后端设置上的连接持久性用于控制所选后端上的现有连接在后端变得不健康之后(只要该后端保留在负载均衡器的已配置后端实例组中)是否仍存在。

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

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

  • DEFAULT_FOR_PROTOCOL(默认)
  • NEVER_PERSIST
  • ALWAYS_PERSIST

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

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

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

UDP:连接永远不会在不健康的后端上持续存在

TCP:如果会话亲和性为 NONECLIENT_IP_PORT_PROTO,则连接会持续存在于不健康的后端上

UDP:连接永远不会在不健康的后端上持续存在

NEVER_PERSIST TCP、UDP:连接永远不会在不健康的后端上持续存在
ALWAYS_PERSIST

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

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

无法进行配置

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

空闲超时

默认情况下,连接跟踪表中的条目在负载均衡器处理最后一个与条目匹配的数据包后 600 秒,连接跟踪表中的条目会过期。只有在连接跟踪小于 5 元组(即会话亲和性配置为 CLIENT_IPCLIENT_IP_PROTO,并且跟踪模式为 PER_SESSION)时,才能修改此默认空闲超时值。

最大可配置空闲超时值为 57600 秒(16 小时)。

如需了解如何更改空闲超时值,请参阅配置连接跟踪政策

单客户端部署的连接

在测试与仅有一个客户端的内部直通式网络负载平衡器的 IP 地址的连接时,请注意以下几点:

  • 如果客户端虚拟机不是负载均衡的虚拟机(即它不是后端虚拟机),则新连接会传送到负载均衡器的健康后端虚拟机。不过,由于所有会话亲和性选项至少都依赖于客户端系统的 IP 地址,因此来自同一客户端的连接可能比您预期的更频繁地分布到同一后端虚拟机。

    实际上,这意味着您无法通过从单个客户端连接到内部直通式网络负载均衡器来准确监控流量的分配情况。监控流量分配所需的客户端数量因负载均衡器类型、流量类型和健康的后端数量而异。

  • 如果客户端虚拟机也是负载均衡器的后端虚拟机,则发送到负载均衡器转发规则的 IP 地址的连接始终由同一后端虚拟机(也是客户端虚拟机)应答。无论后端虚拟机的运行状况是否良好,都会发生这种情况。发送到负载均衡器 IP 地址的所有流量都会发生这种情况,而不仅仅是负载均衡器内部转发规则中指定的协议和端口上的流量。

    如需了解详情,请参阅从负载均衡虚拟机发送请求

连接排空

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

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

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

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

UDP 分段

内部直通式网络负载均衡器可以处理分段和未分段的 UDP 数据包。如果您的应用使用分段的 UDP 数据包,请注意以下几点:
  • UDP 数据包在到达 Google CloudVPC 网络之前可能会被分段。
  • Google Cloud VPC 网络会在 UDP 分段到达时进行转发(无需等待所有分段到达)。
  • 非Google Cloud 网络和本地网络设备可以在收到 UDP 片段时进行转发,将经过分段的 UDP 数据包延迟到所有片段到达,或舍弃经过分段的 UDP 数据包。如需了解详情,请参阅网络提供商或网络设备的文档。

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

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

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

故障切换

借助内部直通式网络负载均衡器,您可以将某些后端指定为故障切换后端。只有当主要后端实例组中健康的虚拟机数量低于可配置阈值时,才会使用这些后端。默认情况下,如果所有主要虚拟机和故障切换虚拟机都不健康,作为最后的补救手段,Google Cloud 会仅在所有主要虚拟机之间分配新连接。

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

如需了解内部直通式网络负载均衡器中的故障切换详细概念性概览,请参阅内部直通式网络负载均衡器的故障切换

后续步骤