概览

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 策略,例如

  • 视频 ts 和 m4s 文件,设定缓存时间为3600秒

  • m3u8 和 mpd 文件,设定缓存时间为30秒

  • 其他文件,设定缓存时间为86400秒

针对所有缓存策略,均返回 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 强大的数据分析服务的整合,可以为用户提供深度可视化定制服务,敬请期待下期介绍


相关推荐