概览
Media CDN 是 Google Cloud 的媒体分发解决方案,是对 Cloud CDN 的补充。相比于 Cloud CDN 的网络加速解决方案,Media CDN 针对高吞吐量业务负载进行了优化,例如流媒体视频和大文件下载。
Media CDN 已覆盖全球200多个国家和地区,边缘节点分布在1300多个城市。Media CDN 的边缘缓存节点位于合作伙伴或运营商内部,存储更靠近终端用户的内容。Media CDN 使用 Google 的全球边缘缓存基础设施来为客户的内容提供尽可能靠近终端用户的服务。 通过使用 Google 的基础架构来提供内容缓存,可以降低用户源站基础架构的负载。

Media CDN 支持通过 HTTP/HTTPS 方式对用户源站进行内容获取,无论用户源站是在 Google Cloud 的云存储,其他公有云或是用户自己的数据中心中。 Media CDN 支持灵活的 URI 路由缓存策略,可以针对内容类型,客户端属性等定制缓存策略。
本文通过一个视频点播 VOD 服务通过 Media CDN 加速的场景,来演示如何在 Google Cloud 平台上快速部署一套 Media CDN 服务。

视频源站部署
本章节演示如何使用 Transcoder API 对视频源文件进行处理,并作为 Media CDN 的源站。
gcloud services enable transcoder.googleapis.com |
创建两个 GCS 存储桶,一个用于存储视频源文件,一个用于存储转码后用户 Media CDN 视频分发的源站。
gsutil mb gs://videos-to-be-processed-infoq gsutil mb gs://video-cdn-origin-infoq |
使用 Mango 项目中的 Tears of Steel 作为源文件进行测试,并上传到 GCS 存储桶中
curl http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/TearsOfSteel.mp4 \\ --output TearsOfSteel.mp4
gsutil cp ./TearsOfSteel.mp4 gs://videos-to-be-processed-infoq |
创建 service account
gcloud iam service-accounts create transcoder-sa \\ --description="Service account for the transcoder API" \\ --display-name="transcoder-sa" |
替换 $project_id 为当前 Project ID 进行授权
gcloud projects add-iam-policy-binding $project_id \\ --member="serviceAccount:transcoder-sa@$project_id.iam.gserviceaccount.com" \\ --role="roles/transcoder.admin" |
使用 Transcoder API 进行转码处理
gcloud transcoder jobs create \\ --location=us-west1 \\ --input-uri="gs://videos-to-be-processed-infoq/TearsOfSteel.mp4" \\ --output-uri="gs://video-cdn-origin-infoq/transcoder-output/TOS/" |
转码成功后,Transcoder API 会生成以下视频文件。注意 GCS 存储桶为 Not Public.

