来源概览

借助媒体 CDN,您可以从源站基础架构提取内容,无论内容是托管在 Google Cloud中、其他云平台中还是本地。

每个配置都可以关联一个或多个来源。源站配置会告知媒体 CDN 如何连接到您的基础架构,何时以及如何进行故障转移、重试和超时,以及在连接时使用什么协议。

来源具有以下特征:

  • 来源可以按主机和按路由定义,这使得单个 EdgeCacheService 资源可以映射到多个来源,这些来源包含清单、视频片段和其他静态内容等。
  • 可以通过 HTTP/2、HTTPS 和未加密的 HTTP/1.1 访问来源。
  • 您可以配置防火墙规则,以仅允许特定的 Google IP 地址,这样只有 Media CDN 可以访问您的源。
  • 重试和故障切换行为是按来源配置的,可让服务在出现严重错误(例如连接失败)时进行故障切换,或根据 HTTP 404 Not Found 或 HTTP 429 Too Many Requests 响应进行重试。这些操作仅针对较安全的 HTTP 方法(包括 GET、HEAD 和 OPTIONS)执行。如需详细了解安全的 HTTP 方法,请参阅 RFC 9110。
  • 通过将外部应用负载平衡器配置为 Media CDN 后面的来源,可以访问 Google Cloud 内部或本地的私有资源。
  • 重定向跟踪行为是按来源配置的。您可以启用 Media CDN 以跟踪重定向到其他源服务器。

来源要求

如需允许媒体 CDN 缓存大于 1 MiB 的源站响应,源站必须在 GET 请求的响应标头中包含以下内容(除非另有规定):

  • Last-Modified 或 ETag HTTP 响应标头(一种验证器)。
  • 有效的 HTTP Date 标头。
  • 有效的 Content-Length 标头。
  • 针对 Range GET 请求的 Content-Range 响应标头。 Content-Range 标头必须具有有效值,格式为 bytes x-y/z(其中 z 是对象大小)。

默认源协议为 HTTP/2。如果源站仅支持 HTTP/1.1,您可以为每个源站明确设置协议字段。

源站防护

媒体 CDN 提供深度分层的边缘基础架构,旨在尽可能主动减少缓存填充。

缓存基础架构主要分为三个层级:

  1. 深层边缘缓存,用于在服务提供商的网络内传送大部分流量并分流。
  2. Google 的对等互连边缘,可连接到数千个 ISP,充当边缘缓存的中层缓存;如果特定 ISP 中没有边缘缓存,则充当面向用户的缓存。
  3. Google 网络中位于来源之前的长尾缓存,其他下游缓存会从这些缓存中填充内容。这些缓存支持大量扇入,具有充足的缓存存储容量,并充当源防护。

此拓扑的概览如下所示:

拓扑概览。
拓扑概览(点击可放大)。

Media CDN 默认使用一组有限的关键全球位置提供源站防护。默认源屏蔽功能根据最终用户的位置(而非源的位置)运行。当最终用户和源服务器位于同一区域时,以及当全球源服务器位于多个区域时,这种方法效果良好,可带来强大的分流优势。

灵活防护

如果您的来源集中在一个区域,但用户分布在全球各地,那么基于用户位置信息的默认来源屏蔽行为可能会在以下方面表现欠佳:

  • 当默认 Shield 位置在地理位置上距离集中式源较远时,增加缓存未命中的延迟时间
  • 通过将缓存填充请求分散到多个全球默认屏蔽位置(而不是集中到单个位置)来减少源站分流

借助灵活的源屏蔽,您可以为源屏蔽配置单个特定地理区域,通常选择靠近集中式源的区域,从而克服这些限制。然后,灵活的屏蔽会通过位于配置区域内或附近的屏蔽缓存来路由所有缓存填充请求。这会通过这些以区域为中心的缓存将负载整合到源服务器。

通过在与集中式来源相同的地理区域中配置灵活防护区域,您可以优化以下方面:

  • Shield 层的缓存命中率
  • 来源分流
  • 缓存未命中和不可缓存内容的延迟时间
  • 性能稳定性

灵活防护与 Media CDN 中配置的任何源站类型兼容。

请求折叠

请求折叠将针对同一缓存键的多个用户发起的缓存填充请求主动折叠为每个边缘节点的一个源站请求。

