APP下载

一种基于Swift云存储组件的冗余去重方法

2018-01-15徐骁夏敏张鹏陈洁张照星

现代计算机 2017年34期
关键词:网盘副本集群

徐骁,夏敏,张鹏,陈洁,张照星

(1.公安部户政管理研究中心,北京100070;2.北京大学软件与微电子学院,北京102600)

0 引言

随着互联网应用的发展,每天都会产生海量的用户数据,如何快速、高效地处理和存储这些数据成为大数据时代的研究重点。为解决海量数据的存储与处理的难题,云存储技术应运而生。文献[1-5]的研究发现:当前的主流云存储架构中,为确保数据安全,云存储系统会为每一个数据块复制出多个副本,并将这些的副本分散存储在不同的物理节点,即可确保某一节点上的数据块失效时,集群中的其他节点仍有该数据块的有效副本,从而保证数据安全。

网盘是各类云存储技术应用中非常重要且越来越普及的一种应用形式。在网盘的使用过程中难免会出现如下场景:两个用户先后上传了相同的文件;用户将别人分享的文件转存到自己的网盘。这时如果网盘直接使用云存储接口,那么云存储集群中就会存在相同的文件副本。当用户上传的相同文件越来越多、分享越来越多,云存储集群中必将产生大量的冗余副本。原本用于确保数据安全的副本变成了占用大量存储资源的累赘。不仅如此,相同文件的重复传输会占用大量的网络带宽,冗余副本在集群中负载均衡会消耗计算资源。因此在使用云存储组件开发网盘类应用时,要对重复上传的文件进行处理。

高校的教堂管理系统往往需要集成课件上件下载功能,因此产生重复文件的机会大大增加。针对这个问题作者在将Swift云存储组件应用到课件管理子系统中时提出了一种对冗余文件去重的方法。

1 背景介绍

1.1 云存储

云存储是在云计算的概念基础上发展出来的新兴技术[6]。它将传统的集群技术、网络技术、分布式文件系统等技术结合起来,使分散在网络中的存储设备能够协同工作,并作为一个整体对外提供统一的存储服务[7]。

文献[1][8]详细论述了一种能够适应极速增长的数据处理需求的分布式文件系统:谷歌文件系统(Google File System,GFS)。GFS通过集群中的Master节点来管理数据块在Chunkserver节点中的分布,均衡各Chunkserver的负载,为Client节点提供最新的可用副本,并回收不再使用的存储空间。受到文献[1][2]的启发,Apache基金会发布了开源的Hadoop框架,提出了Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)[3]。HDFS认为每个数据块在本地节点、同一机架的不同节点以及不同机架上的节点都应该有一个副本。2006年,亚马逊在原云服务(Amazon Web Service,AWS)的基础上又推出了简单存储服务(Sim-ple Storage Service,S3)[4],它能够通过 Web Service方式或RESTful API方式存取云存储集群中的文件,便于整合到各类Web应用中[9-10]。2010年,美国国家宇航局(NASA)与Rackspace联合发布了开源云计算平台Openstack[5],其中包括Swift云存储组件。Swift一方面采用了3副本的副本管理策略,另一方面提供了与S3相兼容的RESTful API[11]。

综上,云存储系统中普遍使用副本冗余的技术来确保云存储系统能够在廉价设备上实现高可靠和高容错。同时冗余副本的存在也带来一些隐患包括:(1)占用更多的存储空间;(2)各节点间的数据传输需要占用网络带宽;(3)冗余副本的负载均衡会消耗计算资源。因此在云存储系统内部需要更优的副本管理策略来达到安全与效率的平衡,在云存储系统外部,也应该减少潜在的冗余副本。

1.2 网盘应用

网盘应用是各类云存储技术应用中非常重要且越来越普及的一种应用形式。笔者调研了国内比较有代表性的网盘应用,并比较了它们的功能特点。从而提出了云存储系统在网盘应用中需要注意的问题。

百度网盘是百度于2012年推出的一项云存储服务,通过客户端,用户能够“秒传”热门资源。用户能够生成分享链接,也可以将别人通过百度网盘分享的资源转存到自己的百度网盘中[12]。

腾讯微云是腾讯公司为用户精心打造的一项智能云服务,用户可以通过微云方便地在手机和电脑之间同步文件、推送照片和传输数据[13]。它与QQ、微信、邮箱等产品进行了深度整合,用户既可以通过QQ、微信、邮箱等分享微云中的文件,也可以把别人分享的文件方便地转存到微云中。

