后端服务概览

后端服务定义了 Cloud Load Balancing 如何分配流量。后端服务配置包含一组值,例如用于连接到后端的协议、各种分发和会话设置、运行状况检查和超时。这些设置可对负载平衡器的行为进行精细控制。如果需要快速开始,大多数设置都具有允许轻松配置的默认值。

负载平衡器、Envoy 代理和无代理 gRPC 客户端使用后端服务资源中的配置信息执行以下操作:

  • 将流量定向到正确的后端(实例组或网络端点组 (NEG))。
  • 根据平衡模式(这是每个后端的设置)分配流量。
  • 确定哪个运行状况检查正在监控后端的运行状况。
  • 指定“会话亲和性”
  • 确定是否已启用其他服务,包括下列各项:
    • Cloud CDN(仅限外部 HTTP(S) 负载平衡器)
    • Google Cloud Armor 安全政策(仅限外部 HTTP(S) 负载平衡器)
    • Identity-Aware Proxy(仅限外部 HTTP(S) 负载平衡器)

您可以在创建后端服务或将后端服务添加到后端服务时设置这些值。

您可以为以下 Google Cloud 负载平衡器配置后端服务:

  • 外部 HTTP(S) 负载均衡器(全球级和区域级)
  • 内部 HTTP(S) 负载平衡器
  • SSL 代理负载平衡器
  • TCP 代理负载平衡器
  • 内部 TCP/UDP 负载平衡器
  • 网络负载平衡器

Traffic Director 也会使用后端服务。

您使用的产品决定了后端服务的数量上限、后端服务的范围、支持的后端类型以及后端服务的负载均衡方案

产品 最大后端服务数量 后端服务的范围 受支持的后端类型 负载平衡方案
区域级外部 HTTP(S) 负载均衡器 多个 地区 每个后端服务都支持以下后端组合:
  • 所有实例组后端:一个或多个代管实例组后端、非代管实例组后端或代管实例组后端与非代管实例组后端的组合
  • 所有可用区级 NEG:一个或多个 GCE_VM_IP_PORT 类型可用区级 NEG
EXTERNAL_MANAGED
外部 HTTP(S) 负载平衡器 多个 全球1 每个后端服务都支持以下后端组合:
  • 所有实例组后端:一个或多个代管实例组后端、非代管实例组后端或代管实例组后端与非代管实例组后端的组合
  • 所有可用区级 NEG:一个或多个 GCE_VM_IP_PORT 类型可用区级 NEG
  • 所有无服务器 NEG:一个或多个 App Engine、Cloud Run 或 Cloud Functions 服务
  • 一个用于外部后端的互联网 NEG
  • 所有混合连接 NEG:一个或多个 NON_GCP_PRIVATE_IP_PORT 类型 NEG
外部
内部 HTTP(S) 负载平衡器 多个 地区 每个后端服务都支持以下后端组合:
  • 所有实例组后端:一个或多个代管实例组后端、非代管实例组后端或代管实例组后端与非代管实例组后端的组合,或者
  • 所有可用区级 NEG:一个或多个 GCE_VM_IP_PORT 类型可用区级 NEG,或
  • 单个 Private Service Connect NEG
INTERNAL_MANAGED
SSL 代理负载平衡器 1 全球1 后端服务支持以下后端组合:
  • 所有实例组后端:一个或多个代管实例组后端、非代管实例组后端或代管实例组后端与非代管实例组后端的组合,或者
  • 所有可用区级 NEG:一个或多个 GCE_VM_IP_PORT 类型可用区级 NEG,或
  • 一个用于外部后端的互联网 NEG
外部
TCP 代理负载平衡器 1 全球1 后端服务支持以下后端组合:
  • 所有实例组后端:一个或多个代管实例组后端、非代管实例组后端或代管实例组后端与非代管实例组后端的组合,或者
  • 所有可用区级 NEG:一个或多个 GCE_VM_IP_PORT 类型可用区级 NEG,或
  • 一个用于外部后端的互联网 NEG
外部
网络负载平衡器 1 区域 后端服务支持以下后端组合:
  • 所有实例组后端:一个或多个代管实例组后端、非代管实例组后端或代管实例组后端与非代管实例组后端的组合
外部
内部 TCP/UDP 负载平衡器 1 范围为地区,但可以配置为可在全球访问 后端服务支持以下后端组合:
  • 所有实例组后端:一个或多个代管实例组后端、非代管实例组后端或代管实例组后端与非代管实例组后端的组合,或者
  • 所有可用区级 NEG:一个或多个 GCE_VM_IP 类型可用区级 NEG
INTERNAL
Traffic Director 多个 全球 每个后端服务都支持以下后端组合:
  • 所有实例组后端:一个或多个代管实例组后端、非代管实例组后端或代管实例组后端与非代管实例组后端的组合,或者
  • 所有可用区级 NEG:一个或多个 GCE_VM_IP_PORTNON_GCP_PRIVATE_IP_PORT 类型可用区级 NEG
  • 一个类型为 INTERNET_FQDN_PORT 的互联网 NEG
INTERNAL_SELF_MANAGED
1 在标准或高级网络层级中,外部 HTTP(S) 负载均衡器、SSL 代理负载均衡器和 TCP 代理负载均衡器使用的后端服务始终覆盖全球范围。但是,在标准层级中,存在以下限制:

API 与 gcloud 参考文档

后端服务的范围为全球或地区

如需详细了解后端服务资源的属性,请参阅以下参考文档:

后端

后端是指从 Google Cloud 负载平衡器、Traffic Director 配置的 Envoy 代理或无代理 gRPC 客户端接收流量的端点。后端有多种类型:

此外,您还可以使用后端存储分区代替后端服务,还可以创建 Cloud Storage 存储分区后端。

您不能将不同类型的后端与同一后端服务搭配使用。例如,单个后端服务不能引用实例组和区域 NEG 的组合。但是,您可以在同一后端服务中使用不同类型的实例组的组合。例如,单个后端服务可以引用代管实例组和非代管实例组的组合。如需详细了解哪些后端与哪些后端服务兼容,请参阅上一部分中的表格。

您无法删除与后端服务关联的后端实例组或 NEG。在删除实例组或 NEG 之前,必须先从引用它的所有后端服务中将其作为后端移除。

后端协议

创建后端服务时,您必须指定用于与后端通信的协议。每个后端服务只能指定一个协议,您不能指定次要协议来作为后备。

哪种协议有效取决于负载平衡器的类型,或者您是否使用 Traffic Director。

产品 负载平衡方案 后端服务协议选项
外部 HTTP(S) 负载平衡器 外部 HTTP、HTTPS、HTTP/2
区域级外部 HTTP(S) 负载均衡器 EXTERNAL_MANAGED HTTP、HTTPS、HTTP/2
SSL 代理负载平衡器 外部 SSL
TCP 代理负载平衡器 EXTERNAL TCP
内部 HTTP(S) 负载平衡器 INTERNAL_MANAGED HTTP、HTTPS、HTTP/2
网络负载平衡器 外部 TCP、UDP 或未指定预览版
内部 TCP/UDP 负载平衡器 INTERNAL TCP 或 UDP
Traffic Director INTERNAL_SELF_MANAGED HTTP、HTTPS、HTTP/2、gRPC、TCP

更改后端服务的协议,会使后端在几分钟的时间里无法通过负载平衡器访问。

在负载平衡器和后端之间进行的加密

如需了解此主题,请参阅后端加密

实例组

本部分介绍实例组如何使用后端服务。

后端虚拟机和外部 IP 地址

后端服务中的后端虚拟机不需要外部 IP 地址:

  • 对于外部 HTTP(S) 负载平衡器、SSL 代理负载平衡器和 TCP 代理负载平衡器:客户端使用负载平衡器的外部 IP 地址与 Google Front End (GFE) 前端进行通信。GFE 结合使用后端的 VPC 网络标识符和虚拟机或端点的内部 IP 地址与后端虚拟机或端点通信。内部 IP 地址必须与后端的主要网络接口 (nic0) 相关联。通过特殊路由,可以实现 GFE 与后端虚拟机或端点之间的通信。
  • 对于区域级外部 HTTP(S) 负载均衡器,客户端使用该负载均衡器的 IP 地址和端口连接到该负载均衡器的 Envoy 代理(在代理专用子网中预配)。一个区域和 VPC 网络中的所有区域级外部 HTTP(S) 负载均衡器的后端虚拟机或端点都会收到来自代理专用子网的连接。
  • 对于网络负载平衡器,数据包首先路由到网络负载平衡器的外部 IP 地址。然后,负载平衡器使用一致的哈希技术将它们路由到后端虚拟机。
  • 对于内部 HTTP(S) 负载平衡器、内部 TCP/UDP 负载平衡器和 Traffic Director:后端虚拟机不需要外部 IP 地址。

已命名端口

在后端,负载平衡器会将流量转发到您的后端实例(Compute Engine 实例)侦听的端口号。您可以在实例组中配置此端口号,并在后端服务配置中引用它。

如果实例组的已命名端口与后端服务配置中的 --port-name 匹配,则后端服务使用此端口号与实例组的虚拟机进行通信。

后端端口号称为“已命名端口”,因为它是名称/值对。在实例组中,您可以定义端口的键名称和值。

例如,您可以在实例组中使用名称 my-service-name 和端口 8888 设置已命名端口:

gcloud compute instance-groups unmanaged set-named-ports my-unmanaged-ig \
    --named-ports=my-service-name:8888

然后,您可以引用后端服务配置中已命名的端口,并将 --port-name 上的后端服务设置为 my-service-name

gcloud compute backend-services update my-backend-service \
    --port-name=my-service-name

如果您为某个已命名的端口(例如 http:80,http:8080)使用多个端口号,那么这些端口号都必须用于同一应用。这是因为流量在具有相同端口名称的所有端口之间保持平衡。例如,创建一个值为 80443 的已命名端口。因为端口 80 通常不支持 TLS,所以这种方法不起作用。

如需了解如何创建已命名端口,请参阅以下说明:

注意事项:

  • 每个后端服务订阅一个端口名称。每个后端服务的每个后端实例组都必须至少有一个使用该名称的已命名端口。

  • 如果每个实例组为同一端口名称指定了不同的端口号,则后端服务在与不同实例组中的虚拟机通信时可以使用不同的端口号。 但是,所有端口必须表示同一应用。例如,http:80,http:8080 有效,但 http:80,http:443 不可行。

  • 后端服务使用的已解析端口号不需要与负载平衡器的转发规则使用的端口号相匹配。负载平衡器可以在前端侦听您在负载平衡器的转发规则中配置的一个或多个端口号。后端实例可以侦听不同的端口号。

已命名端口不用于以下情况:

  • 不用于区域 NEG 或互联网 NEG 后端,因为这些 NEG 使用不同机制(即,在端点本身上)定义端口。
  • 不用于无服务器 NEG 后端,因为这些 NEG 没有端点。
  • 不用于内部 TCP/UDP 负载平衡器,因为内部 TCP/UDP 负载平衡器是直通式负载平衡器(而非代理),并且其后端服务不会订阅已命名端口。
  • 对于网络负载平衡器,因为网络负载平衡器是直通式负载平衡器(而非代理),并且其后端服务不会订阅已命名端口。

