APP下载

基于JXTA的分布式存储系统的设计

2009-06-17马黎艳

中国校外教育(下旬) 2009年6期

马黎艳

[摘要] 使用基于JXTA平台的P2P分布式体系结构,采用Chord环路作为网络的拓扑结构,节点ID和文件ID的生成则通过使用某种HASH算法如MD5,SHA等,设计了一个高可扩展、高可靠、高性能的分布式存储系统。

[关键词] P2P Chord JXTA 分布式存储系统

一、引言

由于计算机通信技术的高速发展,网络上的信息资源越来越多,访问量也越来越大,基于传统的集中式存储方式已经不能满足用户的需要。随着P2P技术的发展,基于P2P的分布式存储系统也相应地得到了快速发展。目前,已经有很多比较成熟的P2P分布式文件存储系统,其中最典型的有:Napster、OceanStore、Past、Chord等文件存储系统。这些系统的基本思想是将数据存储、访问与固定的位置分离开来,通过P2P网络将Internet上零散的计算机连接起来,整合这些计算机上的空闲存储资源,构建出一个高可扩展、高可靠、高性能的分布式存储系统。

二、相关技术

1.Chord简介

Chord在2001年由麻省理工学院提出,其核心思想就是要解决如何在P2P网络中找到存有特定数据的节点。Chord协议中其规定使用的散列算法为SHA-1,并在此基础上提供了优化的路由算法。

在Chord中,每个节点需要存储m个其他节点的信息,这些信息的集合被称为查询表。表格中的节点不是直接相邻的节点,它们的间距(ID间隔)将成2k的关系排列(k表示表中的数组下标)。这样形成的节点之间路由关系实际上就是折半查找算法需要的排列关系。在查询的过程中,查询节点将请求发送到与键值最接近的节点上。收到查询请求的节点如果发现自身存储了被查询的信息,可以直接回应查询节点;如果被查询的信息不在本地,就根据查询表将请求转发到与键值最接近的节点上。这样的过程一直持续到找到相应的节点为止,查询过程实际上就是折半查找的过程。

2.JXTA简介

JXTA是Sun微系统对等网络的标准,以它来促进和探究分布式计算的新方法。JXTA具体来说是一种标准组件平台,它提供了用于开发分布式服务和应用程序的基本组件。整套技术由一组开放源码的P2P协议组成,这组协议使网络上任何连接着的计算设备的协作变为可能。使用这些协议,节点可以互相合作来建立自我组织、自我管理的对等组,而不必关心它们在网络中所处的位置(在网络边缘或者防火墙的后面),并且也不需要集中的管理机构。

JXTA体系结构由三层组成。应用层(Applications)包括了应用JXTA服务开发出来的完整的P2P应用程序。比如,P2P及时消息、文件和资源共享、P2P电子邮件系统、分布式存储系统等。服务层(Services)包含一些网络服务,提供了P2P网络通用的功能,如查找、共享等机制、协议转换等。核心层(JXTA Core)封装了P2P网络最基本的要素,包含了服务所需要的核心功能,包括对等体、对等组、对等体发现和相关的安全原语。

三、系统设计

系统采用JXTA平台进行P2P的设计开发,以Chord环路作为网络的拓扑结构,节点ID和文件ID的生成则通过使用某种HASH算法如MD5,SHA等,文件的存储与下载则使用CMS来管理。

1.节点加入与离开

Jxta为发现对等节点、对等组和其他信息提供了一个异步机制,所发布的关于对等节点或对等组的信息被称为通告,节点正是通过搜寻相应的通告来发现它所需要的资源。当节点X希望加入JXTA网络时,首先,查找某个对等组内的通告,发送加入请求,组内其他节点收到该请求后做出响应。节点与第一个发出响应的节点Y通话,以便初始话本地节点查询表(finger table)、跟新其他节点查询表及转移关键字信息。

新节点X以x+2i-1 (l≤i≤m)为消息key值向Y发出请求,查找消息的Successor节点和查询表(finger table)项,以此填充自己的查询表(finger table)项。当新节点完成了自己的路由信息组建之后,通知其他相关节点自己的加入,以逆时针的方向递归地通知相关节点更新自己的路由信息。最后,其他节点将所有键值归属于X的关键字(即后继节点是X的关键字)转移到节点X上。当节点加入时首先通过哈希函数产生节点ID,然后找到ID 相邻的两个节点作为此节点的前驱和后继节点,系统中每个节点都保留其邻近的前驱和后继节点信息。当节点退出时,此节点的前驱节点需将其后继更新为退出节点的后继节点。

2.系统通信

系统采用Java事件处理机制和Jxta自身的管道通信机制,实现了异步线程的节点通信功能。在这种通信机制下,节点可以接收单播和多播请求并做出响应。在管道消息到来之前,每个节点需要安装侦听器来处理来自其他节点的消息。当消息到达后,节点对管道报文消息进行解析处理,产生相应的事件,事件会激活侦听器进行请求响应的处理。节点A建立输入管道并实现net.jxta.pipe.PipeMsgListener接口的PipeMsgEvent(PipeMsgEvent event)方法来完成有管道消息输入时触发相关操作。节点B建立输出管道并实现net.jxta.pipe.OutPipeListener接口的OutPipeEvent(OutPipeEvent event)方法来完成有管道消息输出时时触发相关操作。

3.文件存储与获取

在本部分功能实现中,利用了CMS服务。文件存储与获取通过LIST_REQ、LIST_RES、GET_REQ、GET_RES和ASK_DOWNLOAD_REQ等消息来实现。系统启动后,用户节点加入默认的NetPeerGroup。用户存储文件时,首先选取要存储的文件,然后对文件进行编码,最后将文件分块发送到相应节点上。

下载文件时,用户选中要下载的文件,将这个文件的ID和本地接收内容的输入管道以及请求ID写入到请求消息中传给目标节点。节点收到LIST_REQ消息后,会发出一个LIST_RES的响应消息。用户收到LIST_RES消息后,如果对其中的某个共享内容感兴趣,想要从对方节点下载,会向对方节点发出一个GET_REQ消息,利用LIST_REQ中的输入管道来请求下载分块数据。节点收到GET_REQ消息后,首先,检查自身是否包含GET_REQ消息中的共享内容块,如果包含,则通过GET_REQ消息中指定的输入管道发出一个或多个GET_RES响应消息。节点根据文件ID获得文件广告和相关信息,通过文件路径信息定位到文件,然后通过创建文件输入流FilelnputStream(filepath)对象获得输入流,每次读取指定大小的字节作为一个返回信息传送给用户。文件下载通过FilelnputStream读取文件并将读到的信息写入CMS协议的GET-RES中,然后通过JXTA管道传输到本地。

四、结束语

JXTA技术是P2P的新发展,它提供的通用的平台和协议可以高效灵活地开发P2P应用程序。本文提出了基于Chord协议,利用JXTA技术实现的分布式存储。系统由地理分布的多个节点构成,每个节点都是拥有存储空间的独立计算机,节点之间以JXTA网络的方式组织,采用Chord环路作为网络的拓扑结构,利用CMS来实现文件的存储与下载。

参考文献:

[1]田荣华,卢显良,侯孟书.P2P分布式存储系统[J].计算机科学,2007,(11):47-48.

[2]赵森.基于DHT的Chord算法研究[J].网络安全技术与应用,2007,(11):44-46.

[3]Scott Oaks,Bernard TraversatεLi Gong著.技桥译.JXTA技术手册.北京:清华大学出版社,2004.4.

[4]林川等.基于JXTA的P2P文件共享系统的研究[J].温州大学学报,2007,(8):35-41.