所有缓存层都支持请求合并(或合并)以进一步减少源站负载。根据大规模的实际工作负载观察结果:

  • 超过 95% 的缓存填充使用区域内的专用长尾缓存节点,以降低缓存填充成本和延迟时间。
  • 来源与 Google 自己的边缘基础设施之间的缓存填充完全通过 Google 的全球专用骨干网进行,这可缩短缓存填充延迟时间并提高可靠性,这两者都对直播工作负载有积极的益处。
  • 缓存在有利的情况下会相互交叉填充,从而进一步降低缓存填充率。
  • Media CDN 在各个缓存中都具有充足的存储容量,即使对于长尾、不太受欢迎的内容,也能最大限度地降低逐出率。

客户看到的分流率可能会有所不同,具体取决于其缓存配置、用户负载、工作负载(例如直播与点播)、用户分布,以及他们向不同区域的用户提供多少长尾内容(总语料库大小)。

与源站屏蔽相结合,请求折叠可进一步减少源站负载和出站带宽需求,并且是媒体 CDN 的默认行为。

折叠的请求会记录面向客户端的请求和(折叠的)缓存填充请求。折叠会话的标头用于发出源站填充请求,这意味着源站只会看到该客户端的标头(包括 User-Agent)。

无法合并缓存键不同的请求。

来源连接

以下部分介绍了 Media CDN 如何连接到源、如何发出 HTTP 请求,以及如何对请求进行身份验证。

支持的来源和协议

媒体 CDN 直接支持任何可公开访问的 HTTP 端点作为来源,包括:

  • Cloud Storage 存储分区,包括通过 Identity and Access Management 服务账号访问的私有存储分区
  • 外部应用负载平衡器
  • 与 Amazon S3 兼容的存储分区,包括使用 AWS 签名版本 4 的私有存储分区
  • 其他可公开访问的对象存储服务,例如 Azure Blob Storage
  • 可公开访问的网络服务器,例如公共虚拟机或本地主机

与源的连接通过安全隧道和 Google 的全球骨干网进行。

下表详细介绍了支持的来源协议。

协议 支持 需要 SSL (TLS)
HTTP/2 是(默认) 是
HTTPS(基于 TLS 的 HTTP/1.1) 是 是
HTTP/1.1 是 否

媒体 CDN 默认使用 HTTP/2 (h2) 连接到源站。HTTP/2 和 HTTPS 都需要有效的、公开可信的 TLS (SSL) 证书。有效证书是指未过期、由公共证书授权机构签名,且主题备用名称与发送到来源的主机名相匹配的证书。

注意:

  • 如果源站不支持 HTTP/2,您可以明确将协议(按源站)设置为 HTTP (HTTP/1.1) 或 HTTPS(通过 TLS 的 HTTP/1.1)。
  • 将 HTTPS 或 HTTP/1.1 配置为源协议时,Media CDN 不会协商替代协议(例如 HTTP/2)。同样,在配置 HTTP/2 时,连接不会回退到 HTTP/1.1,以便明确源连接行为。
  • 媒体 CDN 会根据协议自动使用正确的端口:端口 80(用于 HTTP)或端口 443(用于 HTTPS 和 HTTP/2)。

源站请求标头

连接到来源时,Media CDN 默认使用客户端请求中的 Host 标头。

下表记录了在不同配置场景下,源服务器在入站请求中看到的内容:

客户请求 EdgeCacheService.hostRewrite EdgeCacheOrigin.hostRewrite originAddress 主机标头 /
源站的 TLS SNI
media.example.com 无 无 backend.example.com media.example.com
media.example.com service.example.com 无 backend.example.com service.example.com
media.example.com 无 origin.example.com backend.example.com origin.example.com
media.example.com service.example.com origin.example.com backend.example.com origin.example.com
media.example.com service.example.com origin.example.com gs://vod-content-bucket 根据存储桶名称自动设置

如果主源站和任何故障切换源站共享相同的 routeRule 或 hostRewrite 配置,则它们会看到相同的主机标头。

使用 Cloud Storage 存储桶作为源站时,系统会忽略所有 hostRewrite 设置,因为 Cloud Storage 存储桶不支持替代性主机标头值。系统会根据存储桶名称自动设置主机标头。