115网盘是广东一一五科技有限公司于2009年推出的网络数据在线存储服务[14]。115的文件分享功能十分强大,用户可以收藏和转存别人分享的文件,可以将文件分享给指定的一个或者多个用户(现由于公司原因关闭了分享功能)。通过PC客户端,115网盘可以“秒传”热门文件,并支持文件断点续传[14]。

综上可见,主流的网盘应用都会具备:1、文件的“秒传”功能;2、文件的分享功能;3、文件的转存功能。这些功能反映了网盘应用中,必将会保存大量的相同文件。如果这些重复的文件在云存储组件中不加以处理,按照云存储系统中一个数据块有多个数据副本的管理策略,将会给云存储系统带来巨大的压力。

2 需求分析与设计

2.1 课件管理子系统需求

课件管理子系统的每一个用户有自己的“存储空间”,用户可以在自己的“存储空间”里创建、修改、删除文件,各个用户的“存储空间”互不干扰;教师用户向课程中添加、删除课程资料文件的过程,即分享文件的过程;学生用户可以访问并下载某一课程中的资料,也可以将资料转存到自己的“存储空间”。

课件管理子系统要解决由文件共享、不同用户上传同一文件带来的冗余问题。当一个文件被多次共享、转存或者上传,云存储组件中应该只有一份文件及其必要的副本,而不应该出现多个同样的文件。

2.2 Swift存储层设计

作者选用了开源的Swift云存储组件作为课件管理子系统的存储层,采用MySQL数据库为课件管理子系统提供管理信息的存储,使用PHP的Yii框架作为开发框架实现系统逻辑,最上层通过JS及HTML技术做页面展示。

(1)Swift组件网络设计

为确保数据的安全,作者将Swift集群部署在私网网段中,对外提供服务的Web服务器通过双网卡,一块与外网相连,一块与私网相连。在Swift集群内部部署一台代理节点服务器和若干台数据节点服务器,它们之间通过私网的交换机相连。如图1所示。

图1 Swift集群网络拓扑图

(2)API封装设计

Swift通过RESTful API对外提供最基础的存储服务,包括请求认证、创建容器、删除容器、上传文件、下载文件、删除文件和复制文件。为方便应用系统内部调用Swift服务,将它们用PHP进行封装。实现功能如表1所示。

表1 API与封装对应关系表

(3)去重方案设计

为了避免将重复的文件上传到Swift集群中,作者将存储逻辑与去重逻辑分离,Swift集群只负责存储文件。数据库则记录了(1)用户与文件的持有关系;(2)存储于Swift集群中所有文件的哈希值。在上传文件之前,先计算出待上传文件的哈希值,再与数据库中现有的文件哈希值进行比较,如果此文件已经存在于Swift集群,那么系统直接生成一条用户持有该文件的关联记录,不再重复上传文件。去重流程如图2所示。

用户之间的文件分享关系,实际上是文件与用户之间一种特殊的临时的“持有”关系,用户可以将文件转存到自己的“存储空间”把分享关系转变成持有关系。当一个文件被多个用户持有时,任何一个用户删除自己的文件,不会影响到其他用户持有此文件。而一个文件被分享给其他用户时,若持有此文件的用户删除文件,其他用户也将无法访问到被删除的文件。为了保证安全,用户在通过网页查看文件的时候,系统实时生成各个文件的下载链接,此链接具有时效性,且只能供当前登录用户下载。

图2 上传文件的去重流程图

(4)数据库设计

根据上述分析,设计数据库E-R图如图3所示。其中,对象表用于存储Swift集群中各对象的元信息(包括对象名、对象类型、对象大小等)、哈希值以及管理信息(包括对象编号、上传时间、上传用户、删除标识等)。用户表用于存储用户信息,包括用户编号、用户名、加密后的登录密码等。持有关系表存储了用户编号和对象编号,以及用户对持有对象的命名(持有名)、存储路径(持有路径)以及必要的管理信息。分享关系表与持有关系表类似,存储了用户编号、对象编号、对象哈希值以及分享的状态信息(包括分享状态、分享时间、分享链接等)。持有关系表和分享关系表中都有随机数字段,用于判断和校验文件的持有状态和分享状态是否有效。

