本页面介绍了内部直通式网络负载均衡器如何分配流量的相关概念。
后端选择和连接跟踪
后端选择和连接跟踪协同工作,以在不同后端之间平衡多个连接,并将每个连接的所有数据包路由到同一后端。这可以通过两部分策略来实现。 首先,使用一致哈希选择后端。然后,系统会将此选择记录在连接跟踪表中。
以下步骤介绍了后端选择和连接跟踪流程。
1. 检查连接跟踪表条目以使用之前选择的后端
对于现有连接,负载均衡器会使用连接跟踪表来识别之前为该连接选择的后端。
负载均衡器会尝试使用以下流程将每个负载均衡数据包与连接跟踪表中的条目进行匹配:
如果数据包是带有
SYN
标志的 TCP 数据包:对于所有其他数据包,负载均衡器会检查该数据包是否与现有的连接跟踪表条目匹配。用于将数据包与现有连接跟踪表条目进行比较的连接元组(一组数据包特征)取决于您配置的连接跟踪模式和会话亲和性。如需了解连接跟踪使用哪个连接元组,请参阅连接跟踪模式部分中的表格。
如果数据包与连接跟踪表条目匹配,负载均衡器会将数据包发送到之前选择的后端。
如果数据包与连接跟踪表条目不匹配,请继续执行确定符合条件的后端步骤。
如需了解连接跟踪表条目的保留时间以及在哪些条件下会保留,请参阅创建连接跟踪表条目步骤。
2. 为新连接选择符合条件的后端
对于新连接,负载均衡器使用一致哈希算法从符合条件的后端中选择一个后端。
以下步骤概述了为新连接选择符合条件的后端,然后在连接跟踪表中记录该连接的流程。
2.1 确定符合条件的后端
此步骤将模拟哪些后端可以接收新连接,同时考虑健康状况和故障切换政策配置:
无故障切换政策
符合条件的后端集仅取决于健康检查:
当至少有一个后端的健康状况良好时,符合条件的后端就是所有健康状况良好的后端。
当所有后端的健康状况都不佳时,符合条件的后端是所有后端。
已配置故障切换政策
符合条件的后端集取决于健康检查和故障切换政策配置:
当至少有一个后端的健康状况良好时,符合条件的后端按以下方式定义(使用此有序列表中第一个成立的条件):
- 如果没有健康状况良好的主后端,则符合条件的后端是所有健康状况良好的故障切换后端。
- 如果没有健康状况良好的故障切换后端,则符合条件的后端是所有健康状况良好的主后端。
- 如果故障切换比率设置为
0.0
(默认值),则符合条件的后端是所有健康状况良好的主后端。 - 如果健康主后端数量与主后端总数量的比率大于或等于配置的故障切换比率,则符合条件的后端为所有健康主后端。
- 符合条件的后端是所有健康状况良好的故障切换后端。
如果没有健康状况良好的后端,则符合条件的后端定义如下:
- 如果负载均衡器的故障切换政策配置为在没有后端健康状况良好时舍弃新连接,则符合条件的后端集为空。负载均衡器会丢弃新连接的数据包。
- 如果负载均衡器的故障切换政策未配置为在没有后端健康状况良好时舍弃新连接,则健康检查不相关。符合条件的后端是所有主后端。
2.2 调整符合条件的后端以实现可用区级亲和性
如果存在以下任一情况,则跳过此步骤:
- 已停用可用区级亲和性
- 客户端与可用区级亲和性不兼容
- 与兼容客户端的可用区进行可用区级匹配失败
如果启用了可用区级亲和性,客户端与可用区级亲和性兼容,且进行了可用区级匹配,则来自客户端的新连接会路由到调整的符合条件的后端集。详情请参阅以下内容:
2.3 选择符合条件的后端
负载均衡器使用一致哈希来选择符合条件的后端。负载均衡器会维护符合条件的后端的哈希,这些哈希会映射到单位圆。在处理不在连接跟踪表中的连接的数据包时,负载均衡器会计算数据包特征的哈希,并将该哈希映射到同一单位圆,从而在圆的周长上选择一个符合条件的后端。用于计算数据包哈希的数据包特征集由会话亲和性设置定义。
如果未明确配置会话亲和性,则默认采用
NONE
会话亲和性。即使符合条件的后端数量发生变化,负载均衡器也会尽可能以一致的方式将新连接分配给符合条件的后端。以下是一致哈希的优势,可展示负载均衡器如何为没有连接跟踪表条目的可能的新连接选择符合条件的后端:
如果符合条件的后端集未发生变化,则负载均衡器会为所有可能的新连接选择相同的后端,这些新连接具有相同的数据包特征(由会话亲和性定义)。
当添加新的符合条件的后端时,大约有
1/N
个可能的新连接会映射到新添加的后端。在这种情况下,N
是添加新后端后符合条件的后端数量。移除符合条件的后端后,大约
1/N
个可能的新连接会映射到剩余的N-1
个后端之一。在这种情况下,N
是移除符合条件的后端之前的后端数量。
2.4 创建连接跟踪表条目
选择后端后,负载均衡器会创建连接跟踪表条目。连接跟踪表条目会将数据包特征映射到所选后端。 用于此映射的数据包标头字段取决于您配置的连接跟踪模式和会话亲和性。
负载均衡器会根据以下规则移除连接跟踪表条目:
连接处于空闲状态后,系统会移除连接跟踪表条目。除非您配置自定义空闲超时,否则负载均衡器会使用 600 秒的默认空闲超时。如需了解详情,请参阅空闲超时。
当 TCP 连接通过
FIN
或RST
数据包关闭时,连接跟踪表条目不会移除。任何新 TCP 连接始终带有SYN
标志,并按照检查连接跟踪表条目步骤中所述进行处理。如果配置了故障切换政策,并且停用了“故障切换和故障恢复期间的连接排空”设置,则当符合条件的后端从主后端切换到故障切换后端(故障切换)或从故障切换后端切换到主后端(故障恢复)时,负载均衡器会移除连接跟踪表中的所有条目。如需了解详情,请参阅故障切换和故障恢复期间的连接排空。
如果后端健康状况不佳,则可以移除连接跟踪表中的条目。此行为取决于连接跟踪模式、协议和“健康状况不佳的后端的连接持久性”设置。如需了解详情,请参阅健康状况不佳的后端的连接持久性。
在发生以下事件(例如删除后端虚拟机或者从实例组或 NEG 中移除后端虚拟机)后,连接跟踪表中的条目会在连接排空超时后移除。如需了解详情,请参阅启用连接排空。
会话亲和性
会话亲和性控制从客户端到负载均衡器后端的新连接分配。内部直通式网络负载均衡器使用会话亲和性从一组符合条件的后端中选择一个后端,如后端选择和连接跟踪部分中的确定符合条件的后端和选择符合条件的后端步骤中所述。您可以在后端服务上配置会话亲和性,而不是在每个后端实例组或 NEG 上配置。
内部直通式网络负载均衡器支持以下会话亲和性设置。每项会话亲和性设置都使用一致哈希来选择符合条件的后端。会话亲和性设置用于确定使用 IP 标头和第 4 层标头中的哪些字段来计算哈希。
用于选择后端的哈希方法 | 会话亲和性设置 |
---|---|
对于包含端口信息(例如 TCP 数据包和不分段的 UDP 数据包)的不分段数据包,使用 5 元组哈希(由来源 IP 地址、来源端口、协议、目标 IP 地址和目标端口组成) 或对于分段的 UDP 数据包和所有其他协议的数据包,使用 3 元组哈希(由来源 IP 地址、目标 IP 地址和协议组成) |
NONE 1 |
对于包含端口信息(例如 TCP 数据包和不分段的 UDP 数据包)的不分段数据包,使用 5 元组哈希(由来源 IP 地址、来源端口、协议、目标 IP 地址和目标端口组成) 或对于分段的 UDP 数据包和所有其他协议的数据包,使用 3 元组哈希(由来源 IP 地址、目标 IP 地址和协议组成) |
CLIENT_IP_PORT_PROTO |
3 元组哈希 (由来源 IP 地址、目标 IP 地址和协议组成) |
CLIENT_IP_PROTO |
2 元组哈希 (由来源 IP 地址和目标 IP 地址组成) |
CLIENT_IP |
1 元组哈希 (仅包含来源 IP) |
CLIENT_IP_NO_DESTINATION 2 |
1 会话亲和性设置为 NONE
不表示没有会话亲和性。这意味着未明确配置任何会话亲和性选项。
始终会执行哈希处理来选择后端。会话亲和性设置为 NONE
表示负载均衡器使用 5 元组哈希或 3 元组哈希来选择后端,这在功能上与设置 CLIENT_IP_PORT_PROTO
时的行为相同。
CLIENT_IP_NO_DESTINATION
是仅基于每个接收到的数据包的来源 IP 地址的一元组哈希。在某些情况下,您可能需要同一后端虚拟机仅根据数据包的来源 IP 地址(而不考虑数据包目标 IP 地址)处理来自客户端的所有数据包,此设置会非常有用。当内部直通式网络负载均衡器是静态路由的下一个跃点时,通常会出现这些情况。
如需了解详情,请参阅会话亲和性和下一个跃点内部直通式网络负载均衡器。
如需了解不同的会话亲和性设置如何影响后端选择和连接跟踪方法,请参阅连接跟踪模式部分中的表格。
会话亲和性和下一个跃点内部直通式网络负载均衡器
当内部直通式网络负载均衡器是静态路由的下一个跃点时,目标 IP 地址不限于负载均衡器的转发规则 IP 地址。相反,数据包的目标 IP 地址可以是处于静态路由目标范围内的任何 IP 地址。
选择符合条件的后端取决于数据包特征的哈希计算。除了 CLIENT_IP_NO_DESTINATION
会话亲和性(1 元组哈希)之外,哈希还部分取决于数据包目标 IP 地址。
如果符合条件的后端集未发生变化,则负载均衡器会为所有可能的新连接选择相同的后端,这些新连接具有相同的数据包特征(由会话亲和性定义)。如果您需要同一后端虚拟机仅根据来源 IP 地址(而不考虑目标 IP 地址)处理来自客户端的所有数据包,请使用 CLIENT_IP_NO_DESTINATION
会话亲和性。
连接跟踪政策
本部分介绍了用于控制内部直通式网络负载均衡器的连接跟踪行为的设置。连接跟踪政策包括以下设置:
连接跟踪模式
负载均衡器的连接跟踪表通过哈希表将连接元组映射到之前选择的后端。构成每个连接元组的数据包特征集由连接跟踪模式和会话亲和性决定。
内部直通式网络负载均衡器会跟踪其支持的所有协议的连接。
连接跟踪模式是指负载均衡器的连接跟踪表中每个连接元组的粒度。连接元组可以是 5 元组或 3 元组(PER_CONNECTION
模式),也可以与会话亲和性设置(PER_SESSION
模式)匹配。
PER_CONNECTION
。这是默认的连接跟踪模式。此连接跟踪模式使用 5 元组哈希或 3 元组哈希。包含端口信息的未分段数据包(例如 TCP 数据包和未分段 UDP 数据包)通过 5 元组哈希进行跟踪。所有其他数据包都通过 3 元组哈希进行跟踪。PER_SESSION
。此连接跟踪模式使用一个哈希,该哈希包含与会话亲和性哈希所用数据包特征相同的特征。根据所选的会话亲和性,PER_SESSION
可以使连接更频繁地与现有连接跟踪表条目匹配,从而降低会话亲和性哈希需要选择后端的频率。
下表总结了连接跟踪模式和会话亲和性如何协同工作,以将每个连接的所有数据包路由到同一后端。
使用会话亲和性进行后端选择 | 连接跟踪模式 | ||
---|---|---|---|
会话亲和性设置 | 用于选择后端的哈希方法 | PER_CONNECTION (默认) |
PER_SESSION |
NONE |
TCP 和未分段的 UDP:5 元组哈希 分段的 UDP 和所有其他协议:3 元组哈希 |
TCP 和未分段的 UDP:5 元组哈希 分段的 UDP 和所有其他协议:3 元组哈希 |
TCP 和未分段的 UDP:5 元组哈希 分段的 UDP 和所有其他协议:3 元组哈希 |
CLIENT_IP_NO_DESTINATION |
所有协议:1 元组哈希 | TCP 和未分段的 UDP:5 元组哈希 分段的 UDP 和所有其他协议:3 元组哈希 |
所有协议:1 元组哈希 |
CLIENT_IP |
所有协议:2 元组哈希 | TCP 和未分段的 UDP:5 元组哈希 分段的 UDP 和所有其他协议:3 元组哈希 |
所有协议:2 元组哈希 |
CLIENT_IP_PROTO |
所有协议:3 元组哈希 | TCP 和未分段的 UDP:5 元组哈希 分段的 UDP 和所有其他协议:3 元组哈希 |
所有协议:3 元组哈希 |
CLIENT_IP_PORT_PROTO |
TCP 和未分段的 UDP:5 元组哈希 分段的 UDP 和所有其他协议:3 元组哈希 |
TCP 和未分段的 UDP:5 元组哈希 分段的 UDP 和所有其他协议:3 元组哈希 |
TCP 和未分段的 UDP:5 元组哈希 分段的 UDP 和所有其他协议:3 元组哈希 |
如需了解如何更改连接跟踪模式,请参阅配置连接跟踪政策。
运行状况不佳的后端的连接持久性
连接持久性设置用于控制现有连接在后端运行状况不佳后是否持续存在于所选后端虚拟机或端点上,前提是该后端保留在负载均衡器的已配置后端组中(在实例组中或 NEG 中)。
以下连接持久性选项可用:
DEFAULT_FOR_PROTOCOL
(默认)NEVER_PERSIST
ALWAYS_PERSIST
下表总结了连接持久性选项,以及连接针对不同协议、会话亲和性选项和跟踪模式的持久程度。
不健康的后端上的连接持久性选项 | 连接跟踪模式 | |
---|---|---|
PER_CONNECTION |
PER_SESSION |
|
DEFAULT_FOR_PROTOCOL |
TCP:连接持续存在于不健康的后端上(所有会话亲和性) UDP:连接永远不会在不健康的后端上持续存在 |
TCP:如果会话亲和性为 UDP:连接永远不会在不健康的后端上持续存在 |
NEVER_PERSIST |
TCP、UDP:连接永远不会在不健康的后端上持续存在 | |
ALWAYS_PERSIST
|
TCP:连接在不健康的后端上持续存在(所有会话亲和性) 此选项应仅用于高级使用场景。 |
无法进行配置 |
如需了解如何更改连接持久性行为,请参阅配置连接跟踪政策。
空闲超时
默认情况下,连接跟踪表中的条目在负载均衡器处理最后一个与条目匹配的数据包后 600 秒,连接跟踪表中的条目会过期。只有在连接跟踪小于 5 元组(即会话亲和性配置为 CLIENT_IP
或 CLIENT_IP_PROTO
,并且跟踪模式为 PER_SESSION
)时,才能修改此默认空闲超时值。
最大可配置空闲超时值为 57600 秒(16 小时)。
如需了解如何更改空闲超时值,请参阅配置连接跟踪政策。
单客户端部署的连接
在测试与仅有一个客户端的内部直通式网络负载均衡器的 IP 地址的连接时,请注意以下几点:
如果该客户端虚拟机不是进行负载均衡的虚拟机(即非后端虚拟机),则新连接会传送到负载均衡器的健康的后端虚拟机。但是,由于所有会话亲和性选项至少会依赖客户端系统的 IP 地址,因此来自同一客户端的连接可能会以超出预期的频率分配到同一个后端虚拟机。
实际上,这意味着您无法通过从单个客户端连接到内部直通式网络负载均衡器来准确监控流量的分配情况。监控流量分配所需的客户端数量因负载均衡器类型、流量类型和健康的后端数量而异。
如果客户端虚拟机也是负载均衡器的后端虚拟机,则发送到负载均衡器转发规则的 IP 地址的连接始终由同一后端虚拟机(也是客户端虚拟机)应答。无论后端虚拟机是否健康,都会发生这种情况。发送到负载均衡器 IP 地址的所有流量都会发生这种情况,而不仅仅是负载均衡器内部转发规则中指定的协议和端口上的流量。
如需了解详情,请参阅从负载均衡虚拟机发送请求。
连接排空
当发生以下操作之一时,连接排空会为已建立的连接提供可配置的额外时间,以保留在负载均衡器的连接跟踪表中:
- 从后端实例组中移除虚拟机 (VM) 实例(其中包括放弃后端托管式实例组中的实例)
- 虚拟机已停止或删除(其中包括滚动更新或缩容后端托管式实例组等自动操作)
- 从后端网络端点组 (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 会仅在所有主要虚拟机之间分配新连接。
向内部直通式网络负载均衡器的后端服务添加后端时,默认情况下该后端是主要后端。您可以在将某个后端添加到负载均衡器的后端服务时将其指定为故障切换后端,或者在以后通过修改后端服务将该后端指定为故障切换后端。
如需详细了解如何使用故障切换进行后端选择和连接跟踪,请参阅后端选择和连接跟踪部分中的确定符合条件的后端和创建连接跟踪表条目步骤。
如需详细了解故障切换的运作方式,请参阅内部直通式网络负载均衡器的故障切换。
后续步骤
- 如需配置和测试使用故障切换的内部直通式网络负载均衡器,请参阅为内部直通式网络负载均衡器配置故障切换。
- 如需配置和测试内部直通式网络负载均衡器,请参阅设置内部直通式网络负载均衡器。