需要单独为 Media CDN 回源 GCS 私有桶进行 service account 的授权,将 PROJECT_NUM 替换为当前项目,BUCKET 替换为 video-cdn-origin-infoq
gsutil iam ch serviceAccount:service-PROJECT_NUM@gcp-sa-mediaedgefill.iam.gserviceaccount.com:objectViewer gs://BUCKET |
TLS证书部署
本章节演示使用 Google Certification Manager(CCM) 进行 SSL 证书生成。我们将为测试域名 infoq.yinghli.cn 生成 SSL 证书,并准备部署在 Media CDN 上
gcloud services enable certificatemanager.googleapis.com |
CCM 支持使用 DNS 授权认证方式对域名所有者进行认证。创建 DNS 授权记录,并将结果配置在 DNS 的 CNAME 记录中,便于后续认证使用
gcloud certificate-manager dns-authorizations create infoq \\ --domain="infoq.yinghli.cn" |
在 DNS 服务中,配置 _acme-challenge.infoq.yinghli.cn 对应的 CNAME 记录
创建 SSL 证书,并使用 DNS 进行认证
gcloud certificate-manager certificates create infoq-yinghli-cn \\ --domains="infoq.yinghli.cn" \\ --dns-authorizations="infoq" \\ --scope=EDGE_CACHE |
等待一段时间,确保证书状态为 Authorized,并记录下证书名称用于在 Media CDN 中部署
gcloud certificate-manager certificates describe infoq-yinghli-cn |
Media CDN 部署
部署源站。配置 GCS 私有桶为 Cloud CDN 源站
gcloud edge-cache origins create infoq-origin \\ --origin-address="gs://video-cdn-origin-infoq" |
针对不同类型的文件,制定不同的 CDN 策略,例如
针对所有缓存策略,均返回 x-cache-status 和 x-cache-id HTTP 头标识缓存状态
部署 TLS 证书并配置实时采集日志
根据以上需求,配置参考 yaml 文件“infoq.yaml”
name: infoq-demo edgeSslCertificates: - projects/$project-id/locations/global/certificates/infoq-yinghli-cn routing: hostRules: - hosts: - infoq.yinghli.cn pathMatcher: path-matcher-0 pathMatchers: - name: path-matcher-0 routeRules: - priority: '1' matchRules: - pathTemplateMatch: /**.ts - pathTemplateMatch: /**.m4s origin: infoq-origin headerAction: responseHeadersToAdd: - headerName: x-cache-status headerValue: '{cdn_cache_status}' - headerName: x-cache-id headerValue: '{cdn_cache_id}' routeAction: cdnPolicy: cacheMode: FORCE_CACHE_ALL clientTtl: 3600s defaultTtl: 3600s cacheKeyPolicy: {} signedRequestMode: DISABLED - priority: '2' matchRules: - pathTemplateMatch: /**.m3u8 - pathTemplateMatch: /**.mpd origin: infoq-origin headerAction: responseHeadersToAdd: - headerName: x-cache-status headerValue: '{cdn_cache_status}' - headerName: x-cache-id headerValue: '{cdn_cache_id}' routeAction: cdnPolicy: cacheMode: FORCE_CACHE_ALL clientTtl: 10s defaultTtl: 30s cacheKeyPolicy: {} signedRequestMode: DISABLED - priority: '3' matchRules: - prefixMatch: / origin: infoq-origin headerAction: responseHeadersToAdd: - headerName: x-cache-status headerValue: '{cdn_cache_status}' - headerName: x-cache-id headerValue: '{cdn_cache_id}' routeAction: cdnPolicy: cacheMode: FORCE_CACHE_ALL defaultTtl: 86400s cacheKeyPolicy: {} signedRequestMode: DISABLED logConfig: enable: true sampleRate: 1.0 |
将 yaml 文件上传部署到 Media CDN 上
gcloud edge-cache services import infoq-demo --source=infoq.yaml |
部署成功后,通过命令获取 Media CDN IP 地址,并配置在 DNS 上
gcloud edge-cache services list |
部署验证
终端上通过 curl 命令多次访问查看不同文件缓存效果
curl -svo /dev/null https://infoq.yinghli.cn/transcoder-output/TOS/manifest.m3u8 |
第一次访问,回源获取文件,并显示回源路径
< date: Fri, 10 Mar 2023 06:27:24 GMT < last-modified: Fri, 10 Mar 2023 02:17:07 GMT < age: 0 < x-content-type-options: nosniff < x-cache-status: sin; stale,sin-112074fd; miss,hkg; miss,hkg-99312837; miss, hkg;miss < x-cache-id: aGtnLWVkZ2UtY3gwMS1oa2cwNw < cache-control: public,max-age=10 |
第二次访问后,cache-status 显示为 hit
< x-cache-status: hkg;hit < x-cache-id: < date: Fri, 10 Mar 2023 06:27:24 GMT < age: 14 < last-modified: Fri, 10 Mar 2023 02:17:07 GMT < etag: "f88ceb1ca5c1c93ed22d60b9cf4878a9" < content-type: application/vnd.apple.mpegurl < cache-control: public,max-age=10 |
通过开启 Media CDN 的日志,还可以获取更多信息。例如客户端所在城市,IP 地址,对应运营商等信息,日志中还包括了 TTFB 和访问延迟等信息,例如:
cacheId: "hkg"
cacheMode: "FORCE_CACHE_ALL"
cacheStatus: "hit"
clientAsn: "41264"
clientCity: "Beijing"
clientRegionCode: "CN"
httpTtfb: "0.002038480s"
latency: "0.002107814s"
metroIataCode: "HKG"
origin: "infoq-origin"
proxyRegionCode: "HK"
tlsVersion: "TLS 1.3"
丰富的实时日志内容,与 Google Cloud 强大的数据分析服务的整合,可以为用户提供深度可视化定制服务,敬请期待下期介绍