对象存储和 CDN 实现分析揭秘


分享对象存储和 CDN 联动的话题,一般来讲,公有云厂商提供对象存储的服务之外,还会附带一些增值服务,这些服务是适配不同的应用场景的。什么意思?对象存储本质上解决了海量存储的问题,但是数据不仅要可靠的存储,大部分情况还要处理才会有价值,所以一般公有云厂商还会有数据处理的服务,比如图像处理,类似缩略图,音视频转码,视屏截帧。其次,数据访问,也有特殊需求,比如一次上传,多次下载的场景,就配合使用 CDN 的服务,因为 CDN 的下载流量会比对象存储服务下载的成本要低。
什么是 CDN ?全称 Content Delivery Network,本质上是部署在各地的边缘服务器,提供数据的就近访问体验,并有效降低数据服务器后端压力。

从技术实现来讲,CDN 其实是后端服务器的缓存读代理。

1、使用姿势

示意图:

公有云厂商提供对象存储服务的同时,还会提供 cdn 服务,因为这两个服务都是一家,所以自然方便协同操作。

数据上传:

  1. 数据上传走对象存储服务的域名(endpoint);

数据下载:

  1. 数据下载可以走对象存储服务的域名;
  2. 也可以走 cdn 域名下载;

对象存储开启 cdn 之后,客户端使用 cdn 服务的域名请求数据。如果数据不在 cdn 服务,cdn 服务会自动使用对象存储 Bucket 域名回源,拉取数据到 cdn 的缓存下来。这样之后的压力全都卸载于 cdn 服务上。所以,从以上描述再一次体会:cdn 其实就是简单的后端存储服务的读代理。而如果业务要使用 cdn 的话,需要明确感知 cdn 服务的域名,对象存储的域名,将映射关系配置在 cdn 服务中(这一步其实是公有云厂商帮我们做好)。上传数据使用对象存储域名,读取数据使用 cdn 域名。

2、cdn 回源使用方案

一般,对象存储服务和 cdn 配合实现有三种解决方案:

  1. presign
  2. 授权读
  3. 公共读

2.1、presign

业务方申请 CDN 服务的资源,主要做如下配置CDN 域名与 Bucket 域名的映射关系。

但 presign 有个限制是只能使用 S3 V2 版本签名,因为cdn 回源时 host 会变,v4 版本签名会签 host,所以这种情况下签名校验会不通过。

2.2、授权方案

这个是更通用的方式,S3 的 Bucket 支持细粒度的权限分配,也就是 Policy 策略。它允许把各种操作权限分配给各种指定的对象。

业务方申请 cdn 服务的资源,配置两个(公有云厂商帮你搞定):

    提供CDN域名与Bucket域名的映射关系 业务和CDN之间的认证方式

并且,公有云厂商还会将业务方的 Bucket 授予 cdn 服务读权限。这样,当 cdn 未命中,cdn 回源,就可以使用自己的账号向对象存储服务请求数据(因为开启 cdn 的时候,已经通过 policy 授权给 cdn 了,所能读到数据)。

2.3、公共读方案

这个是一个特殊方案,通常不会这样操作。S3 的 Bucket 是可以配置成公共读,也叫做匿名访问。随便任何客户端直接 curl 都能得到数据,所以 cdn 自然也能得到数据。但这种方式可想而知,适用场景有限,因为数据安全是无法保证的。

3、方案对比

方案 预签名方案 授权方案 公共读方案 统计 cdn 回源流量 不支持 支持 不支持 签名方案 V2 版本的PreSign 不需要签名 不需要签名 授权 CDN 读权限(安全性) 不需要(高) 需要(中) 不需要(低)

经验分享 程序员 微信小程序 职场和发展