馬黎艷
[摘要] 使用基于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.