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

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

什么是 CDN ?全称 Content Delivery Network,本质上是部署在各地的边缘服务器,提供数据的就近访问体验,并有效降低数据服务器后端压力。

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

1、使用姿势

示意图:

a14a08d7986890b6f88ebf2d889cad23.png

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

数据上传:

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

数据下载:

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

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

2、cdn 回源使用方案

cdn 在用户请求不命中的时候,需要回源后端拉取数据。那么不知道大家有没有思考过,cdn 使用什么样的方案才能正确的满足授权获取数据呢?(因为 S3 协议是有权限校验的,也就是数字签名,S3 v4 协议会把 host 签在数字身份校验中,也就是说,cdn 是无法直接转发的)。

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

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

2.1、presign

presign 也叫预签名。这种方案是客户端把签名完全准备好,所有的签名元素和校验全都在 query url 里面。cdn 这种场景下真的就是做一个纯转发代理。

业务方申请 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 读权限(安全性) 不需要(高) 需要(中) 不需要(低)

坚持思考,方向比努力更重要。关注公众号:奇伢云存储,获取更多干货。 关注我公众号, 获取更多干货