1. 傳統雜湊演算法
傳統的雜湊演算法比較均勻的將資料分配到節點上。它依賴的hash演算法(實現用的是md5演算法)能夠比較隨機的分布。
from hashlib import md5
from struct import unpack_from
items = 10000000
nodes = 100
node_stat = [0 for i in range(nodes)]
for item in range(items):
k = md5(str(item)).digest()
h = unpack_from(">i", k)[0]
n = h % nodes
node_stat[n] += 1
但是存在乙個問題,傳統的雜湊演算法使用節點數取餘的方法,強依賴節點的數目,因此,當節點數改變時,資料項所對應的節點會發生劇烈變化。
from hashlib import md5
from struct import unpack_from
items = 10000000
nodes = 100
new_nodes = 101
change = 0
for item in range(items):
k = md5(str(item)).digest()
h = unpack_from(">i", k)[0]
n = h % nodes
n_new = h % new_nodes
if n_new != n:
change += 1
2. 一致性雜湊演算法
而一致性雜湊演算法具有許多優點,被廣泛應用。當增加或者刪除節點時,對於大多數資料項,一致性雜湊演算法保證原來分配到的某個節點,現在仍然應該分配到那個節點。
from hashlib import md5
from struct import unpack_from
from bisect import bisect_left
items = 10000000
nodes = 100
new_nodes = 101
change = 0
ring =
new_ring =
def _hash(value):
k = md5(str(value)).digest()
ha = unpack_from(">i", k)[0]
return ha
for n in range(nodes):
ring.sort()
for n in range(new_nodes):
new_ring.sort()
for item in range(items):
h = _hash(item)
n = bisect_left(ring, h) % nodes
new_n = bisect_left(new_ring, h) % new_nodes
if new_n != n:
change += 1
一致性雜湊演算法也有缺點,資料在節點上分布不均勻。和傳統雜湊演算法相比,資料本身的雜湊值不變,變化的是資料雜湊值應該對映到哪個節點的演算法。
from hashlib import md5
from struct import unpack_from
from bisect import bisect_left
items = 10000000
nodes = 100
node_stat = [0 for i in range(nodes)]
ring =
hash2node = {}
def _hash(value):
k = md5(str(value)).digest()
ha = unpack_from(">i", k)[0]
return ha
for n in range(nodes):
h = _hash(n)
ring.sort()
hash2node[h] = n
for item in range(items):
h = _hash(item)
n = bisect_left(ring, h) % nodes
node_stat[hash2node[ring[n]]] += 1
為了解決資料分布不均勻的問題,一致性雜湊演算法引入虛擬節點機制。
虛擬節點是實際節點(機器)在雜湊空間的複製,每個實際節點(機器)對應若干個虛擬節點。
一致性雜湊演算法
好吧,我們決定打破這種基於資料項商業邏輯的劃分思維,來考慮一種基於 key 的劃分方式,這有些類似於後面介紹的資料庫水平分割槽 sharding 我們需要設計一種不依賴資料項內容的雜湊演算法,將所有資料項的 key 均衡分配在這三颱快取伺服器上。乙個簡單而有效的方法是 取餘 運算,這就像打撲克時的發...
一致性雜湊演算法
在分布式系統中,如果某業務可以由多個相同的節點處理,很容易想到用hash的方式將業務請求分散到這些節點處理,如果有n個節點,計算方法為 hash id n。如果只是簡單的計算,不涉及使用者狀態,這是乙個簡單有效的方案。如果節點的計算涉及使用者狀態,比如維護購物車 memcache快取服務等,好像也沒...
一致性雜湊演算法
判定好壞的四個定義 1 平衡性 balance 平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。2 單調性 monotonicity 單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的...