跳到主要内容

网站存储的平滑迁移方案

背景

网站的图片资源访问速度慢?网站存储服务需要扩容?网站的后端存储运维成本高?网站数据丢失?是时候把网站的存储迁移到云上了! 本文提供了一套最靠谱的网站存储上云方案,你可以不费吹灰之力、不停一秒服务地将网站的后端存储平滑迁移到对象存储之上,进而享受诸如弹性扩容、CDN加速、富媒体处理、防盗链等一系列优质服务。 现在就迁移吧!

概念介绍

为了理解如何实现平滑迁移,首先需要学习几个基本概念:

  1. 对象存储—— 提供高可用、高可靠、高可扩展的对象存储服务。你可以将任何非结构化数据,如图片、文档、音视频等存储到属于你创建的桶中
  2. 镜像存储 —— 网站平滑迁移的基础。将COS的一个桶的镜像存储源站设置为你的后端存储服务器后,当用户访问该桶的数据时,如果数据不存在,都将去镜像存储源站(即你的后端存储服务器)上抓取内容并返回用户,同时存储到COS的桶中。下一次再访问到该对象时,将不再需要去源站抓取,这样即实现了网站数据的平滑迁移。
  3. 域名绑定 —— 将一个特定的域名和对象存储的一个桶进行关联,通过将特定域名CNAME到COS的特定桶的域名,可以实现当访问该特定域名时,等价于访问COS的一个桶

这几个基本概念可能一时不好理解,不过接下来在我们介绍网站存储迁移的过程中,会再进一步说明这些概念。

迁移步骤

迁移背景

一个简化的网站架构如下图所示:

说明:

  1. 一个网站内部依赖包括存储服务器,其他服务器(如逻辑处理服务、数据库服务等)。在图1所示场景下,我们只讨论图片服务器(image servers)的平滑迁移方案;
  2. 假设由于存储容量、访问速度、运维成本等的考虑,网站管理员想要将图片服务迁移到第三方云存储服务上,期望可以带来更高的可靠性、更好的扩展性和更快的访问速度;
  3. 因此,一个基本的迁移方法是,将网站的数据迁移到第三方云存储服务,并将网站的读写操作也切到新的存储服务上,如图2所示:

然而这样简单的迁移方法存在问题:

  1. 当读写操作从mysite后端的存储服务器(源站:image servers)迁移到第三方云存储服务器(新站:cloud storage service)时,为了保证服务的可用性,至少需要保证所有的数据都已经从源站迁移到了新站,而对于一个持续写入的系统来说,这点是很难做到的,即在读写操作切到新存储的瞬间(可能持续几十秒到几分钟),需要暂停源站的写服务并等待所有数据迁移完成,这对网站的可用性会带来一定的影响;
  2. 读写迁移到新存储的操作不容易回滚,如果发现问题再回滚,新站和源站可能都存在用户已经写入的数据,这种一致性问题并不容易解决;
  3. 如果网站的图片文件的链接对用户暴露,例如,用户的手机客户端需要访问image.mysite.com/image1.jpg这张图片,则即使完成了数据迁移,同样的URL也无法访问到对应的图片;
  4. 需要网站维护人员实现数据迁移工具,而对于数据不断更新与变化的场景,这种迁移工具并不容易实现;
  5. ……

为了解决以上种种问题对象存储推出了镜像存储与域名绑定功能,可以实现网站静态数据平滑迁移到COS中

开始使用对象存储

进行数据迁移的第一步,即申请使用对象存储系统:

  1. 注册并登录
  2. 在“对象存储”服务创建Bucket

概念说明

  • 对象(Object)—— 对象是存储在COS中的基本数据单位,用户的每个文件都是一个Object,单块上传接口每个文件最大500M。大于500M的文件使用大对象分块上传接口,最多可达10000个分块。Object包含Key、Data和MetaData。其中,Key是Object的名称,在桶内唯一标识一个对象;Data是Object的数据;MetaData是对该Object的描述信息。
  • 桶(Bucket)—— 桶是对象的容器,桶名全局唯一,通过桶名和对象名可以唯一定位到具体资源。COS允许每个用户最多创建10个桶,而桶里面的对象个数无限制。

设置镜像存储

举例,假设用户创建了名为bucket1的桶,在Bucket管理的桶设置页面,可以设置桶的镜像回源地址为image.mysite.com,则此时的系统状态如下图所示:

注意:此时mysite的读写操作并没有迁移到COS上,因此对于mysite来说,到目前为止的所有操作对其服务没有任何影响。

在完成桶的镜像存储源站设置后:

  1. 若用户访问image.mysite.com/image1,则直接去源站图片服务器读取数据
  2. 若用户访问bucket1.cos-cn-guangzhou.chinac.com/image1,则请求发送到COS对应的桶中。此时COS的逻辑是:
    1. 检查COS的桶中是否有image1的对象
    2. 若对象存在,则直接返回给用户,否则继续执行
    3. 根据桶bucket1源站配置,去其对应的源站image.mysite.com/image1读取数据并返回给用户,同时将该对象异步迁移到COS对应的桶中(这样用户下次再访问到该数据时,即不需要去源站抓取)

因此对于用户来说,image.mysite.com/image1 和 bucket1.cos-cn-guangzhou.chinac.com/image1 这两个URL是等价的,可以访问到一样的数据。这既是镜像存储的概念。

然而现在还有一个问题并没有解决,即用户期望的最终结果通常是,可以直接通过访问image.mysite.com/image1这个域名,将请求直接发送给COS对应的桶,并实现数据的平滑迁移。为了实现这种用户完全无感知的迁移方案,需要依赖COS的域名绑定功能。

设置域名绑定

在Bucket管理的桶设置页面,设置桶的域名绑定为www.mysite.com

注意:如果你有设置域名绑定的需求,则必须为存储源站再申请一个迁移域名(如图5中的image2.mysite.com),并设置桶的镜像回源地址为迁移域名(如图5中Bucket1的回源地址设置为image2.mysite.com)

在完成桶的域名绑定设置后:

  1. 对于COS来说,当看到Host: www.mysite.com 的请求后,会默认把它定向到bucket1.cos-cn-guangzhou.chinac.com;
  2. 若在客户端配置Host文件,即设置 www.mysite.com 直接访问到COS的前端服务器(114.67.58.99),即可马上验证域名绑定的效果。此时若用户访问 www.mysite.com/image2 ,请求将直接发送到COS前端,并根据域名绑定的映射规则,定向到bucket1.cos-cn-guangzhou.chinac.com进行处理;再根据镜像回源的设置,在桶中对象不存在时进行对象的迁移。

到此刻为止,整个系统的设置对源站依然没有任何影响,而如果要验证整个迁移系统的有效性,只需要简单的设置Host文件即可。

CNAME

在完成了迁移逻辑的验证后,管理员只需要像域名管理服务器中添加新的CNAME记录,例如: CNAME image.mysite.com bucket1.cos-cn-guangzhou.chinac.com

这样,等域名全网生效后,所有的用户再访问image.mysite.com时,请求会直接发送到bucket1.cos-cn-guangzhou.chinac.com,并按照对应的逻辑迁移数据。

其他说明

1. 什么时候可以将写操作迁移到COS?

只要完成了域名绑定的CNAME过程并在域名全网生效后,即可将写操作迁移到COS上,这个过程也不会对用户产生任何影响。

2. 什么时候可以下线源站存储服务器?

由于镜像迁移是被动迁移,即当用户访问时才做迁移,为了保证所有数据均可以访问,需要对源站数据做一次主动的完整迁移之后才能下线源站存储服务器,不过该过程也不会对用户的访问产生影响。