一致雜湊演算法 Ketama

2021-09-24 09:17:05 字數 1180 閱讀 4127

一致雜湊演算法要求

節點數量的增加 要能夠保證舊的資料能夠按照老的演算法 環形

減少對映關係的變動

所以不能安裝數量來hash求餘之類的操作

否者將會導致大量的節點資料失效和遷移

一致雜湊演算法設計標準

再不改邊原有對映關係的前提下 將資料均勻分流的其他節點

(建立虛擬節點 再導流到下乙個節點 但是會有雪崩的危險)

protected void setketamanodes(listnodes) 

//加權節點 其實就是相同節點生成多份虛擬節點 而生成虛擬節點主要根據node生成 那就給node再拼接乙個數量就ok了

final int nodecount = nodecounts.containskey(node) ? nodecounts.get(node).intvalue() + 1 : 1;

final string nodepluscount = decoratewithcounter(node, nodecount);

//新增相同節點的數量

nodecounts.put(node, nodecount);

//nodes轉存到set裡面 應為會有重複

newnodeset.add(node);

//每個節點分配100個虛擬節點 除以4 是為了充分利用md5生成的長度為16的位元組陣列 這個陣列生成4個long 正好給一組虛擬節點作為key

*不直接遍歷100個 然後取md5的後4個位元組 可能因為碰撞更小吧*

拆分4個一組 然後每組再生成4個key 最後再不發生key碰撞的情況下 每個節點的虛擬節點還是100

for (int i = 0; i < numreps / 4; i++)

}} //斷言 小於1000 key碰撞 則拋異常 測試環境

assert newnodeset.size() < 1000 ? newnodemap.size() == numreps * nodes.size() : true : "size: " + newnodemap.size() + ", expected: " + (numreps * nodes.size());

data = new ketamadata(newnodemap, newnodeset);

}

一致性雜湊演算法

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

一致性雜湊演算法

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

一致性雜湊演算法

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