请求(对于 HTTP/3、HTTP/2 和 HTTPS 请求)中的 TLS SNI(服务器名称指示)值设置为与发送到源的主机标头相同的值。

如需了解如何为每个路由配置重写主机标头,请参阅配置服务路由。如需了解如何设置每个来源的替换操作,请参阅无重定向的来源故障切换。

允许来源接收来自 Media CDN 的流量

为降低未经授权访问您内容的风险,请在来源处使用 IP 许可名单来阻止对所有 IP 地址的访问,但 Google 用于向外部来源发送请求的特定 IP 地址范围除外。这样一来,只有媒体 CDN 可以连接到您的源站服务器。

下表汇总了防火墙规则所需的来源 IP 地址范围:

IP 地址类型 请求来源 IP 地址范围
IPv4 136.124.4.0/22
IPv6 2001:4860:4864:a::/64

使用以下网址访问包含更新后的 Google 分配 IP 地址范围的 JSON 文件。

https://www.gstatic.com/ipranges/mediacdn.json

故障切换和超时

以下各部分介绍了这些配置选项:

  • 超时:确定媒体 CDN 等待连接到源或等待源响应请求的时长。
  • 重试:确定 Media CDN 是否会重试向源站发送的源站 HTTP 请求,以及在什么条件下重试。
  • 故障切换:确定 Media CDN 在第一个源不可用或返回特定状态代码时是否尝试连接到故障切换源。

来源超时

通过设置超时,您可以配置何时触发源重试和故障切换行为,以及何时触发后续客户端故障切换。

以下内容介绍了 Media CDN 支持的可配置超时:

  • connectTimeout 和 maxAttemptsTimeout 限制了 Media CDN 查找可用响应的时间。

    这两个超时时间都包括源返回标头以及确定是使用故障切换还是重定向所花费的时间。connectTimeout 针对每次来源尝试单独应用,而 maxAttemptsTimeout 包括所有来源尝试(包括故障切换和重定向)所需的连接时间。重定向后,系统会将其视为尝试连接到来源的额外次数,并计入为配置的来源设置的 maxAttempts。

    当 Media CDN 遇到非重定向响应(例如来自重定向源或故障切换源)时,系统会应用 readTimeout 和 responseTimeout 值。重定向的来源使用为遇到重定向的 EdgeCacheOrigin 配置的 connectTimeout、readTimeout 和 responseTimeout 值。

  • responseTimeout 和 readTimeout 用于控制流式回答的耗时。在 Media CDN 确定要使用上游响应后,connectTimeout 和 maxAttemptsTimeout 都不再重要。此时,readTimeout 和 responseTimeout 会生效。

无论每个 EdgeCacheOrigin 设置的 maxAttempts 是多少,媒体 CDN 最多会尝试连接所有来源四次。媒体 CDN 使用主 EdgeCacheOrigin 中的 maxAttemptsTimeout 值。每次尝试的超时值(connectTimeout、readTimeout 和 responseTimeout)是针对每次尝试的 EdgeCacheOrigin 进行配置的。

下表介绍了超时字段:

字段 默认值 说明
connectTimeout 5 秒

媒体 CDN 从开始向源发出请求到确定响应是否可用所用的最长时间。实际上,connectTimeout 涵盖的时间从创建请求开始,然后进行 DNS 查找,接着进行 TLS 握手、TCP/QUIC 连接建立,直到获取包含 HTTP 状态代码的响应标头。

超时值必须介于 1 秒和 15 秒之间。

maxAttemptsTimeout 15 秒

尝试连接到来源(包括故障切换来源)的最大总次数,达到此上限后,系统会向客户端返回错误。 如果达到超时限制,系统会先返回 HTTP 504 状态代码,然后再返回响应。

超时值必须介于 1 秒和 30 秒之间。

此设置用于定义所有来源连接尝试(包括故障切换来源)的总时长,以便限制客户端必须等待内容开始在线播放的总时长。系统只会使用第一个 maxAttemptsTimeout 值,其中第一个由为给定路线配置的来源定义。

readTimeout 15 秒

单个 HTTP 响应的读取之间等待的最大时长。 readTimeout 的上限为 responseTimeout。 所有 HTTP 响应读取操作都必须在 responseTimeout 设置的截止期限之前完成。超时值必须介于 1 秒和 30 秒之间。如果在响应完成之前达到此超时时间,系统会截断响应并记录日志。

