标签:
作为云计算的核心服务之一,存储服务是每个用户都会用到的。不过当前的现状是:大部分客户除了虚拟机的数据盘(持久盘)之外,并没有充分的利用存储服务。我们来看一个典型的应用场景:例如某Web应用系统需要用户上传发票扫描件(图像文件)。在代码实现层面,通常会将用户上传的图像文件直接保存到磁盘文件系统里面。在传统的物理服务器部署环境中,这是具备最高性价比的实现方式,而且也不妨碍实现高可用——多个物理服务器可以共享一个存储设备(SAN/NAS)。但是在公有云环境中,这种设计却不再适用,因为公有云通常没有供类似SAN/NAS的共享存储设备。当然Azure和AWS分别发布了File Service和EFS服务,但是:
为了在不修改代码的情况下实现所谓的“平滑迁移”,因此出现了一个非常不靠谱的“腻子”方案:开一个虚拟机运行NFS服务为其他实例(虚拟机)提供共享存储服务。很明显,这个运行NFS服务的虚拟机是个单点——如果这个虚拟机挂了,其他依赖共享存储的实例和应用也全部完蛋!既然这样,那我们就给运行NFS的虚拟机也做个高可用吧,这样不就高枕无忧了嘛。且慢,用至少2个虚拟机提供共享存储服务,去掉部署和维护成本不说,2个虚拟机的成本是明摆着的!所以经常有客户抱怨说把应用迁移到公有云上还不如运行在自己的数据中心划算。
面对这种情况,最理想的解决方案是:使用公有云的存储服务替代共享存储设备,即:把用户上传的文件写入/保存到存储服务中,而不是磁盘文件系统里面,以此摆脱对共享存储设备的依赖,降低成本,提升应用系统整体的可用性和可扩展性!
别骗我,这个方案要修改代码的!没错,代码肯定是要修改的,不过:
上述理由看起来是完全合理的,还是还有一个问题,因为使用了特定的公有云存储服务,那么会不会导致被某个公有云提供商“绑架”呢?其实这个问题完全不需要担心的:
这里推荐一个开源的项目:s3proxy,项目地址:https://github.com/andrewgaul/s3proxy
这个项目的亮点在于,能够让开发者使用S3 API访问其他的云存储服务!目前这个项目已经支持Azure Blob,Google Cloud Storage和OpenStack Swift等主流的云存储服务。在微软Build 2016大会上,还有一个通过s3proxy访问Azure Blob的现场演示。不过目前这个项目的问题是默认不支持AWS中国版和Azure中国版。由于s3proxy底层依赖Apache jclouds,因此要增加对AWS中国版和Azure中国版的支持,就需要对jclouds进行修改(其修改的细节部分不在本文中进行一一描述)。
s3proxy的本质是在本地提供了一个基于jetty的web服务,通过本地的web服务将aws s3的api调用请求转发到其他对应的云存储服务上(或者说是将aws s3 api调用翻译成其他云存储服务的api调用)。甚至可以通过aws s3的api来访问本地文件。因此,s3proxy在使用时需要定义一个本地的临时文件夹来作为文件中转。
由此看来,进行一次代价很小的代码修改,就能充分利用到公有云的特性,这样做还是非常值得的。当然也有一种情况是很令人郁(wu)闷(jie)的:由于现有应用系统的开发团队解散了,或者现有应用系统的供应商倒闭/跑了/不提供维护了,导致无法对代码进行修改!这种情况我还真遇到过,而且并不在少数!
标签:
原文地址:http://www.cnblogs.com/hunterxue/p/5441203.html