本页面介绍了外部直通式网络负载均衡器如何分配流量的相关概念。
后端选择和连接跟踪
后端选择和连接跟踪协同工作,以在不同后端之间平衡多个连接,并将每个连接的所有数据包路由到同一后端。这可以通过两部分策略来实现。 首先,使用一致哈希选择后端。然后,系统会将此选择记录在连接跟踪表中。
以下步骤介绍了后端选择和连接跟踪流程。
1. 检查连接跟踪表条目以使用之前选择的后端
对于现有连接,负载均衡器会使用连接跟踪表来识别之前为该连接选择的后端。
负载均衡器会尝试使用以下流程将每个负载均衡数据包与连接跟踪表中的条目进行匹配:
如果数据包是带有
SYN
标志的 TCP 数据包:如果配置的会话亲和性不支持对数据包协议进行连接跟踪,请继续执行确定符合条件的后端步骤。如需了解哪些协议可跟踪连接,请参阅连接跟踪模式部分中的表格。
对于所有其他数据包,负载均衡器会检查该数据包是否与现有的连接跟踪表条目匹配。用于将数据包与现有连接跟踪表条目进行比较的连接元组(一组数据包特征)取决于您配置的连接跟踪模式和会话亲和性。如需了解连接跟踪使用哪个连接元组,请参阅连接跟踪模式部分中的表格。
如果数据包与连接跟踪表条目匹配,负载均衡器会将数据包发送到之前选择的后端。
如果数据包与连接跟踪表条目不匹配,请继续执行确定符合条件的后端步骤。
如需了解连接跟踪表条目的保留时间以及在哪些条件下会保留,请参阅创建连接跟踪表条目步骤。
2. 为新连接选择符合条件的后端
对于新连接,负载均衡器使用一致哈希算法从符合条件的后端中选择一个后端。
以下步骤概述了为新连接选择符合条件的后端,然后在连接跟踪表中记录该连接的流程。
2.1 确定符合条件的后端
此步骤会模拟哪些后端可以接收新连接,同时考虑到健康状况、加权负载均衡和故障切换政策配置。
下表概述了故障切换政策和加权负载均衡如何影响哪些后端是符合条件的后端。
故障切换政策 | 加权负载均衡 | 符合条件的后端 |
---|---|---|
请参阅“无故障切换政策,已停用加权负载均衡” | ||
请参阅“无故障切换政策,已启用加权负载均衡” | ||
请参阅“已配置故障切换政策,已停用加权负载均衡” | ||
请参阅“已配置故障切换政策,已启用加权负载均衡” |
无故障切换政策,已停用加权负载均衡
符合条件的后端集仅取决于健康检查:
当至少有一个后端的健康状况良好时,符合条件的后端集包含所有健康状况良好的后端。
当所有后端的健康状况都不佳时,符合条件的后端集包含所有后端。
无故障切换政策,已启用加权负载均衡
符合条件的后端集取决于健康检查和权重,并且包含以下第一个非空的后端:
- 所有健康状况良好且权重不为零的后端
- 所有健康状况不佳且权重不为零的后端
- 所有健康状况良好且权重为零的后端
- 所有健康状况不佳且权重为零的后端
已配置故障切换政策,已停用加权负载均衡
符合条件的后端集取决于健康检查和故障切换政策配置:
当至少有一个后端的健康状况良好时,符合条件的后端集按以下方式定义(使用此有序列表中第一个成立的条件):
- 如果没有健康状况良好的主后端,则符合条件的后端是所有健康状况良好的故障切换后端。
- 如果没有健康状况良好的故障切换后端,则符合条件的后端是所有健康状况良好的主后端。
- 如果故障切换比率设置为
0.0
(默认值),则符合条件的后端是所有健康状况良好的主后端。 - 如果健康状况良好的主后端数量与主后端总数量的比率大于或等于配置的故障切换比率,则符合条件的后端包含所有健康状况良好的主后端。
- 符合条件的后端包含所有健康状况良好的故障切换后端。
如果没有健康状况良好的后端,则符合条件的后端集定义如下:
- 如果负载均衡器的故障切换政策配置为在没有后端健康状况良好时舍弃新连接,则符合条件的后端集为空。负载均衡器会丢弃新连接的数据包。
- 如果负载均衡器的故障切换政策未配置为在没有后端健康状况良好时舍弃新连接,则健康检查不相关。符合条件的后端包含所有主后端。
已配置故障切换政策,已启用加权负载均衡
符合条件的后端集取决于健康检查、权重和故障切换政策配置:
当至少有一个后端的健康状况良好且权重非零时,符合条件的后端集按以下方式定义(使用此有序列表中第一个成立的条件):
- 如果没有健康状况良好且权重不为零的主后端,则符合条件的后端为所有健康状况良好且权重不为零的故障切换后端。
- 如果没有健康状况良好且权重不为零的故障切换后端,则符合条件的后端是所有健康状况良好且权重不为零的主后端。
- 如果故障切换比率设置为
0.0
(默认值),则符合条件的后端是所有健康状况良好且权重不为零的主后端。 - 如果健康状况良好且权重不为零的主后端数量与主后端总数量的比率大于或等于配置的故障切换比率,则符合条件的后端包含所有健康状况良好且权重不为零的主后端。
- 符合条件的后端包含所有健康状况良好且权重不为零的故障切换后端。
如果没有健康状况良好且权重不为零的后端,则符合条件的后端集定义如下:
- 如果负载均衡器的故障切换政策配置为在没有后端健康状况良好时舍弃新连接,则符合条件的后端集为空。负载均衡器会丢弃新连接的数据包。
如果负载均衡器的故障切换政策未配置为在没有后端健康状况良好时舍弃新连接,则符合条件的后端集是以下第一个非空集:
- 所有健康状况不佳且权重不为零的主后端
- 所有健康状况不佳且权重不为零的故障切换后端
- 所有健康状况良好且权重为零的主后端
- 所有健康状况良好且权重为零的故障切换后端
- 所有健康状况不佳且权重为零的主后端
- 所有健康状况不佳且权重为零的故障切换后端
2.2 选择符合条件的后端
负载均衡器使用一致哈希来选择符合条件的后端。负载均衡器会维护符合条件的后端的哈希,这些哈希会映射到单位圆。加权负载均衡会改变符合条件的后端与圆的映射方式,使权重较高的后端更有可能被选中,且被选中的概率与其权重成正比。
在处理不在连接跟踪表中的连接的数据包时,负载均衡器会计算数据包特征的哈希,并将该哈希映射到同一单位圆,从而在圆的周长上选择一个符合条件的后端。用于计算数据包哈希的数据包特征集由会话亲和性设置定义。
如果未明确配置会话亲和性,则默认采用
NONE
会话亲和性。以下两个示例展示了加权负载均衡如何影响对符合条件的后端的选择:
如果后端服务有两个符合条件的后端(第一个的权重为
1
,第二个的权重为4
),则第一个符合条件的后端被选中的概率为 20%(1
÷(1+4)
),第二个符合条件的后端被选中的概率为 80%(4
÷(1+4)
)。如果后端服务有三个符合条件的后端(符合条件的后端
a
的权重为0
,符合条件的后端b
的权重为2
,符合条件的后端c
的权重为6
),则后端a
的选择概率为 0% (0
÷(0+2+6)
),后端b
的选择概率为 25% (2
÷(0+2+6)
),后端c
的选择概率为 75% (6
÷(0+2+6)
)。
即使符合条件的后端数量或其权重发生变化,负载均衡器也会尽可能以一致的方式将新连接分配给符合条件的后端。以下是一致哈希的优势,可展示负载均衡器如何为没有连接跟踪表条目的可能的新连接选择符合条件的后端:
在以下情况下,负载均衡器会为所有可能的新连接选择相同的后端,这些新连接具有相同的数据包特征(由会话亲和性定义)。
如果未配置加权负载均衡,则当符合条件的后端集未发生变化时。
如果配置了加权负载均衡,当符合条件的后端集未发生变化,且每个符合条件的后端的权重保持不变时。
负载均衡器会尽可能公平地在符合条件的后端之间分配可能的新连接:
如果未配置加权负载均衡,则大约
1/N
个可能的新连接映射到每个符合条件的后端,其中N
是符合条件的后端的数量。如果配置了加权负载均衡,则映射到每个符合条件的后端的可能的新连接比率约为:符合条件的后端的权重除以所有符合条件的后端权重的总和。
如果添加、移除或更改了符合条件的后端的权重,一致哈希旨在最大限度地减少对其他符合条件的后端的映射造成的干扰,也就是说,映射到其他符合条件的后端的大部分连接会继续映射到同一符合条件的后端。
2.3 创建连接跟踪表条目
选择后端后,如果配置的会话亲和性支持对数据包协议进行连接跟踪,负载均衡器会创建连接跟踪表条目。
如果配置的会话亲和性不支持数据包协议的连接跟踪,请跳过此步骤。
如果配置的会话亲和性支持数据包协议的连接跟踪,则创建的连接跟踪表条目会将数据包特征映射到所选后端。用于此映射的数据包标头字段取决于您配置的连接跟踪模式和会话亲和性。
如需了解哪些协议可根据您的配置选择进行连接跟踪,以及哪些数据包特征用于哈希,请参阅连接跟踪模式部分。
负载均衡器会根据以下规则移除连接跟踪表条目:
连接空闲 60 秒后,连接跟踪表条目会移除。如需了解详情,请参阅空闲超时。
当 TCP 连接通过
FIN
或RST
数据包关闭时,连接跟踪表条目不会移除。任何新 TCP 连接始终带有SYN
标志,并按照检查连接跟踪表条目步骤中所述进行处理。如果配置了故障切换政策,并且停用了“故障切换和故障恢复期间的连接排空”设置,则当符合条件的后端从主后端切换到故障切换后端(故障切换)或从故障切换后端切换到主后端(故障恢复)时,负载均衡器会移除连接跟踪表中的所有条目。如需了解详情,请参阅故障切换和故障恢复期间的连接排空。
如果后端健康状况不佳,则可以移除连接跟踪表中的条目。此行为取决于连接跟踪模式、协议和“健康状况不佳的后端的连接持久性”设置。如需了解详情,请参阅健康状况不佳的后端的连接持久性。
在发生以下事件(例如删除后端虚拟机或者从实例组或 NEG 中移除后端虚拟机)后,连接跟踪表中的条目会在连接排空超时后移除。如需了解详情,请参阅启用连接排空。
会话亲和性
会话亲和性控制从客户端到负载均衡器后端的新连接分配。外部直通式网络负载均衡器使用会话亲和性从一组符合条件的后端中选择一个后端,如后端选择和连接跟踪部分中的确定符合条件的后端和选择符合条件的后端步骤中所述。您可以在后端服务上配置会话亲和性,而不是在每个后端实例组或 NEG 上配置。
外部直通式网络负载均衡器支持以下会话亲和性设置。每项会话亲和性设置都使用一致哈希来选择符合条件的后端。会话亲和性设置用于确定使用 IP 标头和 TCP/UDP 标头中的哪些字段来计算哈希。
用于选择后端的哈希方法 | 会话亲和性设置1 |
---|---|
对于包含端口信息(例如 TCP 数据包和不分段的 UDP 数据包)的不分段数据包,使用 5 元组哈希(由来源 IP 地址、来源端口、协议、目标 IP 地址和目标端口组成) 或对于分段的 UDP 数据包和所有其他协议的数据包,使用 3 元组哈希(由来源 IP 地址、目标 IP 地址和协议组成) |
NONE 2 |
对于包含端口信息(例如 TCP 数据包和不分段的 UDP 数据包)的不分段数据包,使用 5 元组哈希(由来源 IP 地址、来源端口、协议、目标 IP 地址和目标端口组成) 或对于分段的 UDP 数据包和所有其他协议的数据包,使用 3 元组哈希(由来源 IP 地址、目标 IP 地址和协议组成) |
CLIENT_IP_PORT_PROTO |
3 元组哈希 (由来源 IP 地址、目标 IP 地址和协议组成) |
CLIENT_IP_PROTO |
2 元组哈希 (由来源 IP 地址和目标 IP 地址组成) |
CLIENT_IP |
session affinity
参数。2 会话亲和性设置为 NONE
不表示没有会话亲和性。这意味着未明确配置任何会话亲和性选项。
始终会执行哈希处理来选择后端。会话亲和性设置为 NONE
表示负载均衡器使用 5 元组哈希或 3 元组哈希来选择后端,这在功能上与设置 CLIENT_IP_PORT_PROTO
时的行为相同。
如需了解不同的会话亲和性设置如何影响后端选择和连接跟踪方法,请参阅连接跟踪模式部分中的表格。
连接跟踪政策
本部分介绍了用于控制外部直通式网络负载均衡器的连接跟踪行为的设置。连接跟踪政策包括以下设置:
连接跟踪模式
如果可以进行连接跟踪,负载均衡器的连接跟踪表会通过哈希表将连接元组映射到之前选择的后端。构成每个连接元组的数据包特征集取决于连接跟踪模式和会话亲和性。
外部直通式网络负载均衡器支持基于协议和会话亲和性选项的连接跟踪:
对于所有会话亲和性选项,TCP 连接始终可进行连接跟踪。
对于所有会话亲和性选项,UDP、ESP 和 GRE 连接都是可跟踪的,但
NONE
除外。所有其他协议(例如 ICMP 和 ICMPv6)都无法进行连接跟踪。
连接跟踪模式是指负载均衡器的连接跟踪表中每个连接元组的粒度。连接元组可以是 5 元组或 3 元组(PER_CONNECTION
模式),也可以与会话亲和性设置(PER_SESSION
模式)匹配。
PER_CONNECTION
。这是默认的连接跟踪模式。此连接跟踪模式使用 5 元组哈希或 3 元组哈希。包含端口信息的未分段数据包(例如 TCP 数据包和未分段 UDP 数据包)通过 5 元组哈希进行跟踪。所有其他数据包都通过 3 元组哈希进行跟踪。PER_SESSION
。此连接跟踪模式使用一个哈希,该哈希包含与会话亲和性哈希所用数据包特征相同的特征。根据所选的会话亲和性,PER_SESSION
可以使连接更频繁地与现有连接跟踪表条目匹配,从而降低会话亲和性哈希需要选择后端的频率。
下表总结了连接跟踪模式和会话亲和性如何协同工作,以将每个连接的所有数据包路由到同一后端。
使用会话亲和性进行后端选择 | 连接跟踪模式 | ||
---|---|---|---|
会话亲和性设置 | 用于选择后端的哈希方法 | PER_CONNECTION (默认) |
PER_SESSION |
默认
( |
TCP 和未分段的 UDP:5 元组哈希 分段的 UDP 和所有其他协议:3 元组哈希 |
|
|
客户端 IP、目标 IP ( |
所有协议:2 元组哈希 |
|
|
客户端 IP、目标 IP、协议 ( |
所有协议:3 元组哈希 |
|
|
客户端 IP、客户端端口、目的地 IP、目的地端口、协议 ( |
TCP 和未分段的 UDP:5 元组哈希 分段的 UDP 和所有其他协议:3 元组哈希 |
|
|
如需了解如何更改连接跟踪模式,请参阅配置连接跟踪政策。
运行状况不佳的后端的连接持久性
连接持久性设置用于控制现有连接在后端运行状况不佳后是否持续存在于所选后端虚拟机或端点上,前提是该后端保留在负载均衡器的已配置后端组中(在实例组中或 NEG 中)。
以下连接持久性选项可用:
DEFAULT_FOR_PROTOCOL
(默认)NEVER_PERSIST
ALWAYS_PERSIST
下表总结了连接持久性选项,以及连接针对不同协议、会话亲和性选项和跟踪模式的持久程度。
不健康的后端上的连接持久性选项 | 连接跟踪模式 | |
---|---|---|
PER_CONNECTION |
PER_SESSION |
|
DEFAULT_FOR_PROTOCOL |
TCP:连接持续存在于运行状况不佳的后端上(所有会话亲和性) 所有其他协议:连接始终不持续存在于运行状况不佳的后端上 |
TCP:如果会话亲和性为 所有其他协议:连接始终不持续存在于运行状况不佳的后端上 |
NEVER_PERSIST |
所有协议:连接始终不持续存在于运行状况不佳的后端上 | |
ALWAYS_PERSIST |
TCP:连接持续存在于不健康的后端上(所有会话亲和性) ESP、GRE、UDP:如果会话亲和性不是 ICMP、ICMPv6:不适用,因为它们不可跟踪连接 此选项应仅用于高级使用场景。 |
无法进行配置 |
运行状况不佳的后端上的 TCP 连接持久性行为
每当采用 5 元组跟踪的 TCP 连接持续存在于运行状况不佳的后端上时:
- 如果运行状况不佳的后端继续响应数据包,则连接将持续存在,直到运行状况不佳的后端或客户端将其重置或关闭。
- 如果运行状况不佳的后端发送 TCP 重置 (RST) 数据包或未响应数据包,则客户端可能会使用新连接重试,让负载均衡器选择其他运行状况良好的后端。TCP SYN 数据包始终选择运行状况良好的新后端。
如需了解如何更改连接持久性行为,请参阅配置连接跟踪政策。
空闲超时
在负载均衡器处理最后一个与条目匹配的数据包后 60 秒,连接跟踪表中的条目会过期。此空闲超时值不可修改。
加权负载均衡
外部直通式网络负载均衡器的加权负载均衡功能使用 HTTP 健康检查报告的权重信息。加权负载均衡要求您配置以下所有内容:
- 后端服务的负载均衡器位置政策 (
localityLbPolicy
) 必须为WEIGHTED_MAGLEV
。 - 后端服务必须使用 HTTP 健康检查。
- 来自每个后端虚拟机或后端端点的健康检查响应必须包含自定义 HTTP 响应标头。响应标头字段名称为
X-Load-Balancing-Endpoint-Weight
,有效字段值的范围为0
到1000
。
如果您需要将同一实例组或 NEG 用作两个或更多后端服务的后端,我们建议采用以下策略,以便每个通用后端实例或端点都能为每个后端服务提供唯一的权重信息:
- 为每个后端服务使用唯一的 HTTP 健康检查。例如,使用唯一的
request-path
健康检查参数。 - 配置后端实例或端点,以便针对每次健康检查响应适当的权重信息。
使用加权负载均衡时,负载均衡器会先根据后端虚拟机或端点的权重是否大于零或等于零对其进行排名,然后再根据健康检查对其进行排名。健康检查状态由 HTTP、HTTPS 和 HTTP/2 健康检查成功标准决定。
权重 | 健康状况良好或健康状况不佳 | 排名 |
---|---|---|
权重大于零 | 健康状况良好 | 第一选择 |
权重大于零 | 健康状况不佳 | 第二选择 |
权重等于零 | 健康状况良好 | 第三选择 |
权重等于零 | 健康状况不佳 | 第四个(最后一个)选择 |
如需详细了解加权负载均衡如何影响哪些后端是符合条件的后端,请参阅后端选择和连接跟踪部分中的确定符合条件的后端和选择符合条件的后端步骤。
加权负载均衡适用于以下情况:
如果某些连接处理的数据比其他连接多,或者某些连接持续的时间比其他连接长,则后端负载分配可能会变得不均匀。通过发出信号指示较低的实例权重,具有高负载的实例可以减少其新连接所占的份额,同时保持为现有连接提供服务。
如果后端过载,分配更多连接可能会中断现有连接,则此类后端会为自身分配零权重。通过发出信号指示零权重,后端实例会停止为新连接提供服务,但继续为现有连接提供服务。
如果后端将在维护之前排空现有连接,则它会为自身分配零权重。通过发出信号指示零权重,后端实例会停止为新连接提供服务,但继续为现有连接提供服务。
如需了解详情,请参阅配置加权负载均衡。
连接排空
当发生以下操作之一时,连接排空会为已建立的连接提供可配置的额外时间,以保留在负载均衡器的连接跟踪表中:
- 从后端实例组中移除虚拟机 (VM) 实例(其中包括放弃后端托管式实例组中的实例)
- 虚拟机已停止或删除(其中包括滚动更新或缩容后端托管式实例组等自动操作)
- 从后端网络端点组 (NEG) 中移除端点
默认情况下,上述操作的连接排空处于停用状态。如需了解如何触发连接排空以及如何启用连接排空,请参阅启用连接排空。
UDP 分段
基于后端服务的外部直通式网络负载均衡器可以处理分段和未分段的 UDP 数据包。如果您的应用使用分段的 UDP 数据包,请注意以下几点:
- UDP 数据包在到达 Google CloudVPC 网络之前可能会被分段。
- Google Cloud VPC 网络会在 UDP 分段到达时转发这些分段(无需等待所有分段到达)。
- 非Google Cloud 网络和本地网络设备可以在 UDP 分段到达时转发这些分段,将分段的 UDP 数据包延迟到所有分段到达,或舍弃分段的 UDP 数据包。如需了解详情,请参阅网络提供商或网络设备的文档。
如果您预期会对 UDP 数据包进行分段并需要将其路由到相同的后端,请使用以下转发规则和后端服务配置参数:
转发规则配置:每个负载平衡的 IP 地址只使用一个
UDP
或L3_DEFAULT
转发规则,并将转发规则配置为接受所有端口的流量。这确保了所有数据段到达相同的转发规则。即使分段的数据包(第一个数据段除外)缺少目标端口,但在配置转发规则以处理所有端口的流量时,也会将其配置为接收没有端口信息的 UDP 数据段。如需配置所有端口,请使用 Google Cloud CLI 设置--ports=ALL
,或使用 API 将allPorts
设置为True
。后端服务配置:将后端服务的会话亲和性设置为
CLIENT_IP
(2 元组哈希)或CLIENT_IP_PROTO
(3 元组哈希),以便为包含端口信息的 UDP 数据包和缺少端口信息的 UDP 数据段(第一个数据段除外)选择同一后端。将后端服务的连接跟踪模式设置为PER_SESSION
,以便使用相同的 2 元组或 3 元组哈希构建连接跟踪表条目。
故障切换
您可以将外部直通式网络负载均衡器配置为在主要后端(实例组或 NEG)中的虚拟机实例或端点之间分配连接,然后在需要时切换为使用故障切换后端。故障切换提供了另一种提高可用性的方法,同时还可让您在主要后端健康状况不佳时更好地控制管理工作负载的方式。
默认情况下,您向外部直通式网络负载均衡器的后端服务添加后端时,该后端是主要后端。您可以在将某个后端添加到负载均衡器的后端服务时将其指定为故障切换后端,或者在以后通过修改后端服务将该后端指定为故障切换后端。
如需详细了解如何使用故障切换进行后端选择和连接跟踪,请参阅后端选择和连接跟踪部分中的确定符合条件的后端和创建连接跟踪表条目步骤。
如需详细了解故障切换的运作方式,请参阅外部直通式网络负载均衡器的故障切换概览。
后续步骤
- 如需仅为 TCP 或 UDP 流量(支持 IPv4 和 IPv6 流量)使用后端服务配置外部直通式网络负载均衡器,请参阅使用后端服务设置外部直通式网络负载均衡器。
- 如需为多个 IP 协议(支持 IPv4 和 IPv6 流量)配置外部直通式网络负载均衡器,请参阅为多个 IP 协议设置外部直通式网络负载均衡器。
- 如需使用可用区级 NEG 后端配置外部直通式网络负载均衡器,请参阅使用可用区级 NEG 设置外部直通式网络负载均衡器
- 如需了解如何将外部直通式网络负载均衡器从目标池后端转换到区域级后端服务,请参阅将外部直通式网络负载均衡器从目标池转换到后端服务。