基于删冗的云存储文件系统客户端的实现.doc
《基于删冗的云存储文件系统客户端的实现.doc》由会员分享,可在线阅读,更多相关《基于删冗的云存储文件系统客户端的实现.doc(74页珍藏版)》请在沃文网上搜索。
1、目 录第1章引 言11.1 背景介绍11.2 服务器端Aegean System1第2章客户端的实现32.1 客户端文件系统的实现32.1.1 列目录请求.112.1.2 创建目录请求.272.1.3 移动文件请求.282.1.4 删除文件请求.292.1.5 重命名请求.302.1.6 文件的读写.312.2 客户端功能的实现.332.2.1 文件上传的实现.332.2.2 文件下载的实现.352.2.3 用户管理的实现.37第3章客户端删冗.393.1 基于内容分块39 3.2 分块算法TTTD算法.40 3.3 删冗的实现.42第4章客户端演示及论文总结464.1 功能演示464.2 论
2、文总结48插图索引49表格索引50参考文献51致 谢52声 明53附录A 外文资料的书面翻译54附录B 客户端与服务器端信息交互格式示例6551第1章 引 言1.1 背景介绍云存储在云计算概念上发展出来的一个新的概念,而云计算是分布式处理、并行处理和网格计算的发展,是透过网络将庞大的计算处理程序自动分拆成无数个较小的子程序,再交由多个服务器所组成的庞大系统经计算分析之后将处理结果回传给用户。通过云计算技术,网络服务提供者可以获得与“超级计算机”同样强大的网络服务在数秒之内,处理数以千万计甚至亿计的信息。概念上,云存储与云计算类似,它是指通过集群应用、网格技术或分布式文件系统等功能,将网络中大量
3、不同类型的存储设备通过应用软件集合起来协同工作,共同对外提供数据存储和业务访问功能的一个系统。本文中所用到的服务器端就是一个云存储文件系统基于广域网的分布式文件系统,而我所做的工作就是实现一个具有删冗功能的客户端,客户端的实现要以用户空间文件系统的形式实现,这里使用了开源项目Fuse,用它在ubuntu上实现一个用户空间的文件系统,具体介绍见下文客户端的实现中将有详细介绍。而客户端所对应的服务器端的实现虽然不是本文所关心的,但如果对服务器端不了解的话,客户端就没有了意义。下面我们将对Aegean System做一简单介绍。1.2 服务器端Aegean SystemAegean System是一
4、整套完整的广域网分布式存储系统,由基于key-value后端分布式存储服务(Aegean Store)、支持版本控制的文件系统表示层(Aegean FS)和各种存储应用(Aegean Sync、Aegean Share,etc)组成。系统目标是提供一个通用高可扩展的存储服务,并且具有良好可用性的文件系统语义(易于管理、迁移、开发)和高可靠的多版本支持。面向用户的应用可以方便将数据存储在Aegean System中,如同使用本地文件系统,但用户可以在互联网任意地点高效访问自己的数据,同时系统保证数据的可靠和任意时刻的数据回卷。图1即Aegean System的部署示意。而本文所做的内容属于Aeg
5、ean Sync的一部分,即对存储的应用,利用Aegean System提供的通用高可扩展的存储服务等实现一个客户端,使得用户可以进行注册、登录、登出,在互联网的任意地点高效访问自己的数据,如同访问本地的一个硬盘上的数据一样,当然,这样的实现还要借助于Fuse,这个下文将进行介绍。图1.1 Aegean System 部署示意1第2章 客户端的实现2.1 客户端文件系统的实现首先要对Fuse进行介绍,Fuse的全写是Filesystem in Userspace,即用户空间的文件系统,利用Fuse我们可以很容易地实现一个具有完善功能的用户空间文件系统,而且具有以下优点:l 简单的API库,容易
6、读懂并且便于利用;l 安装简便,不需要补丁以及编译操作系统内核;l 很好的稳定性;l 用户空间跟内核的接口非常高效;l 可以被非特权用户使用;l 运行在Linux内核上,支持版本为2.4.X和2.6.X;l 稳定性久经证明。实现一个文件系统将会因此而变得非常简单,一个hello world文件系统的创建将会不超过一百行代码,下面就是一个例子:/fuse/example$ mkdir /tmp/fuse/fuse/example$ ./hello /tmp/fuse/fuse/example$ ls -l /tmp/fusetotal 0-r-r-r- 1 root root 13 Jan 1
7、1970 hello/fuse/example$ cat /tmp/fuse/helloHello World!/fuse/example$ fusermount -u /tmp/fuse/fuse/example$Fuse的安装也非常简单,安装过程如下: ./configure make make install那么Fuse是怎么工作的呢?如下图所示:实际上我们使用一个命令比如ls时,这个命令被截获并传给了Fuse,而Fuse中有相应的函数对此进行处理,当然如何处理是需要我们来完善的,之后把结果返还给用户,我们就看到了文件目录下的文件列表。图2.1 Fuse工作原理图2实际上,本文直接使用的
8、并不是Fuse,而是Fuse-j,也就是Fuse的java包,这个包使得我们可以用java语言实现用户空间文件系统,下面我们对Fuse-j进行简单介绍。Fuse-j是Fuse的一个java语言包,也就是说Fuse-j的运行还是依附于Fuse的,只是我们可以通过java语言来编程实现,具体的细节由于不是本文的重点,所以不再详细介绍,下面对Fuse-j的安装和使用进行说明。首先我们必须安装Fuse的内核组件和库,而且通常Fuse的库被安装到目录/usr/local/lib下,而头文件被安装到/usr/local/include目录下。如果把Fuse安装到了别的目录下,我们就需要编辑build.co
9、nf和FUSE_HOME变量,使得其指向Fuse的库和头文件所安装的目录。而且我们需要JDK1.4或者更高的版本。这主要是因为它利JNI_VERSION_1_4,比如java.nio.ByteBuffer。编辑build.conf并且设置JDK_HOME变量指向JDK安装目录。然后运行“make”命令。这个命令将首先编译src目录中的java源代码成为class文件并且保存到build目录中,然后运行JNI包生成程序,产生两个文件:jni/javafs_bindings.h和jni/javafs_bindings.c。之后链接库jni/libjavafs.so将会被生成。那么Fuse-j该如何
10、使用呢?Fuse-j由两个部分组成:l JNI链接库(jni/libjavafs.so);l 用java语言完成的API,用以实现文件系统。由于安装包中包含了一个示例文件系统,也即是ZIP文件系统,它可以把一个ZIP压缩文件mount到一个指定的挂载点,然后可以进入文件夹中查看及读取文件,如同本地的一个文件目录一样,这只需如下命令即可: cd fuse-j-build-dir ./zipfs_mount.sh some.zip /mnt/point然后还可以卸载它: fusremount -u /mnt/point下面我们总结一下如何完成我们自己的文件系统:1 完成fuse.Filesyste
11、m接口;2 调用fuse.FuseMount.mount(String args, fuse.Filesystem filesystem),其中args是传递给Fuse库中的fuse_main函数的参数序列,其中必须包含:l 挂载点作为第一个参数;l 可选的选项作为第二以及随后的参数。文件系统就是完成fuse.Filesystem接口的一个实例;3. 可以运行命令进行试验。ls -al /mount/point上面对Fuse和Fuse-j进行的简单介绍,下面根据我们的需求来实现所需的客户端文件系统。既然是客户端,我们就要设计与服务器端的通信方式等细节,比如客户端的注册、登录等等。首先我们设计用
12、户管理部分,考虑我们要实现基于删冗的云存储文件系统客户端,那就意味着我们可以在任何一台拥有客户端的机器上登录到云存储文件系统,并且把自己的工作目录挂载到本地,那么如何实现呢?显然需要用户管理。登录服务器端需要我们输入用户名密码等信息,当然还需要注册以及登出等相关信息。所以有了表1中1、用户管理的设计,其中messageType用来标识每一种信息的类型,方便确认不同的信息进行不同的处理。用户注册需要提供用户名、用户ID、密码等信息,注册成功的话服务器端应该返回通用成功返回信息,否则返回通用错误返回信息,其中errno为错误类型编号,detail为错误的详细信息,这样的话说明我们注册失败,可能是用
13、户名重复等等错误,需要我们重新注册。而用户登录部分,除了提供用户名、密码之外还要提供一个location,这个参量表示用户的域,当然这里我们可以随便定义。用户登陆成功的话我们会收到用户成功登录的返回信息,messageType为4,内容包括session、name、quota、used等,分别表示会话、用户名、分配空间、已使用空间,收到这个信息就表示登录成功,并且session在后面的整个操作中都要使用,直到登出为止。当然如果我们没有收到成功的信息,就说明登录失败,这时会收到通用错误返回信息,根据错误信息重新登录。而登出只有在完成所有操作卸载网络文件系统之前进行用户登出。然后就是文件管理,其实
14、就是文件系统的实现,首先我们考虑一个文件系统需要什么呢?起码能显示出文件目录,哪个文件夹下有哪些文件又有哪些文件夹;可以移动文件,把它从一个文件夹下移到另外一个文件夹下;可以删除文件等等。这些都是我们平常在文件系统下常用的命令,假如插到电脑上一个移动硬盘或许很容易就能这样做,因为操作系统提供的支持,但对于我们的云存储文件系统呢?显然要靠我们自己去实现这些功能。我们的目标操作系统是Linux操作系统,这里使用的是Ubuntu8.10,之所以这样是因为我们要使用一个Linux下的开源项目Fuse,前面已经介绍过,借助它我们可以不用编译内核,省去很多麻烦,而且能够实现一个稳定的用户态的文件系统。实际
15、上Fuse对基本的文件系统命令都提供的支持,也就是说我们在文件系统中使用这些命令的话Fuse都可以帮我们截获,但具体如何处理,返回什么结果是要靠我们来定义和提供的。常见的如列目录(ls、dir)、创建目录(mkdir)、移动文件(mv)、删除文件(rm)、重命名(mv,这里通过不同的参数我们用一个命令在一个函数里实现了不同的功能)。首先对于列目录,简单的看只是一个命令,实际上这个命令的实现是其它所有命令的基础,我们首先要获得服务器端我们需要的目录以及它下面的文件目录等等信息,这里我们可以首先向服务器端请求目录,然后服务器端会返回我们文件目录列表,其中包括文件目录的结构和文件以及文件夹的属性等信
16、息。之后的处理下文会介绍。对于创建目录、移动文件、删除文件、重命名等命令主要工作就是本地操作,然后要告诉服务器端相应进行了什么操作。其中对于文件目录来说如何表示是一个难题,因为一个文件目录包含文件夹的结构、文件夹的属性、文件的属性等等,是一个树结构,如何表示呢?这里我们采用面向对象的方法,定义DirEntry表示文件夹入口、FileEntry表示文件入口,这里入口的意思就是通过这个对象我们可以获得它的所以信息,比如对于根目录来说,就可以把它当作一个DirEntry,它包含什么呢?文件夹的名称String name;文件夹的逻辑属性String magic;文件夹的时间属性long timest
17、amp;文件夹的可扩展属性boolean expanded;还有最重要的是文件夹下的文件或者文件夹等目录结构List dirList;List fileList。由于DirEntry对象中包含了子文件夹对象和子文件对象的链表结构,可以很容易用一个对象表示整个目录树,当然还有一些细节难题后面我们会处理。对于文件我们定义FileEntry,包括文件名String name;文件大小long size;文件时间属性long timestamp;以及文件的版本int version。由此我们设计了文件目录的表示方法。对于文件来说,仅有文件的管理是不够的,因为我们还需要文件的修改。不同于本地文件的修改,
18、我们必须要保持客户端与服务器端的同步和一致,当然不同的情况下以哪方为准是有不同的要求的,当我们成功登陆服务器端后,首先要挂载服务器上的工作区到本地,那么我们就需要下载文件,这样就是以服务器端为准进行的同步,当然假如本地已经有文件存在的话我们就可以通过删冗使得尽可能少地通过网络传输数据。当我们对文件进行了修改之后,我们需要把自己的工作进行保存,当然就需要上传文件了,这时我们就是以客户端为准,向服务器端上传文件,由于服务器端本身就有该文件,那么我们如何才能尽可能少地进行传输呢?同样的道理,我们在本地对文件进行删冗处理,当然具体的方法跟下载是不同的,后文会详细介绍。所以我们就要设计信息交流方式使得我
19、们的想法能够实行。对于文件上传,我们可以令int messageType = 11,信息内容还要包括用户String id、会话Session session(用户登录时得到)、文件的路径String path、是否使用新的网络连接boolean newConnection,最后就是最重要的部分List chunkList(其中Chunk:byte32 key; long size;),表示本地文件的文件块列表,文件块通过基于内容分块算法得到,这里的块只包括快的key通过对块求SHA-1码并且扩展到32位、块的大小size,而文件块的内容则不需要传输,当我们收到返回信息时再进行处理。根据需要我
20、们要得到服务器需要哪些数据块、以及服务器如何接收这些块等信息,于是可以这样设计上传返回信息,令int messageType = 12,而List chunkList表示需要上传的文件块,也就是说我们需要用数据通道进行数据传输,这时boolean newConnection应该为true,对应应该告诉我们String host和int port使得我们创建新的socket连接,将服务器端需要的文件块的内容传输过去。文件下载的话就更复杂一点,首先我们要以服务器端的文件为准,但我们并不想直接把服务器端的文件直接下载下来,虽然这样也是可行的而且对我们来说处理会简单得多,但那样无疑会牺牲大量的网络流量
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
10 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 存储 文件系统 客户端 实现
