如何理解"一致性hash"?

一句話解釋什麼是“一致性hash”

   字面解釋:外界條件發生了改變,而hash後的結果仍然保持較高程度的一致性。

問題背景

   問題背景:假如有4個緩存節點,按照取膜的方式進行分配數據(對4取膜,0/1/2/3 分別對應a/b/c/d節點),假若d節點掛了,那四個節點的數據都不能使用了,因爲之前是對4取膜的,現在拿數據就得是對3取膜了,膜4的結果肯定是不使用膜3的,那麼就會去後端,會去查庫,造成“緩存雪崩”。

   一致性hash的誕生,就是爲了解決這個問題的。

一致性hash的策略

   一致性hash的策略:還是傳統的取膜操作,不過,不是對機器節點數來取膜,而是對2^32進行取膜。可以想象成,一個巨大的鐘表,上面有2^32個刻度,若干機器節點,映射到hash環上。假若有一張圖片,這個圖片對應的hash環上的地址是:hash(圖片名字) % 2^32的值,比如叫x,順時針方向,x的下一個環上的機器節點,那就是真實存儲圖片的節點。

   一致性hash的優勢:

   假若不使用一致性hash,增加節點/減少節點,所有的緩存都會失效,會造成緩存雪崩(參考問題背景);

   假若使用了一致性hash,增加/減少節點了,只會對某一範圍內的緩存數據有影響,大大減少了影響面。

hash環的偏移

   任何方案都不可能是十全十美的,一致性hash也不例外。會有一種情況,數據集中歸屬於某一個環,又正好是這個環掛了,那一致性hash的意義就不大了。所以,應對這種情況,有了一個新的機制“虛擬節點”

虛擬節點

   假設是4個節點,可以在從4個節點,虛擬出虛擬節點,這樣一個實際節點會對應多個虛擬節點,節點的數據一多,數據自然就分佈的越均勻。

相關問題

爲什麼取膜是對2^32?

   因爲IPV4最大是 2的32次方,這樣就能保證對所有IP取膜不重複。

一致性hash算法?

   藉助MD5算法

如何添加虛節點?

   添加虛節點,最重要的是計算虛節點的下標。計算虛節點的下標,可以參考下面的代碼,h即爲虛節點下標

for n in nodes:
    for v in vNodes:
        h = _hash(str(n) + str(v))

虛擬節點的替代方案

   在github上,看到一篇文章,提到一種方案“再次映射線性空間”,下面是原文摘要

虛節點這種靠數量取勝的策略增加了存儲這些虛節點信息所需要的空間。在OpenStack的Swift組件中,使用了一種比較特殊的方法來解決分佈不均的問題,改進了這些數據分佈的算法,將環上的空間均勻的映射到一個線性空間,這樣,就保證分佈的均勻性。

   不過,我並不是非常理解:爲什麼再映射一次到線性空間,就保證了均勻性?如果再次映射到線性空間,增加/減少節點的時候,又是如何處理呢?會不會又繞回最初的原點?

   參考文章鏈接:

一致性哈希算法的理解與實踐

深入雲存儲系統Swift核心組件:Ring實現原理剖析

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章