如需详细了解已命名端口,请参阅 SDK 文档中的 gcloud compute instance-groups managed set-named-portsgcloud compute instance-groups unmanaged set-named-ports

有关实例组的限制和指南

在为负载平衡器创建实例组时,请记住以下限制和指南:

  • 不要将一个虚拟机放在多个负载平衡实例组中。如果虚拟机是两个或更多非代管实例组的成员,或者是一个代管实例组和一个或多个非代管实例组的成员,则 Google Cloud 限制您一次只能将其中一个实例组用作特定后端服务的后端。

    如果您需要一个虚拟机参与多个负载平衡器,则必须将同一实例组用作每个后端服务上的后端。

  • 对于代理负载平衡器,当您想要将流量均衡到不同端口时,请在一个实例组上指定所需的命名端口,并让每个后端服务订阅一个唯一的命名端口。

  • 您可以将同一实例组用作多个后端服务的后端。在这种情况下,后端必须使用兼容的平衡模式。兼容表示平衡模式必须相同,或者它们必须是 CONNECTIONRATE 的组合。不兼容的组合如下:

    • CONNECTION - UTILIZATION
    • RATE - UTILIZATION

    请思考以下示例:

    • 您有两个后端服务:external-https-backend-service 用于外部 HTTP(S) 负载平衡器,internal-tcp-backend-service 用于内部 TCP/UDP 负载平衡器。
    • 您在 internal-tcp-backend-service 中使用名为 instance-group-a 的实例组。
    • internal-tcp-backend-service 中,您必须应用 CONNECTION 平衡模式,因为内部 TCP/UDP 负载平衡器仅支持 CONNECTION 平衡模式。
    • 如果在 external-https-backend-service 中应用 RATE 平衡模式,那么您也可以在 external-https-backend-service 中使用 instance-group-a
    • 如果使用 UTILIZATION 平衡模式,您也无法在 external-https-backend-service 中使用 instance-group-a
  • 若要更改用作多个后端服务的后端的实例组的平衡模式,请执行以下操作:

    • 从一个后端服务以外的其他所有后端服务中移除实例组。
    • 更改一个剩余后端服务上的后端的平衡模式。
    • 将实例组作为后端重新添加到剩余的后端服务(如果这些服务支持新平衡模式)。
  • 如果您的实例组与多个后端服务相关联,则每个后端服务都可以引用实例组上相同或不同的已命名端口。

  • 我们不建议在多个后端服务中添加自动扩缩式代管实例组,这可能导致实例组中的实例进行不可预测和不必要的扩缩,尤其是在您使用 HTTP 负载平衡利用率自动扩缩指标时。

    • 建议不要这样做,但如果自动扩缩指标是 CPU 利用率或者与负载平衡器的服务容量无关的 Cloud Monitoring 指标,则此方案可能适用。使用其中一个自动扩缩指标可防止不稳定的扩缩。

区域网络端点组

网络端点通过 IP 地址或 IP 地址/端口组合表示服务,而不是引用实例组中的虚拟机。网络端点组 (NEG) 是网络端点的逻辑分组。

可用区级网络端点组 (NEG) 是可用区级资源,表示单个子网内 Google Cloud 资源 IP 地址的集合或 IP 地址/端口组合的集合。

可用区级 NEG 有两种类型的网络端点:

  • GCE_VM_IP 端点。
  • GCE_VM_IP_PORT 端点。

如需了解详情,请参阅可用区级 NEG 概览

将地区 NEG 用作后端的后端服务在虚拟机内运行的应用或容器之间分配流量。

使用 GCE_VM_IP_PORT 端点的可用区级网络端点组 (NEG) 可用作以下负载平衡器类型的后端:

  • 内部 HTTP(S) 负载平衡器
  • 外部 HTTP(S) 负载均衡器(全球级和区域级)
  • SSL 代理负载平衡器
  • TCP 代理负载平衡器

Traffic Director 还支持具有 GCE_VM_IP_PORT 端点的可用区级 NEG 后端。

使用 GCE_VM_IP 端点的可用区级网络端点组 (NEG) 只能用作内部 TCP/UDP 负载平衡的后端。

网络负载平衡不支持可用区级 NEG。

如需了解详情,请参阅负载平衡中的网络端点组概览

互联网网络端点组

互联网 NEG 是定义外部后端的全球资源。外部后端是在本地基础架构中或由第三方提供的基础架构上托管的后端。

