借助媒体 CDN,您可以从源站基础架构提取内容,无论内容是托管在 Google Cloud中、其他云平台中还是本地。
每个配置都可以关联一个或多个来源。源站配置会告知 Media CDN 如何连接到您的基础架构,何时以及如何进行故障转移、重试和超时,以及在连接时使用什么协议。
来源具有以下特征:
- 来源可以按主机和按路由定义,这使得单个
EdgeCacheService资源可以映射到多个来源,这些来源包含清单、视频片段和其他静态内容等。 - 可以通过 HTTP/2、HTTPS 和未加密的 HTTP/1.1 访问来源。
- 您可以配置防火墙规则,以仅允许特定的 Google IP 地址,这样只有 Media CDN 可以访问您的源。
- 重试和故障切换行为是按来源配置的,可让服务在出现严重错误(例如连接失败)时进行故障切换,或根据 HTTP
404 Not Found或 HTTP429 Too Many Requests响应进行重试。 - 通过将外部应用负载平衡器配置为 Media CDN 后面的来源,可以访问 Google Cloud 内部或本地的私有资源。
- 重定向跟踪行为是按来源配置的。您可以启用 Media CDN 以跟踪重定向到其他源服务器。
来源要求
如需允许媒体 CDN 缓存大于 1 MiB 的源站响应,源站必须在 HEAD 和 GET 请求的响应标头中包含以下内容,除非另有规定:
Last-Modified或ETagHTTP 响应标头(一种验证器)。- 有效的 HTTP
Date标头。 - 有效的
Content-Length标头。 - 针对
Range GET请求的Content-Range响应标头。Content-Range标头必须具有采用bytes x-y/z格式(其中z是对象大小)的有效值。
默认源协议为 HTTP/2。如果源站仅支持 HTTP/1.1,您可以为每个源站明确设置协议字段。
源站防护
媒体 CDN 提供深度分层的边缘基础架构,旨在尽可能主动减少缓存填充。
缓存基础架构主要分为三个层:
- 深层边缘缓存,用于在服务提供商的网络内传送大部分流量并分流。
- Google 的对等互连边缘,可连接到数千个 ISP,充当边缘缓存的中层缓存;如果特定 ISP 中没有边缘缓存,则充当面向用户的缓存。
- Google 网络中位于来源之前的长尾缓存,其他下游缓存会从这些缓存中填充内容。这些缓存支持大量扇入,具有充足的缓存存储容量,并充当源防护。
此拓扑的概览如下所示:
Media CDN 默认使用一组有限的关键全球位置提供源站防护。默认源屏蔽功能根据最终用户的位置(而非源的位置)运行。当最终用户和源服务器位于同一区域时,以及当全球源服务器位于多个区域时,这种方式效果很好,可带来显著的分流优势。
灵活防护
如果您的来源集中在一个区域,但用户分布在全球各地,那么基于用户位置信息的默认来源屏蔽行为可能会在以下方面表现欠佳:
- 当默认 Shield 位置在地理位置上距离集中式源较远时,增加缓存未命中的延迟时间
- 通过将缓存填充请求分散到多个全球默认屏蔽位置(而不是集中到单个位置)来减少源站分流
灵活的源屏蔽功能可帮助您克服这些限制,方法是为源屏蔽配置单个特定地理区域,通常选择靠近集中式源的区域。然后,灵活的屏蔽会通过位于配置区域内或附近的屏蔽缓存来路由所有缓存填充请求。这样一来,通过这些以区域为中心的缓存,负载会整合到您的源站。
通过在与集中式源站相同的地理区域中配置灵活防护区域,您可以优化以下方面:
- Shield 层的缓存命中率
- 来源分流
- 缓存未命中和不可缓存内容的延迟时间
- 性能稳定性
灵活防护与媒体 CDN 中配置的任何源站类型都兼容。
请求折叠
请求折叠将针对同一缓存键的多个用户发起的缓存填充请求主动折叠为每个边缘节点的一个源站请求。
所有缓存层都支持请求折叠(或合并),以进一步减少源站负载。基于大规模的实际工作负载:
- 超过 95% 的缓存填充使用区域内的专用长尾缓存节点,以降低缓存填充费用和延迟时间。
- 来源与 Google 自己的边缘基础设施之间的缓存填充完全通过 Google 的全球专用骨干网进行,这可缩短缓存填充延迟时间并提高可靠性,这两项优势都可有效提升直播工作负载的性能。
- 缓存在有利的情况下会相互交叉填充,从而进一步降低缓存填充率。
- 媒体 CDN 在各个缓存中都具有充足的存储容量,即使对于长尾的冷门内容,也能最大限度地降低逐出率。
客户看到的分流率可能会有所不同,具体取决于其缓存配置、用户负载、工作负载(例如直播与点播)、用户分布以及他们向不同区域的用户提供多少长尾内容(总语料库大小)。
与源站屏蔽相结合,请求折叠可进一步减少源站负载和出站带宽需求,并且是媒体 CDN 的默认行为。
折叠的请求会记录面向客户端的请求和(折叠的)缓存填充请求。折叠会话的标头用于发出源站填充请求,这意味着源站只能看到该客户端的标头(包括 User-Agent)。
无法合并缓存键不同的请求。
来源连接
以下部分介绍了媒体 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 是多少,Media CDN 最多会尝试连接所有来源四次。媒体 CDN 使用主要 EdgeCacheOrigin 中的 maxAttemptsTimeout 值。每次尝试的超时值(connectTimeout、readTimeout 和 responseTimeout)是针对每次尝试的 EdgeCacheOrigin 进行配置的。
下表介绍了超时字段:
| 字段 | 默认 | 说明 |
|---|---|---|
| connectTimeout | 5 秒 | 从开始向源服务器发送请求到 Media CDN 确定响应是否可用,Media CDN 可以花费的最长时间。实际上, 超时值必须介于 1 秒和 15 秒之间。 |
| maxAttemptsTimeout | 15 秒 | 尝试连接到来源(包括故障切换来源)的最大总次数,达到此上限后,系统会向客户端返回错误。
如果达到超时限制,系统会先返回 HTTP 超时值必须介于 1 秒和 30 秒之间。 此设置用于定义所有来源连接尝试(包括故障切换来源)的总时长,以便限制客户端必须等待内容开始在线播放的总时长。系统只会使用第一个 |
| readTimeout | 15 秒 | 单个 HTTP 响应的读取之间等待的最大时长。
|
| 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 会尝试访问主源站,直到达到配置的
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 状态代码上重试。 |
如果您需要跨源站进行主动健康检查、轮询或负载感知型转向,可以将外部应用负载平衡器配置为主源站。
故障切换行为
下表介绍了故障切换的运作方式以及客户端会观察到的响应:
| 场景 | 已配置故障切换 | 面向用户的状态 |
|---|---|---|
| 媒体 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 传送的内容。