responseTimeout 30 秒

允许完成响应的最长时长。

超时值必须介于 1 秒和 120 秒之间。

此时长从收到第一个正文字节时开始计算。如果在响应完成之前达到此超时时间,系统会截断响应并记录日志。

请参考以下示例:

  • Origin A 匹配对“/segments/”的请求,且 maxAttemptsTimeout 值为 5s、maxAttempts 值为 1、failover_origin 值为 Origin B。connectTimeout 值处于默认值 5s。如果您尝试连接到 Origin A,但由于 TLS 证书无效而在 1 秒内失败,那么您还有大约 4 秒的时间来成功连接到 Origin B。

  • Origin C 将请求与“/manifests/*”相匹配,maxAttemptsTimeout 值为 10s,maxAttempts 值为 3,且未配置 failover_origin。connectTimeout 值处于默认值 5s。 媒体 CDN 最多尝试连接到 Origin C 三次,允许最多 10 秒(maxAttemptsTimeout 限制)来建立成功连接。

重试来源请求

媒体 CDN 支持源站重试,从而允许重试针对源站的失败请求。您可以指定在尝试故障切换源(如果已配置)之前,可以针对当前源重试多少次。

  • 媒体 CDN 仅重试使用安全 HTTP 方法(GET、HEAD 或 OPTIONS)的请求。

  • 媒体 CDN 会尝试访问主源站,直到达到配置的 maxAttempts 值(默认值为 1)。

  • Media CDN 会重试来源连接,最多重试三次,如果重试失败,则会向用户返回 HTTP 502 Bad Gateway 错误。这包括任何故障切换源连接,这些连接计入 3 个连接的限制。

  • 配置源资源时,您可以使用 originAddress 字段配置主源,然后使用可选的 failoverOrigin 配置辅助源。failoverOrigin 指向另一个源资源。

每个来源的 retryConditions 用于指定哪些类型的故障会触发重试:

条件 默认 说明
CONNECT_FAILURE ✔️ 失败时重试,包括路由、DNS 和 TLS 握手错误以及 TCP/UDP 超时。
HTTP_5XX 重试任何 HTTP 5xx 状态代码。
GATEWAY_ERROR 与 5xx 类似,但仅适用于状态代码 502、503 或 504。
RETRIABLE_4XX 针对可重试的 4xx 状态代码(包括 409 和 429)进行重试。
NOT_FOUND 在 HTTP 404 状态代码上重试。
FORBIDDEN 在 HTTP 403 状态代码上重试。

如果您需要跨源进行主动健康检查、轮询或负载感知型转向,可以将外部应用负载平衡器配置为主源。

故障切换行为

仅针对使用较安全的 HTTP 方法(GET、HEAD 或 OPTIONS)的请求进行故障转移尝试。

下表介绍了故障切换的运作方式,以及客户端会观察到哪些响应:

场景 已配置故障切换 面向用户的状态
媒体 CDN 尝试连接到您的源,但在两次尝试后(默认)未收到任何 HTTP 响应。 否 HTTP 502 Bad Gateway
媒体 CDN 尝试连接到您的主源,但连接失败(TLS 握手错误)。系统会尝试连接到您配置的故障切换来源,但该来源返回 HTTP 404 错误。 是 HTTP 404 Not Found
媒体 CDN 尝试连接到您的主源站和故障切换源站,但未收到任何 HTTP 状态代码。 是 HTTP 502 Bad Gateway

如果 Media CDN 收到与任何已配置的 retryConditions 相匹配的状态代码(例如 HTTP 404 Not Found 或 HTTP 429 Too Many Requests 错误),并且后续的重试和故障切换源请求继续失败,则在源尝试次数用尽后,系统会向客户端返回 HTTP 502 Bad Gateway 错误。

源服务器故障切换最佳实践

为实现故障切换或负载均衡而配置多个来源时,请验证媒体内容和 Vary、ETag 及 Last-Modified 标头行为在各个来源之间是否一致。

最佳做法是,仅为可信且受您控制的来源配置来源重定向。请确保您信任重定向链中的每个来源,因为每个来源都会生成由您的 EdgeCacheService 提供的内容。

后续步骤