1. 程式人生 > 其它 >分散式協同:解決分散式狀態和資料一致性問題:一致性雜湊

分散式協同:解決分散式狀態和資料一致性問題:一致性雜湊

技術標籤:分散式演算法分散式

一致性雜湊演算法:

背景:

1. 分散式雜湊表(DHT) 是 P2P網路 和 分散式儲存中常見的一種技術 ,是雜湊表的分散式擴充套件,每臺機器只負責承載部分資料,如何通過雜湊方式對資料進行 增刪改查等資料操作的技術。而"一致性雜湊" 就是DHT其中的一種實現方式。

演算法步驟:

  1. “一致性雜湊”演算法 將 (雜湊數值空間) 按照(大小)組成一個首尾相接的環狀序列。
  2. 對於每臺機器,可以根據其 (IP) 和 (埠號)經過 (雜湊函式 )對映到 雜湊數值空間內。
  3. 每臺機器就是環狀序列的不同節點。
  4. 注:假設 N 代表機器,i代表雜湊空間對應的數值。
  5. 而每臺機器負責儲存落在一段有序雜湊空間內的資料,比如N 14儲存 經過雜湊後落在6~14範圍內的資料。
  6. 同時每個機器節點 記錄環中的前趨節點和後繼節點的位置,使之成為一個真正的有向環。

路由問題(快速找到資料問題):

低效率解決辦法:
  1. 沿著有向環順序查詢,接收到查詢請求的節點,獲得查詢的主鍵的雜湊值 ( j) 之後,判斷是否在自身管理範圍內,否的話就交給後繼節點進行處理。
  2. 直到 某個節點 Nx, x是>=j的最小編號節點。這樣,最多遍歷所有的節點也能找到 對應的結果。
高效率解決辦法:
  1. 為了加快查詢速度,在每個節點配置路由表,路由表儲存 m 條路由資訊(m 為雜湊空間的二進位制數值位元位長度)。

  2. 其中i 項 (0<=i<=m-1)路由資訊表示距離上一個節點的2**i的距離的雜湊空間內的節點。

    圖演示:
    在這裡插入圖片描述

    演算法執行過程描述:
    1. 輸入:從機器節點 N(i)發起初始查詢請求,查詢主鍵Key對應的鍵值,其中H(key)=j 。
    2. 輸出:Ni給出Key對應的鍵值value,或者返回鍵值不存在的資訊 。
    3. 過程:假設當前所在初始節點為Nc,他的後繼節點為Ns,要查詢的初始節點為Ni,N(i)=j。
      3.1. 判斷 c<=j<=s,
      3.2. 如果為True,結束查詢,說明key如果存在,一定在Nc的後繼節點Ns上,所以Nc傳送訊息給Ns,要它查詢key的值value,Ns將查詢結果返回給 Ni。
      3.3. 如果為False,Nc查詢其對應 的路由表,找到小於j的最大節點Nh(如果所有節點都>j,則選擇 m-1項為Nh),Nc項Nh傳送資訊,要它幫忙查詢,此時Nh為新的Nc節點,接下來重複 步驟2,3即可。

插入新節點問題:

新加入的N(new)節點必須與有向環中的任意一個節點 Nx產生聯絡,通過上面的路由演算法找到H(N(new))的對應雜湊值new,可以找到它的後繼節點為Ns,假設前趨節點為Np。

演算法過程:
	要將N(new)節點 加入,需要後續步驟。
非併發環境:

1.將N(new)的後繼節點指為Ns,前繼節點置位空值Null。
2. 遷移Ns節點上雜湊值小於 new的資料到N(new)節點上。

併發環境:

1.將N(new)的後繼節點指為Ns,前繼節點置位空值Null。
2. 穩定性檢測,並非為新節點加入而設定的,而是所有節點週期性自動完成。 通過穩定性檢測可以完成前趨和 後繼節點的資料遷移。

	3. 什麼是穩定性檢測:
		3.1: Nc向Ns詢問他的前趨節點Np,一般這樣直接到步驟4。
		3.2:  如果Nc是介於 Np和Ns之間,Nc記錄Np為其後繼節點。
		3.3: 令Nx為Nc的後繼節點,Nx可能是Np,亦可能是Ns,取決於步驟2。 如果Nx的前趨節點為Null或者Nc位於Nx和它的前趨節點之間,那麼Nc給Nx傳送訊息告訴 Nx,Nc就是它的前趨節點,Nx將前趨節點設定為 Nc。
		3.4:Nx把雜湊值小於c的資料遷移到Nc上。

新加入節點之後 ,原先的路由表還需要更新,因此每個節點還需要週期性檢查路由表。

節點離開:
正常離開:可以通知前趨節點和後繼節點做一些更新工作,遷移資料 等。
異常離開:往往是機器故障導致的,可以採用機器節點資料多副本的方式。