图3 数据库E-R图

3 功能实现

3.1 存储逻辑实现

笔者将最基础的存储逻辑封装成OpenstackTool工具类,实现了请求认证、创建容器、新建目录、上传文件、下载文件、删除文件、复制文件等基本功能。其中upload()方法实现了文件上传功能,它将Swift请求认证得到的token、对象类型、对象名作为PUT请求头部参数,把待上传文件作为PUT请求体,向Swift的代理节点发送PUT请求。download()方法实现了文件下载功能,它将token、待下载对象名、对象类型、对象大小作为GET请求参数,向Swift代理节点发送GET请求,返回目标文件内容。deleteFile()方法实现的是删除文件功能,它把容器名、目录名、待删除的对象名拼接在Swift URL中,将token作为请求头部参数,向Swift节点发送DELETE请求,如果文件删除将返回成功,否则返回错误信息。copyFile()方法实现了文件复制功能,它将目标路径、目标对象名拼接到Swift URL之后,把token、源对象、对象大小(复制操作时,对象大小设置为0)作为PUT请求头部参数,向Swift代理节点发送PUT请求。

3.2 去重方法实现

由于去重的逻辑渗透于课件管理子系统的文件上传、文件分享、文件转存、文件删除等环节中,因此作者通过三个类中的四个方法来实现去重逻辑。首先是UploadController类中的actionUpload()方法,实现了上传中检测重复文件、遇重复文件秒传的去重逻辑。它先将待上传文件的哈希值作为查询条件,到数据库中查询该文件是否为重复文件。若是,则向数据库持有关系表中添加一条新记录,将原对象与当前用户相关联,并把对象的持有计数加1;若否,则在对象表中插入一个新对象记录,再向持有关系表插入新持有记录,最后调用OpenstackTool工具类中的upload()方法将文件上传到Swift集群。其次是ShareController类中的actionShare()方法,实现了向指定用户分享文件时的去重逻辑。它会为每一个分享目标用户在分享关系表中新建一条分享记录,再更新持有此文件的用户的持有记录,将共享状态设置成已共享的状态。此信息只有分享者有权限修改或者删除。actionSave()方法,实现了用户转存共享文件时的去重逻辑。它根据分享信息,为用户生成一条持有信息,并将相应对象的持有计数加1。这样,即使原用户删除或者停止共享该文件对象,当前用户也依旧持有该文件。最后是NetDiskTool工具类中的deleteSingleFile()方法,实现了删除文件时的去重逻辑。由于Swift集群中只保存了一份文件及其相应副本,deleteSingleFile()方法在删除文件前,会判断它的持有计数,如果计数大于1,则说明还有别的用户持有此文件,此时仅删除与此用户相关的持有记录,并将该对象的持有计数减1。如果计数小于等于1,说明此用户是持有该对象的最后一个用户,此时不仅要删除该用户的持有记录,还要删除Swift集群中存储的对象和对象表中的对象记录。

4 实验及测试

笔者首先对Swift集群进行了测试,以确保存储层可以正常工作并能够通过RESTful API对外提供服务。然后对课件管理子系统进行测试,重点测试与去重策略相关的若干功能。

4.1 Swift组件的部署及测试

Swift集群部署在4台PC服务器上,其中一台部署为Swift代理节点,三台部署为Swift存储节点。4台服务器均处于私网环境,需要远程登录到Web服务器上才能对其进行测试。

笔者首先使用Swift提供的命令行工具对Swift集群的可用性进行测试。使用“swift upload”命令上传测试文件,然后使用“swift list”命令查看已上传的文件。如图4所示。

图4 Swift基础功能测试

使用curl命令,向Swift发送GET请求,下载刚才的测试文件,并另存为downloaded-test.txt。如图5所示。

图5 Swift API测试

通过测试,说明Swift集群搭建完成,并且可能通过RESRful API对外提供服务。

4.2 课件管理子系统的部署及测试

课件管理子系统部署在Web服务器上,此服务器通过双网卡来实现内外网的联通。首先测试通过外网访问课件管理子系统,然后测试系统是否可以调用Swift接口来存储文件。如图6图7图8所示。

图6 课件管理子系统上传结果

通过测试,说明课件管理子系统不仅能够从外网访问,还可以调用私网的Swift存储服务。

4.3 去重方法的测试

将4.2中的测试文件改名后,使用课件管理子系统再次上传同一文件,然后通过“swift list”命令查看Swift集群中保存了几份文件,通过SQL语句查询对象表中的记录数和持有关系表的记录数。如图9图10所示。

图7 上传后对象表记录情况

图8 上传后持有表记录情况

图9 上传重复文件后对象表记录情况

图10 上传重复文件后持有关系表记录情况

然后使用分享和转存功能,将此文件分享给用户B,用户B将文件转存到自己的目录。分别通过“swift list”命令和SQL语句,查询Swift集群中的文件数以及对象表中的记录、持有关系表的记录、分享关系表的记录。如图11图12图13图14所示。

图11 分享文件后分享关系表记录情况

图12 转存文件后对象表记录情况

图13 转存文件后持有关系表记录情况

图14 Swift中各对象情况

通过测试,笔者提出的去重策略有效地避免了Swift集群中出现冗余文件,减少了Swift集群的压力,达到了预期的效果。

5 结语

笔者发现当前主流的云存储组件对重复上传的文件不进行任何处理,如果直接应用于网盘应用的开发,将会产生大量的重复文件,占用存储资源、消耗网络带宽、影响用户体验。于是作者基于Swift云存储组件,使用PHP的开发框架,设计并实现了一个针对文件冗余的去重方法。该方法在文件上传云之前进行重复文件的判断,通过业务逻辑实现对Swift集群中已有的文件进行共享和转存操作,从源头上消除了产生冗余的可能。但是当前判断重复文件的工作仍在服务器端进行,仍会消耗网络带宽。下一步,应开发相应的客户端,将判断重复文件的工作转移到客户端,以减少带宽的消耗,从而更好地改善用户体验。

[1]Ghemawat S,Gobioff H,Leung S T.The Google File System[C].Nineteenth ACM Symposium on Operating Systems Principles.ACM,2003:29-43.

[2]Dean J,Ghemawat S.MapReduce:Simplified Data Processing on Large Clusters[C].Conference on Symposium on Opearting Systems Design&Implementation.USENIX Association,2008:10-10.

[3]Shvachko K,Kuang H,Radia S,et al.The Hadoop Distributed File System[C].MASS Storage Systems and Technologies.IEEE,2010:1-10.

[4]Amazon Web Services,Inc.Amazon Simple Storage Service文档[EB/OL].https://aws.amazon.com/cn/documentation/s3/,2017-11-10.

[5]The OpenStack Foundation.OpenStack Documentation[EB/OL].https://docs.openstack.org/pike/,2017-11-10.

[6]李逦.浅析云计算背景下云存储的优势与劣势[J].计算机光盘软件与应用,2013(23):18-19.

[7]百度百科.云存储[EB/OL].https://baike.baidu.com/item/云存储,2017-11-10.

[8]Geek_Ma.Google文件系统(GFS)翻译学习[EB/OL].http://www.cnblogs.com/geekma/archive/2013/06/09/3128372.html,2017-10-12.

[9]Prabhakar Chaganti.用Amazon Simple Storage Service(S3)在云中存储数据[EB/OL].https://www.ibm.com/developerworks/cn/web/ar-cloudaws2/,2017-11-10

[10]Andrew Glover.使用Amazon S3云服务轻松实现存储[EB/OL].https://www.ibm.com/developerworks/cn/java/j-s3/,2017-11-10.

[11]The OpenStack Foundation.OpenStack Wiki[EB/OL].https://wiki.openstack.org/wiki,2017-11-10.

[12]百度.百度网盘帮助中心[EB/OL].https://yun.baidu.com/disk/help,2017-11-10.

[13]腾讯.腾讯微云[EB/OL].https://www.weiyun.com/,2017-11-10.

[14]115科技.115帮助中心[EB/OL].http://115.com/115501,2017-11-10.

猜你喜欢

网盘副本集群
海上小型无人机集群的反制装备需求与应对之策研究
面向流媒体基于蚁群的副本选择算法①
一种无人机集群发射回收装置的控制系统设计
Python与Spark集群在收费数据分析中的应用
勤快又呆萌的集群机器人
副本放置中的更新策略及算法*
树形网络中的副本更新策略及算法*
网盘资源集中管理
网盘如何知道你在分享侵权文件
基于Web的网盘系统的设计与实现