对象存储OSS与阿里云CDN服务结合,可优化静态热点文件下载加速的场景(即同一地区大量用户同时下载同一个静态文件的场景)。您可以将OSS的存储空间(Bucket)作为源站,利用阿里云CDN将源内容发布到边缘节点。当大量终端用户重复访问同一文件时,可以直接从边缘节点获取已缓存的数据,提高访问的响应速度。

传统动静不分离的产品架构,其性能会随着系统访问量的增长而受到限制甚至遭遇瓶颈。产品架构如下图所示。

利用CDN和OSS实现动静分离,灵活的架构可以支持海量用户访问。产品架构如下图所示。

适用场景

  • 静态文件访问量大,服务器负载高,I/O问题导致用户访问卡顿。
  • 静态文件数量大,服务器存储空间不够。
  • 静态文件用户访问分布在各地,同一个地区客户,会成千上万次重复下载同一文件。

架构描述

OSS作为海量文件存储源,静态图片、视频文件、下载包、App更新包等均存放在OSS上。OSS作为CDN的源站,通过CDN加速分发,用户通过CDN节点就近获得文件。架构优势:

  • 降低Web服务器负载,静态文件访问负载全部通过CDN。
  • 存储费用最低,OSS的存储费用仅为ECS磁盘费用的50%。
  • 海量存储空间,无需考虑存储架构升级。

实战案例

以一个常见的Web站点为例。www.acar.com是一个刚建立的汽车资讯车友交流网站。主站用Php搭建,有10GB的图片素材和部分JS文件。目前购买一台ECS放置所有程序代码,并在ECS上安装MySQL数据库。随着用户访问量的不断增长,不少用户反映,访问网站的速度越来越慢,图片加载慢,网站响应慢。网站技术人员也发现用户上传的图片越来越多,快超过 1TB了。

对于以上案例我们可以利用OSS和CDN对网站进行架构优化,实现动静分离的产品架构,提升用户访问体验,同时成本也在可控的范围内。

解决方案及步骤如下:
  1. 对ECS上的网站程序进行整理,把动态程序部分和静态部分分不同的目录进行管理。
    • 建立Images目录,放置所有网站高清素材图片。
    • 建立Javascript目录,放置所有的JS脚本。
    • 建立Attachment目录,放置所有用户上传的图片和附件。
  2. 新建一个Bucket。

    根据您的ECS所在的区域选择Bucket所在区域,权限选择公共读,Bucket名称与ECS上新建的目录的名称对应,例如“acar-image-bucket”。具体操作请参见创建存储空间

  3. 绑定域名image.acar.com并进行CDN加速。具体操作请参见绑定 CDN 加速域名
  4. 上传文件,体验加速效果。
    1. 将ECS实例的Images目录下所有图片文件上传到acar-image-bucket。具体操作请参见上传文件
    2. 获取该文件的CDN加速的访问地址,通常为加速域名/文件名路径的格式。具体操作请参见上传Object后如何获取访问URL
  5. 按照前4步的示意,分别建立acar-js-bucket和acar-csimages-bucket两个Bucket,开启CDN加速,并将ECS实例上另外两个文件也上传至对应Bucket。
  6. 在原本ECS系统中,找到原本访问静态文件的代码,把访问URL修改为CDN加速域名。以后用户访问您的网站的静态文件就全部通过OSS+CDN的方式访问,不再占用您ECS的资源。
    说明 如果您想把用户上传的文件自动同步到acar-csimages-bucket中,您可以参考OSS相关SDK和API的PutObjcet部分,实现代码级别自动上传。

CDN缓存自动刷新

如果您使用了阿里云的CDN并绑定了加速域名回源到OSS,您就可以使用OSS的CDN缓存自动刷新功能。当OSS上的文件发生变动时,OSS会主动刷新CDN的缓存文件,用户不需要显式调用CDN的刷新接口。

例如您绑定的加速域名是image.acar.com,如果这个域名绑定的Bucket覆盖上传了一个文件test.jpg,则OSS会刷新掉image.acar.com/test.jpg这个URL,刷新生效的时间以CDN保证的刷新生效时间为准,一般在十分钟以内。

CDN缓存自动刷新的开启方式请参见开启CDN缓存自动刷新