互联网 NEG 是 IP 地址或主机名以及可选端口的组合:

  • 可公开解析的完全限定域名和可选端口,例如 backend.example.com:443(默认端口:对于 HTTP 为 80,对于 HTTPS 为 443)。
  • 可公开访问的 IP 地址和可选端口,例如 203.0.113.8:80203.0.113.8:443(默认端口:对于 HTTP 为 80,对于 HTTPS 为 443

使用互联网网络端点组作为后端的外部 HTTP(S) 负载均衡器的后端服务会将流量分配到 Google Cloud 外部的目的地。区域级外部 HTTP(S) 负载均衡器不支持互联网 NEG 后端。

如需了解详情,请参阅互联网网络端点组概览

无服务器网络端点组

网络端点组 (NEG) 为负载平衡器指定了一组后端端点。无服务器 NEG 是指向 Cloud RunApp EngineCloud Functions 服务的后端。

无服务器 NEG 可以表示以下各项之一:

  • 一项 Cloud Run 服务或一组服务。
  • 一个 Cloud Functions 函数或一组函数。
  • 一个 App Engine 应用(标准或 Flex 应用)、应用内的一项特定服务、应用的某一特定版本或一组服务。

如需为共享网址格式的无服务器应用设置无服务器 NEG,请使用网址掩码。网址掩码是网址架构的模板(例如 example.com/<service>)。无服务器 NEG 将使用此模板从传入请求的网址中提取 <service> 名称,并将请求路由到相同名称的匹配的 Cloud Run、Cloud Functions 或 App Engine 服务。

如需了解详情(包括哪些负载平衡器支持无服务器 NEG),请参阅无服务器网络端点组概览

流量分配

后端行为的某些方面由后端服务资源中以下字段的值决定:

  • 平衡模式定义了负载平衡器如何为新请求或连接衡量后端就绪情况。
  • 目标容量,用于定义目标最大连接数、目标最大速率或目标最大 CPU 利用率。
  • 容量扩缩器,可调整总体可用容量,而无需修改目标容量。

平衡模式

平衡模式确定负载平衡器的后端是可以处理额外的流量还是已完全加载。Google Cloud 有三种平衡模式:

  • CONNECTION
  • RATE
  • UTILIZATION

平衡模式选项取决于后端服务的负载平衡方案、后端服务的协议以及连接到后端服务的后端类型。

在后端服务中添加后端时可设置平衡模式。请注意,使用无服务器 NEG 或互联网 NEG 作为负载平衡器的后端时,您不能指定平衡模式。

对于 HTTP(S) 负载均衡,均衡模式用于选择最合适的后端(实例组或 NEG)。然后,流量通过轮循方式在后端的实例或端点之间分配。

对于内部 HTTP(S) 负载平衡,负载平衡是双层的。平衡模式决定了应发送到每个后端(实例组或 NEG)的流量的权重/比例。然后,负载平衡政策 (LocalityLbPolicy) 会确定流量如何分配到组中的实例或端点。max-utilization 目标容量只能为每个实例组指定,并且不能应用于组中的特定虚拟机。

平衡模式 受支持的负载平衡方案 兼容的后端服务协议1 兼容的后端2 适用的产品
CONNECTION EXTERNAL
INTERNAL
SSL、TCP、UDP
实例组或区域 NEG(如果受支持)。
  • SSL 代理负载平衡器
  • TCP 代理负载平衡器
  • 内部 TCP/UDP 负载平衡器
  • 网络负载平衡器
RATE EXTERNAL
EXTERNAL_MANAGED
INTERNAL_MANAGED
INTERNAL_SELF_MANAGED
HTTP、HTTPS、HTTP2、gRPC 实例组或区域 NEG
  • 外部 HTTP(S) 负载平衡器
  • 区域级外部 HTTP(S) 负载均衡器
  • 内部 HTTP(S) 负载平衡器
  • Traffic Director(INTERNAL_SELF_MANAGED;仅限 HTTPS、HTTP、TCP 和 gRPC 协议)
UTILIZATION EXTERNAL
EXTERNAL_MANAGED
INTERNAL_MANAGED
INTERNAL_SELF_MANAGED
无特殊限制 仅限实例组。区域 NEG 不支持利用率模式。
  • 外部 HTTP(S) 负载平衡器
  • 区域级外部 HTTP(S) 负载均衡器
  • SSL 代理负载平衡器
  • TCP 代理负载平衡器
  • 内部 HTTP(S) 负载平衡器
  • Traffic Director(INTERNAL_SELF_MANAGED;仅限 HTTPS、HTTP、TCP 和 gRPC 协议)
1根据负载平衡器的类型进一步限制协议。
2对于支持的后端类型(例如实例组和可用区级 NEG),请参阅负载平衡器功能页面上的后端

如果与后端服务相关联的所有虚拟机的平均利用率低于 10%,则 Google Cloud 可能会首选特定区域。当您使用代管地区实例组、不同区域中的代管区域实例组以及非代管区域实例组时,可能会发生这种情况。随着发送到负载平衡器的流量越来越多,这种区域不平衡问题会自动得以解决。

如需了解详情,请参阅 gcloud compute backend-services add-backend

更改负载平衡器的平衡模式

对于某些负载平衡器,您无法更改平衡模式,因为后端服务可能只有一种平衡模式。对于其他负载平衡器,您可以更改平衡模式,因为那些后端服务可以使用多个模式。

负载平衡器 后端 可用的平衡模式
外部 HTTP(S) 负载均衡器
区域级外部 HTTP(S) 负载均衡器
实例组 RATEUTILIZATION
可用区级 NEG(GCE_VM_IP_PORT 端点) RATE
内部 HTTP(S) 负载平衡器 实例组 RATEUTILIZATION
可用区级 NEG(GCE_VM_IP_PORT 端点) RATE
TCP 代理负载平衡器 实例组 CONNECTIONUTILIZATION
可用区级 NEG(GCE_VM_IP_PORT 端点) CONNECTION
SSL 代理负载平衡器 实例组 CONNECTIONUTILIZATION
可用区级 NEG(GCE_VM_IP_PORT 端点) CONNECTION
网络负载平衡器 实例组 CONNECTION
内部 TCP/UDP 负载平衡器 实例组 CONNECTION
可用区级 NEG(GCE_VM_IP 端点) CONNECTION

目标容量

每个平衡模式都有一个对应的目标容量,用于定义下列目标最大值之一:

  • 连接数
  • 费率
  • CPU 占用率

对于每种平衡模式,目标容量都不是断路器。在某些情况下,负载平衡器将超过最大值,例如在所有后端虚拟机或端点都已达到最大值的情况下。

连接平衡模式

对于 CONNECTION 平衡模式,目标容量可定义目标最大并发连接数。除了内部 TCP/UDP 负载平衡器和网络负载平衡器之外,您必须使用以下某一设置来指定目标连接数上限:

  • max-connections-per-instance(每个虚拟机):单个虚拟机的目标平均连接数。
  • max-connections-per-endpoint(每个地区 NEG 中的端点):单个端点的目标平均连接数。
  • max-connections(每个地区 NEG 和地区实例组):整个 NEG 或实例组的目标平均连接数。对于区域代管式实例组,请改用 max-connections-per-instance

下表显示了目标容量参数如何定义以下内容:

  • 整个后端的目标容量
  • 每个实例或端点的预期目标容量
后端类型 目标容量
如果您指定 整个后端容量 每个实例或每个端点的预期容量
实例组
N 实例,
H 运行状况良好
max-connections-per-instance=X X × N (X × N)/H
地区 NEG
N 端点,
H 运行状况良好
max-connections-per-endpoint=X X × N (X × N)/H
实例组
(区域代管式实例组除外)

H 运行状况良好的实例
max-connections=Y Y Y/H

如图所示,max-connections-per-instancemax-connections-per-endpoint 设置是代理,它用于计算整个实例组或整个地区 NEG 的目标连接数上限:

  • 在包含 N 实例的实例组中,设置 max-connections-per-instance=X 的含义与设置 max-connections=X × N 相同。
  • 在具有 N 端点的地区 NEG 中,设置 max-connections-per-endpoint=X 的含义与设置 max-connections=X × N 相同。

速率平衡模式

对于 RATE 平衡模式,您必须使用以下参数之一定义目标容量:

  • max-rate-per-instance(每个虚拟机):为单个虚拟机提供目标平均 HTTP 要求率。
  • max-rate-per-endpoint(地区 NEG 中的每个端点):为单个端点提供目标平均 HTTP 要求率。
  • max-rate(每个地区 NEG 和地区实例组):为整个 NEG 或实例组提供目标平均 HTTP 要求率。对于区域代管式实例组,请改用 max-rate-per-instance

下表显示了目标容量参数如何定义以下内容:

  • 整个后端的目标容量
  • 每个实例或端点的预期目标容量
后端类型 目标容量
如果您指定 整个后端容量 每个实例或每个端点的预期容量
实例组
N 实例,
H 运行状况良好
max-rate-per-instance=X X × N (X × N)/H
地区 NEG
N 端点,
H 运行状况良好
max-rate-per-endpoint=X X × N (X × N)/H
实例组
(区域代管式实例组除外)

H 运行状况良好的实例
max-rate=Y Y Y/H

如图所示,max-rate-per-instancemax-rate-per-endpoint 设置是代理,它用于计算整个实例组或整个地区 NEG 的 HTTP 请求的目标上限:

  • 在包含 N 实例的实例组中,设置 max-rate-per-instance=X 的含义与设置 max-rate=X × N 相同。
  • 在具有 N 端点的地区 NEG 中,设置 max-rate-per-endpoint=X 的含义与设置 max-rate=X × N 相同。

利用率平衡模式

UTILIZATION 平衡模式没有强制的目标容量。您有多种选项取决于后端类型,如下一部分中的表格所示。

支持的平衡模式和目标容量设置

此表总结了针对给定负载平衡器和后端类型的所有可能的平衡模式。它还显示了您必须使用平衡模式指定的可用或必需的容量设置。

负载平衡器 后端类型 平衡模式 目标容量
内部 TCP/UDP 负载平衡器 实例组 CONNECTION 您不能指定目标连接数上限。
可用区级 NEG (GCP_VM_IP) CONNECTION 您不能指定目标连接数上限。
外部 TCP/UDP 网络负载均衡器 实例组 CONNECTION 您不能指定目标连接数上限。
SSL 代理负载均衡器、TCP 代理负载均衡器 实例组 CONNECTION 必须指定以下其中一项:
  • 每个地区实例组的 max-connections
  • max-connections-per-instance  (地区性或区域性实例组)
UTILIZATION 您可以选择指定以下其中一项:
  • (1) max-utilization
  • (2) 每个地区实例组的 max-connections
  • (3) max-connections-per-instance
     (地区性或区域性实例组)
  • (1) 和 (2) 组合在一起
  • (1) 和 (3) 组合在一起
可用区级 NEG (GCP_VM_IP_PORT) CONNECTION 必须指定以下其中一项:
  • 每个地区 NEG 的 max-connections
  • max-connections-per-endpoint
外部 HTTP(S) 负载均衡器、区域级外部 HTTP(S) 负载均衡器、内部 HTTP(S) 负载均衡器、Traffic Director 实例组 RATE 必须指定以下其中一项:
  • 每个地区实例组的 max-rate
  • max-rate-per-instance
     (地区性或区域性实例组)
UTILIZATION 您可以选择指定以下其中一项:
  • (1) max-utilization
  • (2) 每个地区实例组的 max-rate
  • (3) max-rate-per-instance
     (地区性或区域性实例组)
  • (1) 和 (2) 组合在一起
  • (1) 和 (3) 组合在一起
可用区级 NEG (GCP_VM_IP_PORT) RATE 必须指定以下其中一项:
  • 每个地区 NEG 的 max-rate
  • max-rate-per-endpoint

容量扩缩器

您可以选择性地调整容量扩缩器以缩减目标容量(最大利用率、最大速率或最大连接数),而无需更改目标容量。支持目标容量的所有负载平衡器都支持容量扩缩器。唯一的例外是网络负载平衡器和内部 TCP/UDP 负载平衡器。

默认情况下,容量扩缩器的值为 1.0 (100%)。您可以将容量扩缩器设置为以下任一值:

  • 确切的 0.0(可防止所有新连接)
  • 一个介于 0.1 (10%) 和 1.0 (100%) 之间的值

以下示例演示了容量调节器如何与目标容量设置搭配使用。

  • 如果平衡模式是 RATE,则最大速率设置为 80 RPS,且容量扩缩器为 1.0有效目标容量也是 80 RPS。

  • 如果平衡模式是 RATE,则最大利用率设置为 80 RPS,且容量扩缩器为 0.5有效目标容量为 40 RPS (0.5 times 80)。

  • 如果平衡模式是 RATE,则最大利用率设置为 80 RPS,且容量扩缩器为 0.0有效目标容量为零。容量扩缩器为零将使后端不执行轮替。

Traffic Director 和流量分配

Traffic Director 也会使用后端服务资源。具体来说,Traffic Director 使用负载平衡方案为 INTERNAL_SELF_MANAGED 的后端服务。对于内部自行管理的后端服务,流量分配依据负载平衡模式和负载平衡政策的组合。后端服务根据后端的平衡模式将流量定向到后端。然后,Traffic Director 根据负载平衡政策分配流量。

内部自行管理的后端服务支持以下平衡模式:

  • UTILIZATION(如果所有后端都是实例组)
  • RATE(如果所有后端都是实例组或区域 NEG)

如果您选择 RATE 平衡模式,则必须指定最大速率、每个实例的最大速率或每个端点的最大速率。

如需详细了解 Traffic Director,请参阅 Traffic Director 概念

会话亲和性

某些应用需要将给定用户发出的多个请求定向到同一后端或端点。此类应用包括广告投放、游戏或具有大量内部缓存的服务所使用的有状态服务器。会话亲和性的缺点是负载的均匀分配可能会有所减少。

会话粘性会尽最大努力将请求传递到处理初始请求的同一个后端。默认情况下,会话亲和性处于停用状态 (--session-affinity=NONE)。如果未启用会话亲和性,则负载平衡器会根据 5 元组哈希分配新请求,如下所示:

  • 数据包的来源 IP 地址
  • 数据包的来源端口(如果位于数据包的标头中)
  • 数据包的目标 IP 地址
  • 数据包的目的地端口(如果数据包的标头中出现)
  • 数据包的协议

对于直通式负载平衡器,如果后端实例或端点运行状况良好,则后续请求将转到同一个后端虚拟机或端点。

对于基于代理的负载平衡器,如果后端实例或端点运行状况良好且容量不足,则后续请求将转到同一个后端虚拟机或端点。平衡模式决定了后端何时达到容量。

下表显示了会话亲和性选项:

产品 会话粘性选项
内部 TCP/UDP 负载平衡器
  • 无 (NONE)
  • 客户端 IP、目的地 IP (CLIENT_IP)
  • 客户端 IP、目的地 IP、协议 (CLIENT_IP_PROTO)
  • 客户端 IP、客户端端口、目的地 IP、目的地端口、协议 (CLIENT_IP_PORT_PROTO)
TCP 代理负载均衡器
SSL 代理负载均衡器
  • 无 (NONE)
  • 客户端 IP (CLIENT_IP)
区域级外部 HTTP(S) 负载均衡器
  • 无 (NONE)
  • 客户端 IP (CLIENT_IP)
  • 生成的 Cookie (GENERATED_COOKIE)
  • 标头字段 (HEADER_FIELD)
  • HTTP Cookie (HTTP_COOKIE)
外部 HTTP(S) 负载均衡器
  • 无 (NONE)
  • 客户端 IP (CLIENT_IP)
  • 生成的 Cookie (GENERATED_COOKIE)
内部 HTTP(S) 负载平衡器
  • 无 (NONE)
  • 客户端 IP (CLIENT_IP)
  • 生成的 Cookie (GENERATED_COOKIE)
  • 标头字段 (HEADER_FIELD)
  • HTTP Cookie (HTTP_COOKIE)
网络负载均衡器1
  • 无 (NONE)
  • 客户端 IP、目的地 IP (CLIENT_IP)
  • 客户端 IP、目的地 IP、协议 (CLIENT_IP_PROTO)
  • 客户端 IP、客户端端口、目的地 IP、目的地端口、协议 (CLIENT_IP_PORT_PROTO)
Traffic Director
  • 无 (NONE)
  • 客户端 IP (CLIENT_IP)
  • 生成的 Cookie (GENERATED_COOKIE)(仅限 HTTP 协议)
  • 标头字段 (HEADER_FIELD)(仅限 HTTP 协议)
  • HTTP Cookie (HTTP_COOKIE)(仅限 HTTP 协议)

1 此表记录基于后端服务的网络负载均衡器支持的会话亲和性。基于目标池的网络负载均衡器不使用后端服务。而是通过目标池中的 sessionAffinity 参数为网络负载均衡器设置会话亲和性。

配置会话亲和性时请注意以下几点:

  • 为进行身份验证或为了安全起见,请勿依赖会话亲和性。会话亲和性设计为在后端达到或超过容量上限或运行状况不佳时被破坏。

  • Google Cloud 负载平衡器会尽最大努力提供会话亲和性。更改后端运行状况检查状态或更改后端完整度的因素(以平衡模式衡量)可能会破坏会话亲和性。不建议将 None 以外的会话亲和性与 UTILIZATION 平衡模式一起使用。这是因为实例利用率的更改可能会导致负载平衡服务将新请求或连接定向到不太完整的后端虚拟机。这会破坏会话亲和性。请改用 RATECONNECTION 平衡模式,以降低破坏会话亲和性的可能性。

  • 负载均衡器启用会话亲和性后,当合理大量地分布唯一会话时,负载均衡器会有效地实现负载平衡。“合理大量”是指至少是实例组中的后端实例数的数倍。当您使用少量会话测试负载均衡器时,系统不会均匀分配流量。

  • 对于外部和内部 HTTP(S) 负载均衡器,当预期端点或实例超出其平衡模式的目标最大值时,会话亲和性可能会被破坏。请思考以下示例:

    • 一个负载均衡器有一个 NEG 和三个端点。
    • 每个端点的目标容量为 1 RPS。
    • 均衡模式为 RATE
    • 目前,每个端点分别处理 1.1、0.8 和 1.6 RPS。
    • 当最后一个端点具有亲和性的 HTTP 请求到达负载均衡器时,会话亲和性会声明以 1.6 RPS 处理的端点。
    • 新请求可能会发送到 RPS 为 0.8 的中间端点。
  • 如需了解网络负载平衡和会话亲和性的具体信息,请参阅外部 TCP/UDP 网络负载平衡概览

  • 如需详细了解内部 TCP/UDP 负载平衡和会话亲和性,请参阅内部 TCP/UDP 负载平衡概览

  • 如果配置了无代理 gRPC 服务,Traffic Director 不支持会话亲和性。

以下几个部分介绍了不同类型的会话亲和性。

客户端 IP 地址亲和性

客户端 IP 地址亲和性将来自同一客户端 IP 地址的请求定向到同一个后端实例。客户端 IP 地址亲和性适用于所有使用后端服务的 Google Cloud 负载平衡器。

使用客户端 IP 亲和性时,请注意以下几点:

  • 客户端 IP 亲和性是一个二元组哈希,由客户端的 IP 地址以及客户端连接的负载平衡器转发规则的 IP 地址组成。

  • 如果原始客户端位于 NAT 后面或通过代理发出请求,则负载平衡器看到的客户端 IP 地址可能不是原始客户端。通过 NAT 或代理发出的请求会将 NAT 路由器或代理的 IP 地址用作客户端 IP 地址。这会导致传入的流量无谓汇集到同一个后端实例上。

  • 如果客户端从一个网络切换到另一个网络,其 IP 地址会发生变化,导致亲和性被破坏。

如果设置了生成的 Cookie 亲和性,则负载平衡器会针对第一个请求发出一个 Cookie。对于具有相同 Cookie 的每个后续请求,负载平衡器会将请求定向到同一个后端虚拟机或端点。

  • 对于外部 HTTP(S) 负载平衡器,Cookie 名为 GCLB
  • 对于区域级外部 HTTP(S) 负载均衡器、内部 HTTP(S) 负载均衡器和 Traffic Director,Cookie 名为 GCILB

与基于客户端 IP 地址的亲和性相比,基于 Cookie 的亲和性可更准确地识别负载平衡器的客户端。例如:

  1. 使用基于 Cookie 的亲和性时,负载平衡器可以唯一标识共享同一来源 IP 地址的两个或更多客户端系统。使用基于客户端 IP 地址的亲和性,负载平衡器会处理来自同一来源 IP 地址的所有连接,就像它们来自同一客户端系统一样。

  2. 如果客户端更改其 IP 地址,则基于 Cookie 的亲和性可让负载平衡器识别来自该客户端的后续连接,而不是将此连接视为新连接。例如,当移动设备从一个网络切换到另一个网络时,客户端会更改其 IP 地址。

在负载平衡器为基于生成的 Cookie 亲和性创建一个 Cookie 时,它会将该 Cookie 的 path 特性设置为 /。如果网址映射的路径匹配器拥有一个主机名的多个后端服务,则所有后端服务会共用同一个会话 Cookie。

负载平衡器生成的 HTTP Cookie 的生命周期是可配置的。您可以将该生命周期设置为 0(默认值,这意味着 Cookie 只是会话 Cookie)。也可以将 Cookie 的生命周期设置为一个介于 186400 秒(24 小时)之间的值(含边界值)。

标头字段亲和性

如果同时满足以下两个条件,则支持标头字段亲和性:

  • 负载平衡位置政策是 RING_HASH 或 MAGLEV。
  • 后端服务的 consistentHash 指定 HTTP 标头的名称 (httpHeaderName)。

以下产品可以使用标头字段亲和性:

  • Traffic Director
  • 内部 HTTP(S) 负载平衡器
  • 区域级外部 HTTP(S) 负载均衡器

如果同时满足以下两个条件,则支持 HTTP Cookie 亲和性:

  • 负载平衡位置政策是 RING_HASH 或 MAGLEV。
  • 后端服务的一致性哈希指定 HTTP Cookie 的名称。

HTTP Cookie 亲和性根据 HTTP_COOKIE 标志中指定的 HTTP Cookie,将请求路由到 NEG 中的后端虚拟机或端点。如果客户端未提供 Cookie,则代理会生成 Cookie 并通过 Set-Cookie 标头将其返回给客户端。

以下产品可以使用 HTTP Cookie 亲和性:

  • Traffic Director
  • 内部 HTTP(S) 负载平衡器
  • 区域级外部 HTTP(S) 负载均衡器

如需详细了解使用 HTTP Cookie 亲和性的内部 HTTP(S) 负载均衡器,请参阅内部 HTTP(S) 负载均衡概览

失去会话粘性

无论选择哪种类型的亲和性,在以下情况下,客户端都可能会失去与后端的亲和性:

  • 如果后端实例组或区域 NEG 的容量不足(根据平衡模式的目标容量定义)。在这种情况下,Google Cloud 会将流量定向到可能位于不同区域的其他后端实例组或区域 NEG。为解决此问题,请务必根据自己的测试为每个后端指定正确的目标容量。
  • 自动扩缩功能会向代管实例组添加实例或从中移除实例。发生这种情况时,实例组中的实例数量会发生变化,因此后端服务会为会话亲和性重新计算哈希值。为解决此问题,请确保代管实例组的最小大小可以应对典型负载。仅当负载意外增加时,系统才会执行自动扩缩功能。
  • 如果 NEG 中的后端虚拟机或端点未通过运行状况检查,则负载平衡器会将流量定向到其他运行状况良好的后端。如需详细了解当所有后端都未通过运行状况检查时负载平衡器如何应对,请参阅每个 Google Cloud 负载平衡器对应的文档。
  • UTILIZATION 平衡模式适用于后端实例组时,会话亲和性会因后端利用率的变化而被破坏。您可以使用 RATECONNECTION 平衡模式(具体取决于负载平衡器类型支持哪种模式)来解决此问题。

使用 HTTP(S) 负载平衡、SSL 代理负载平衡或 TCP 代理负载平衡时,请额外注意以下几点:

  • 如果从互联网上的客户端到 Google 的路由路径在请求或连接之间发生变化,则系统可能会选择其他 Google Front End (GFE) 前端作为代理。这可能会破坏会话亲和性。
  • 当您使用 UTILIZATION 平衡模式时(尤其是未定义目标最大容量时),如果负载平衡器的流量较低,会话亲和性可能会被破坏。请切换到所选负载平衡器支持的 RATECONNECTION 平衡模式。

后端服务超时

大多数 Google Cloud 负载平衡器都具有后端服务超时。默认值是 30 秒。 允许的超时值的完整范围为 1 - 2,147,483,647 秒。

  • 对于使用 HTTP、HTTPS 或 HTTP/2 协议的外部 HTTP(S) 负载均衡器和内部 HTTP(S) 负载均衡器,后端服务超时为 HTTP(S) 流量的请求/响应超时。这是负载平衡器等待后端返回请求的完整响应的时间量。例如,如果后端服务超时值是默认值 30 秒,则后端有 30 秒的时间来传送请求的完整响应。如果后端在将响应标头发送到负载平衡器之前关闭了连接或超时,则负载平衡器会重试一次 HTTP GET 请求。如果后端发送响应标头(即使响应正文不完整),或者发送到后端的请求不是 HTTP GET 请求,则负载平衡器不会重试。如果后端根本没有响应,则负载均衡器会向客户端返回 HTTP 5xx 响应。要更改后端对请求作出响应的分配时间,请更改超时值。

    对于 HTTP 流量,客户端完成其请求发送的最长时间等于后端服务超时值。如果看到带有 jsonPayload.statusDetail client_timed_out 的 HTTP 408 响应,则表示客户端的请求被代理或者后端的响应被代理时跟不上进度。如果问题是由于客户端遇到性能问题,您可以通过增加后端服务超时值来解决此问题。

    如果 HTTP 连接升级到 WebSocket,则后端服务超时将定义 WebSocket 可以保持打开状态(无论是否空闲)的最长时间。

    如需详细了解每个负载均衡器的后端服务超时,请参阅以下内容:

    • 对于外部 HTTP(S) 负载均衡器和区域级外部 HTTP(S) 负载均衡器,请参阅超时和重试
    • 对于内部 HTTP(S) 负载均衡器,请参阅超时和重试
  • 对于 SSL 代理负载均衡器和 TCP 代理负载均衡器,超时为空闲超时。如需在删除连接之前允许更多或更少时间,请更改超时值。此空闲超时也用于 WebSocket 连接。

  • 对于内部 TCP/UDP 负载均衡器和网络负载均衡器,您可以使用 gcloud 或 API 设置后端服务超时的值,但系统会忽略该值。后端服务超时对于这些直通负载平衡器没有任何意义。

  • 对于 Traffic Director,无代理 gRPC 服务不支持后端服务超时字段(使用 timeoutSec 指定)。对于此类服务,请使用 maxStreamDuration 字段配置后端服务超时。这是因为 gRPC 不支持 timeoutSec 的语义,该函数指定了在发出请求后等待后端返回完整响应的时间。gRPC 的超时指定了从数据流开头直到响应完全处理的时间(包括所有重试)。

运行状况检查

后端为实例组或区域 NEG 的每个后端服务都必须进行相关的运行状况检查。使用无服务器 NEG 或互联网 NEG 作为后端的后端服务不得引用运行状况检查。

如果使用 Google Cloud Console 创建负载平衡器,您可以在创建负载平衡器时创建运行状况检查(如果需要),也可以引用现有运行状况检查。

当您通过 gcloud 命令行工具或 API 创建使用实例组或区域 NEG 后端的后端服务时,必须引用现有运行状况检查。如需详细了解所需运行状况检查的类型和范围,请参阅“运行状况检查概览”中的负载平衡器指南

如需了解详情,请参阅以下文档:

在后端服务资源上启用的额外功能

某些可选的 Google Cloud 功能(例如 Cloud CDN 和 Google Cloud Armor)适用于外部 HTTP(S) 负载均衡器使用的后端服务。本文档不讨论这些功能;如有需要,请参阅 HTTP(S) 负载均衡概览

流量管理功能

只有部分产品支持以下功能:

以下产品支持这些功能:

  • 区域级外部 HTTP(S) 负载均衡器
  • 内部 HTTP(S) 负载平衡器
  • Traffic Director(但无代理 gRPC 服务不提供此支持)

后续步骤

如需获得说明如何在负载平衡中使用后端服务的相关文档和信息,请查看以下内容: