一致性雜湊演算法的穩定性檢測和它存在的問題及解決策略

2022-08-29 19:00:22 字數 2357 閱讀 7610

加入機器節點

假設p2p網路中要新加入乙個機器節點n(new),那麼n(new)首先得與p2p網路中的n(x)節點建立聯絡,通過n(x)按照 「路由查詢」的路由演算法查詢n(new)對應的雜湊值 h(n(new))=new,再查詢它的後繼節點,假設它的後繼節點為n(s),n(s)的前趨節點為n(j),那麼要將 n(new)節點假如它們兩者之間,就必須重新建立它們之間的p2p網路架構關係。

非併發環境下可以做這樣兩步:

1.改變n(j),n(new),n(s)的前趨節點,後繼節點的記錄,來構成新的網路架構。

2.n(new)節點插入n(j)和n(s)節點之後,那麼 n(new)就是n(s)的前趨節點,n(s)就是n(new)的後繼節點,將n(s)上原本落在前趨節點n(new)雜湊數值空間的鍵值 遷移到 n(new)節點上。

併發環境下,n(j)和n(s)之間可能同時有多個節點需要加入,這樣做:

1.  n(new)的後繼節點指為n(s),把n(new)的前趨節點指為 null.

2.穩定性檢測(這一步並非只為了新加入乙個節點而設立,而是每個節點都會週期性自動完成,通過 它可以完成前趨和後繼 的更新和資料遷移,p2p網路架構中,每個節點都會定期執行它)

穩定性檢測演算法流程:

1.假設n(s)為n(c)的後繼節點,n(c)向n(s)詢問前趨節點n(p),

2.如果n(p)介於n(c)和n(s)之間,n(c)記錄n(p)為它的後繼節點。

3.令n(x)為n(c)的後繼節點,其有可能是n(s)或者n(p),這得看前一步,  如果n(x)的前趨節點為 null 或者 n(c)位於n(x)和 它的前趨節點之間,那麼 n(c)就發訊息告訴 n(x),它是n(x)的前趨節點,n(x) 將它的前趨節點設定為 n(c)。

4. n(x)把它上面屬於 n(c)的部分資料(雜湊值小於c的)遷移到n(c)上,

二話不說上圖:

----將n(c)加入p2p網路之前--------------------》之後--->

紅線代表後繼節點,藍線代表前趨節點。

假設過了一點時間n(p)開始執行穩定性檢測,此時,

新加入節點後 ,原先節點的路由表可能已經不正確了,把本應該 指向新節點的路由項指向了舊的節點,因此,每個節點需要週期性的檢查路由表,對路由表內每一項 k=2的i次方(0<=i<=m-1)加上本機節點執行路由演算法,經過查詢獲得後,如果路由項保留內容不同則更新到新內容,完成路由表的更新。

節點離開p2p網路有兩種方式: 正常離開和異常離開。

正常離開一般會通知前趨節點和後繼節點 遷移資料,路由表失效可以通過 「加入新節點的情形」來更新。異常離開是機器故障導致 ,此時資料可能丟失,為了避免,可以將資料在多台機器是備份。

一致性雜湊存在的問題:

1.機器節點對映到環狀結構位置是隨機的,容易導致機器負載不均衡,

2. 大規模資料中心,既有高效能,高配置的機器 ,也有低效能的,低配置 的,一致性雜湊並未考慮這種情況,將所有的機器 都一律平等看待,容易造成低配置高負載的情況 。

針對它存在的問題 引入了 「虛擬節點」:

乙個物理節點虛擬成若干虛擬節點,分布到一致性雜湊的環狀結構的不同位置。(可以導致更佳的負載均衡,也減輕了機器異質性問題)

一致性雜湊演算法

好吧,我們決定打破這種基於資料項商業邏輯的劃分思維,來考慮一種基於 key 的劃分方式,這有些類似於後面介紹的資料庫水平分割槽 sharding 我們需要設計一種不依賴資料項內容的雜湊演算法,將所有資料項的 key 均衡分配在這三颱快取伺服器上。乙個簡單而有效的方法是 取餘 運算,這就像打撲克時的發...

一致性雜湊演算法

在分布式系統中,如果某業務可以由多個相同的節點處理,很容易想到用hash的方式將業務請求分散到這些節點處理,如果有n個節點,計算方法為 hash id n。如果只是簡單的計算,不涉及使用者狀態,這是乙個簡單有效的方案。如果節點的計算涉及使用者狀態,比如維護購物車 memcache快取服務等,好像也沒...

一致性雜湊演算法

判定好壞的四個定義 1 平衡性 balance 平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。2 單調性 monotonicity 單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的...