一致性雜湊演算法

2021-07-02 17:57:14 字數 1665 閱讀 5005

我們的memcache客戶端(這裡我看的spymemcache的原始碼),使用了一致性hash演算法ketama進行資料儲存節點的選擇。與常規的hash演算法思路不同,只是對我們要儲存資料的key進行hash計算,分配到不同節點儲存。一致性hash演算法是對我們要儲存資料的伺服器進行hash計算,進而確認每個key的儲存位置。

常規hash演算法的應用以及其弊端

最常規的方式莫過於hash取模的方式。比如集群中可用機器適量為n,那麼key值為k的的資料請求很簡單的應該路由到hash(k) mod n對應的機器。的確,這種結構是簡單的,也是實用的。但是在一些高速發展的web系統中,這樣的解決方案仍有些缺陷。隨著系統訪問壓力的增長,快取系統不得不通過增加機器節點的方式提高集群的相應速度和資料承載量。增加機器意味著按照hash取模的方式,在增加機器節點的這一時刻,大量的快取命不中,快取資料需要重新建立,甚至是進行整體的快取資料遷移,瞬間會給db帶來極高的系統負載,設定導致db伺服器宕機。

設計分布式cache系統時,一致性hash演算法可以幫我們解決哪些問題?

分布式快取設計核心點:在設計分布式cache系統的時候,我們需要讓key的分布均衡,並且在增加cache server後,cache的遷移做到最少。

這裡提到的一致性hash演算法ketama的做法是:選擇具體的機器節點不在只依賴需要快取資料的key的hash本身了,而是機器節點本身也進行了hash運算。

class

consistenthash

$arr_num = count($arr_key);

if($arr_key[$arr_num-1] <= $key)

//折半查詢

$low = 0;

$height = $arr_num-1;

while($low

<= $height)

$low = $mid+1;

}else

if($arr_key[$mid] > $key)else

}return

$arr_key[0];

}//初始化

public

function

__construct

($nodes=array())

}//雜湊函式

public

function

hash

($str)

//根據字串獲取節點位置(對應節點名稱/鍵名)

public

function

getposition

($str)

//新增節點

public

function

addnode

($node)

$this->nodes[$node]= null;

for($i=0;$i

<$this->v_mul;$i++)_");

$this->v_nodes[$hash]=$node;

}ksort($this->v_nodes);

}//刪除節點

public

function

deletenode

($node)

unset($this->nodes[$node]);

foreach($this->v_nodes as

$k=>$v)}}

}

一致性雜湊演算法

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

一致性雜湊演算法

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

一致性雜湊演算法

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