1. 程式人生 > >redis分散式一致性hash演算法

redis分散式一致性hash演算法

        當我們在部署redis節點時,使用者連結redis儲存資料會通過hash演算法來定位具體連結那個redis節點,在redis節點數量沒有改變的前提下,之前的使用者通過hash演算法會固定的連結某一臺redis節點,但是若此時我們增加了redis節點,使用者再次hash時,能會hash到別的redis機器上,導致使用者在redis節點上讀取不到對應的資料,這就是redis命中的問題。

redis一致性hash演算法:

將使用者和redis節點的hash值對應到一個32位的環形資料結構上,環形結構首尾封閉,使用者通過hash演算法來定位在環形結構上,redis節點也通過hash演算法來定位到環形結構上,此時的命中問題就變成了,使用者節點通過順時針旋轉,在旋轉的過程中若碰到redis節點,就在該節點上讀取資料,若此時在環形結構上增加新的redis節點,由於是順時針尋找對應的redis節點,所以使用者此時的redis命中率還是很高的,不會因為增加了一臺redis節點就導致大量的使用者命中失敗的情況出現。

hash傾斜:

上述情況是發生在redis節點均勻分佈在環形結構上的情況下,但是若redis節點分佈密集,並且集中在環形結構上一側,那麼就會出現,大量的使用者節點請求同一臺redis伺服器,而其餘redis伺服器處於低請求的情況,若此時再加入一個redis節點,那麼同樣會導致命中率失敗變高。這種情況叫做    hash傾斜。

hash傾斜的解決辦法:

增加虛擬節點,假如有1 ,2兩臺redis節點分佈在32位環形結構上,那麼我們可以增加大量的虛擬的 1, 2節點在環形結構上。使用者命中到虛擬節點之後,在hash到真實的redis機器上。

雖然增加虛擬節點可以解決此問題,但是依然存在hash傾斜的問題,但是隨著虛擬節點的大量增加,就會使得出現hash命中失敗的現象降到最低。一致性hash演算法公式:

1-n/(n + m) * 100%   n表示真實的redis節點,m表示增加的虛擬節點,可以看到隨著虛擬節點的增加,命中失敗越來越低。