分佈式中hash取模算法中的問題

分佈式中hash取模算法中的問題

常用的算法是對hash結果取餘數 (hash() mod N):對機器編號從0到N-1,按照自定義的hash()算法,對每個請求的hash()值按N取模,得到餘數i,然後將請求分發到編號爲i的機器。

但這樣的算法方法存在致命問題,如果某一臺機器宕機,那麼應該落在該機器的請求就無法得到正確的處理,這時需要將當掉的服務器從算法從去除,此時候會有(N-1)/N的服務器的緩存數據需要重新進行計算;”

爲何是 (N-1)/N 呢?解釋如下:

比如有 3 臺機器,hash值 1-6 在這3臺上的分佈就是:
host 1: 1 4
host 2: 2 5
host 3: 3 6
如果掛掉一臺,只剩兩臺,模數取 2 ,那麼分佈情況就變成:
host 1: 1 3 5
host 2: 2 4 6

可以看到,還在數據位置不變的只有2個: 1,2,位置發生改變的有4個,佔共6個數據的比率是 4/6 = 2/3這樣的話,受影響的數據太多了,勢必太多的數據需要重新從 DB 加載到 cache 中,嚴重影響性能

【一致性hash 的辦法】
上面提到的 hash 取模,模數取的比較小,一般是負載的數量,而 consistent hashing 的本質是將模數取的比較大,爲 2的32次方減1,即一個最大的 32 位整數。然後,就可以從容的安排數據導向了,那個圖還是挺直觀的。

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