Chord演算法(原理)

2021-06-18 07:02:58 字數 3797 閱讀 9688

分類: 分布式演算法

2010-12-06 23:33

7490人閱讀收藏 

舉報演算法

網路p2p

儲存雲計算優化

目錄(?)

[+]

chrod

演算法是p2p中的四大演算法之一,是有mit(麻省理工學院)於2023年提出,其他三大演算法分別是:

chord的目的是提供一種能在p2p網路快速定位資源的的演算法,cord並不關心資源是如何儲存的,只是從演算法層面研究資源的取得,因此chord的api就簡單到只有乙個set、get。

chord是乙個演算法,也是乙個協議。作為乙個演算法,chord可以從數學的角度嚴格證明其正確性和收斂性;作為乙個協議,chord詳細定義了每個環節的訊息型別。當然,chord之所以受追捧,還有乙個主要原因就是chord足夠簡單,3000行的**就足以實現乙個完整的chord。

chord還可以被作為乙個一致性雜湊、分布式雜湊(dht)的實現。

覆蓋網路是指這樣一種網路:構建在其他網路之上、網路節點之間通過虛擬或邏輯連線在一起,比如雲計算、分布式系統都是覆蓋網路,因為其都構建於tcp/ip之上,且節點之間有聯絡。chord也是構建於覆蓋網路。

非結構化的p2p網路是指網路節點之間不存在組織關係,節點之間完全是對等的,比如第一代p2p網路napster,這類網路結構清晰、簡單,但查詢沒有多大的優化餘地,經常採用全域性或分割槽泛洪查詢,查詢時間長、且結果難以保證(有可能在找到前就超時)。

結構化的p2p網路與非結構化恰好相反,我們認為網路在邏輯上存在乙個人為設計的結構,比如chord假定網路是乙個環,kadelima則假定為一顆二叉樹,所有的節點均為樹的葉子節點。有了這些邏輯結構,就給我們資源查詢引入了更多的演算法和思路。

dht的主要想法是把網路上資源的訪問像hashtable一樣,可以簡單而快速地進行put、get,該思想的誕生主要是受第一代p2p(napster)網路的影響。與一致性雜湊相比,dht更強調的是資源的訪問,而不管資源是否是一致性的。與一致性雜湊相同的是,dht也只是乙個概念,具體細節留給各實現。

當前這些p2p實現可以被作為dht的具體實現,再次再列舉一些有代表性的實現:

chord通過把node和key對映到相同的空間而保證一致性雜湊,為了保證雜湊的非重複性,chord選擇sha-1作為雜湊函式,sha-1會產生乙個2160的空間,每項為乙個16位元組(160bit)的大整數。我們可以認為這些整數首尾相連形成乙個環,稱之為chord環。整數在chord環上按大小順時針排列,node(機器的ip位址和port)與key(資源標識)都被雜湊到chord環上,這樣我們就假定了整個p2p網路的狀態為乙個虛擬的環,因此我們說chord是結構化的p2p網路。

下面有幾個定義:

如圖:紅色點為node,藍色為標誌符。上面只是部分節點和標誌符,以節點n1為例說明其finger表中的successor:

noith successor

successor

1n1+20

n18 

2n1+21

n183

n1+22

n184

n1+23

n185

n1+24

n186

n1+25

n457

n1+26n18

n1+27n1

把node和key都對映到乙個值域感覺是把狗和貓放在一起衡量,雖然有點怪,但這樣可以保證一致性雜湊,具體可以參考前文。

很顯然,分布在chord環上的node數遠遠小於標誌符數(2160是乙個無法衡量的天文數字),這樣chord環上的node就會很稀疏地分布在chord環上,理論上應該是隨機分布,但如前面一致性雜湊的討論,如果節點數量不多,分布肯定是不均勻的,可以考慮增加虛擬節點來增加其平衡性,如果在節點較多(比如大型的p2p網路有上百萬的機器)就不必引入虛擬節點。

很顯然,任何查詢只要沿chord環一圈結果肯定可以找到,這樣的時間複雜度是o(n),n為網路節點數,但對乙個上百萬節點,且節點經常加入、退出的p2p網路來說,o(n)是不可忍受的,因此chord提出了下面非線性查詢的演算法:

每個節點都維護乙個finger表,該錶長度為m(m就是位數,在chord中為160),該錶的第i項存放節點n的第(n+2i-1) mod 2m個successor(1<=i<=m)

每個節點都維護乙個predecessor和successor列表,該列表的作用是能快速定位前繼和後繼,並能週期性檢測前繼和後繼的健康狀態

