跨云应用部署:在云存储服务之间复制文件
在上一篇中,我们介绍了如何使用云存储服务代替传统的共享存储设备。如果我们大量的使用了云存储服务,就不可避免的要在多个云存储服务之间复制、共享、迁移或者同步数据。这里说的多个云存储服务包括跨不同供应商的云存储服务。
首先我们来看一下Azure的存储服务。
- Azure的存储服务是以存储账号(Storage Account)为单位进行管理的。
- 一个存储账号可以理解为一个虚拟盘柜。
- 存储账号可以分布在不同的数据中心。
- 每个存储账号有一个唯一的URL。
- 每个存储账号都拥有独立的主、从两个Access Key。
每一个存储账号中可以创建一个或者多个容器(Container),但是Container的层级只有一层。存放在Azure存储服务中的每一个文件都对应一个唯一的URL地址,包括虚拟机的系统盘和数据盘都是以.vhd文件的形式存放在存储账号的容器里面的。
Azure支持在存储账号之间进行Server to Server的数据复制,即:要复制的文件不会经过发出复制命令的计算机进行中转,无论source和destination是否在同一个数据中心,甚至可以在Azure中国版和Azure国际版的存储服务之间直接进行数据复制!我试过从Azure东亚或者东南亚的数据中心往Azure中国的北京数据中心复制文件,速度通常可以轻松达到60~100Mbps!除了正常的业务数据迁移,我经常用这个方法从Azure国际版往Azure中国版上搬镜像,或者在Azure国际版上下载大型软件安装包(就像SAP这种动辄10几20几个GB的)然后再搬回国内使用。
附上从Azure国际版往Azure中国版复制文件的示例命令和参数:
azcopy /source:https://[存储账号名称].blob.core.windows.net/[容器名称] /sourcekey:[主访问密钥] /dest:https://[存储账号名称].blob.core.chinacloudapi.cn/[容器名称] /destkey:[主访问密钥] /pattern:[文件名]
接下来我们再看一下AWS的存储服务。
AWS S3可谓是公有云存储服务的鼻祖,其API基本上已经成为业界事实上的标准,一批后来者都或多或少的借鉴了AWS S3的设计和实现思路。
- AWS S3以存储桶(bucket)为单位对存储资源进行管理。
- 存储桶可以分布在不同的区域(region)。
- 在一个存储桶中,可以创建多层目录。
- 存储桶中每一个文件都对应一个唯一的URL。
- AWS S3支持完善的权限和访问策略机制。
AWS S3只是一个对象存储服务,虽然不像Azure的存储服务那样包罗万象(blob,table,queue...),但是足够精专。AWS S3也没有被用于存放虚拟机的磁盘文件。通过使用AWS CLI,我们可以在不同的bucket之间复制文件,其复制过程也是Server to Server模式的。但是我们无法在AWS国际版的bucket和AWS中国版的bucket之间进行Server to Server的文件复制。究其原因,个人认为主要是因为AWS S3没有为bucket提供独立的Access Key,而AWS中国版和AWS国际版的endpoint与IAM也是完全独立的,并且AWS CLI也不支持在同一条命令中使用两个不同的credential和endpoint。
AWS S3在bucket级别提供了跨区域复制同步,但是所能跨的区域只是国际版的区域,不包括中国区。另外,在AWS中国版的EC2上访问AWS国际版S3上的文件,其传输速度和普通的家用、商用网络没有任何区别——都是忽快忽慢,而且还经常出现超时、无法访问的情况。不过AWS中国版和Azure中国版、AWS国际版和Azure国际版之间的互访速度还是非常快的。
通过上述介绍,我们不难得出这样一个结论,在AWS S3和Azure存储服务之间迁移(复制)数据,也只能是先从一方下载,再上传到另一方了。的确这是一个没有什么太多技术含量的实现方案,但是通过一些最佳实践和技巧,再配合适当的辅助工具,对数据迁移质量和效率而言,还是有很大提升空间的。
- 建议“远端下载,本地上传”。例如:要从Azure往AWS上迁移数据,那么就先把Azure上的数据下载到AWS的虚拟机上,然后再上传到AWS S3。因为对下载过程进行数据校验和纠错(重传)比上传过程更容易实现而且效率高。
- 大批量的数据迁移如果在没有时限要求的情况下,尽量避开高峰时段,以确保能获取到足够大的网络带宽资源在更短的时间内完成数据迁移。
- 可以启动多个下载/上传进程并行的对不同的存储容器(container或者folder)进行上传和下载操作。
- 充分利用实例级存储(非持久盘)作为文件中转的临时目录。
- 编写批量上传/下载脚本时,尽量详细的记录日志。以备核对与排查错误。
这里推荐一个在Azure存储服务和AWS S3之间做数据迁移的开源工具:AzureCopy,这是一个C#写的工具,而且已经提交到NuGet库中。源代码在GitHub上。除了作为普通的命令行来使用,还可以在自己开发的项目中调用相关的功能。老规矩,我们首先要做的就是让它支持AWS中国版和Azure中国版。这里不得不吐槽一下Azure SDK的设计还是欠点火候的——同样是.net/C#的SDK,我只添加了一行代码,AzureCopy就能支持AWS中国版了,而支持Azure中国版却修改了好几个方法,同时还花了一两个小时的时间来进行调试!
修改完成,我们就可以使用如下的命令在Azure中国版和AWS中国版之间复制文件啦(credential是写在配置文件中的):
.\azurecopy.exe -i https://xhttestsa1.blob.core.chinacloudapi.cn/myc-1/music-1.mp3 -o https://s3.cn-north-1.amazonaws.com.cn/test-pub/
需要注意的是:AzureCopy也是需要在本地进行文件中转的。所以如果要复制大型文件,请在Azure或者AWS的虚拟机上使用这个工具。