就是說存放的successor是按2的倍數等比遞增,自所以取模是因為最後的節點的successor是開始的幾個節點,比如最大的乙個節點的下乙個節點定義為第乙個節點

資源key儲存在下面的node上:沿chord環,hash(node)>=hash(key)的第乙個node,我們稱這個node為這個key的successor

給定乙個key,按下面的步驟查詢其對應的資源位於哪個節點,也就是查詢該key的successor:(假如查詢是在節點n上進行)

從直覺上來說,上次查詢過程應該是指數收斂的,類似二分法的查詢,收斂速度應該是很快的;反過來,查詢時間或路由複雜度應該是對數即的,在下面我們會證明這一點。

下圖表明了節點n1查詢節點n53的過程,還是非常快的:

對乙個演算法而言,收斂性是至關重要的,如果沒有收斂性做保證,在程式上化再多的心思也是徒勞。在證明之前,我們再強調3點:

這裡要區分是key的successor還是節點n的successor,同時要注意最近匹配原則。

假如節點n的finger表中的第i個successor與key的距離最近,則滿足:key處在第i項與第i+1項中間

記第i項為j,第i+1項為p

而:j = n + 2i-1

p = n + 2i

節點n與key的距離應該處在n與j和p的中間,即 j-n

(1) 2i-1i

(2) 而j與key的距離最大為j與p的距離 j-hash(key) i-1

也就是說j與key的距離,小於n與key的距離,並且該距離小於n與key距離的一半,這樣我們保證每次迭代,與key的距離都會收斂,並且至少按2的指數收斂,也就是折半查詢。

至此,我們理論證明了chord的收斂性。

其實chord演算法可以完全轉換為乙個數學問題:

在chord環上任意標記個點作為node集合,任意指定node t,從任意的node n開始根據chord查詢演算法都能找到節點t。

為什麼能這麼轉換呢?因為只要找到了key的直接前繼,也就算找到了key,所有問題轉化為乙個在chord環上通過node找node的問題。這樣,這個題就馬上變的很神奇,假如我們把查詢的步驟記錄為路徑,又轉化為任意2個節點之間存在一條最短路徑,而chord演算法其實就是構造了這樣一條最短路徑,那這樣的路徑會不會不存在呢?不會的,因為chord本身是乙個環,最差情況可以通過線性查詢保證其收斂性。

chord冗餘性:

所謂冗餘性是指chord的finger表中存在無用項,那些處在node n和其successor之間的項均無意義,因為這些項所代表的successor不存在。比如在n1的finger表中的第1~5項均不存在,故都指向了n18,至少第1~4項為冗餘資訊。

一般說來,假如chord環的大小為2m,節點數為2n,假如節點平均分布在chord環上,則任一節點n的finger表中的第i項為冗餘的條件為:n+2i-1

m/2n =>2i-1

<2m-n =>i 冗餘度為:(m-n+1)/m=1-(n-1)/m,一般說來m >>n,所以chord會存在很多的冗餘資訊。假如,網路上有1024個節點,即n=10,則冗餘度為:1-(10-1)/160≈94%。所以很多**都指出這一點,並認為會造成冗餘查詢,降低效能。其實不然,因為這些冗餘資訊是分布在多個node的finger表,如果採取適當的路由演算法,對路由計算不會有任何影響。

至此,我們已經完整地討論了chord演算法及其核心思想,接下來要討論的是chord的具體實施。

Chord演算法(原理)

chrod 演算法是p2p中的四大演算法之一,是有mit 麻省理工學院 於2001年提出,其他三大演算法分別是 chord的目的是提供一種能在p2p網路快速定位資源的的演算法,cord並不關心資源是如何儲存的,只是從演算法層面研究資源的取得,因此chord的api就簡單到只有乙個set get。ch...

Chord演算法(原理)

chrod 演算法是p2p中的四大演算法之中的乙個,是有mit 麻省理工學院 於2001年提出,其它三大演算法各自是 chord的目的是提供一種能在p2p網路高速定位資源的的演算法,cord並不關心資源是怎樣儲存的,僅僅是從演算法層面研究資源的取得,因此chord的api就簡單到僅僅有乙個set g...

Chord演算法(原理)

chrod 演算法是p2p中的四大演算法之中的乙個,是有mit 麻省理工學院 於2001年提出,其它三大演算法各自是 chord的目的是提供一種能在p2p網路高速定位資源的的演算法,cord並不關心資源是怎樣儲存的,僅僅是從演算法層面研究資源的取得,因此chord的api就簡單到僅僅有乙個set g...