Consistent hashing一致性算法原理

最近在整理redis分佈式集羣,首先就整理一下分佈式算法原理。常見的分區規則有哈希分區和順序分區兩種,Redis採用的是哈希分區規則。redis

  • 節點取餘分區

使用特定的數據,如Redis的鍵或用戶ID爲key,節點數量爲N,則:hash(key)%N,計算出哈希值,而後決定映射到哪一個節點上,如節點數爲4時,哈希值的結果可能爲0、一、2,3. 現假設有4個redis節點,HashCode值爲1~20的20個數據,那麼算法

redis節點 HashCode HashCode HashCode HashCode HashCode
redis0 4 8 12 16 20
redis1 1 5 9 13 17
redis2 2 6 10 14 18
redis3 3 7 11 15 19

當增長一個redis節點時,以下圖只有1,2,3,20這4個命中了,即4/20=20%緩存

redis節點 HashCode HashCode HashCode HashCode
redis0 5 10 15 20
redis1 1 6 11 16
redis2 2 7 12 17
redis3 3 8 13 18
redis4 4 9 14 19

優勢:簡單 缺點:當節點數量變化時,如擴容或收縮節點,數據節點映射關係須要從新計算,會致使數據的從新遷移。服務器

  • Consistent hashing一致性算法原理 一致性算法也叫環形hash算法。 基本思想:將對象和cache都映射到同一個hash數值空間中,而且使用相同的hash算法。

算法過程:構造長度爲的2³²的整數環,根據節點名稱的Hash值,將緩存服務器節點放置在這個Hash環上,而後根據須要緩存的數據的key值計算獲得Hash值,而後在Hash環上順時針查找這個key的Hash最近的服務器節點,完成key到服務器的映射查找。 keyA、keyB、keyC爲三個節點,對象爲key1,key2,key3,key4:分佈式

能夠分析一下,當移除一個節點時,影響的是該節點到逆時針到達下一個節點的這部分,如移除keyB,keyB到KeyA的值會從新指向keyC;添加節點時,影響的是添加的節點逆時針到達下一個節點的一部分,不會對其它節點形成影響。一致性算法,明顯的抑制對象的鍵的從新分佈。 理想狀態下,3個節點是均勻分佈在環上的,但是實際通常不會均勻分佈,會出現hash傾斜,以下圖,A B C三個節點挨的比較緊密: 函數

缺點: 加減節點會形成哈希環中部分數據沒法命中,須要手動處理或者忽略這部分數據,所以一致性哈希經常使用於緩存場景中。 節點比較少時,節點變化將大範圍影響哈希環中數據映射,所以不適合少許節點的分佈式場景。 普通的一致性哈希分區在增減節點時,須要增長一倍或減去通常節點才能保證數據和負載的均衡。對象

虛擬槽分區 以下圖,每一個節點增長一個虛擬節點,這樣對象一、3指向節點A,四、5指向節點B,二、6指向節點C,明顯抑制了hash一致性分佈不均勻的現象。 blog

使用分散度良好的哈希函數把全部數據映射到一個固定範圍的整數集合中,整數定義爲槽。這個範圍通常遠大於節點數,槽是集羣內數據管理和遷移的基本單位。採用大範圍槽的主要目的是爲了方便數據拆分和集羣擴展。 命中率計算公式: (1-n/(n+m))*100% n是服務器臺數 m是新增服務器臺數,新增服務器臺數越多命中率越大,全部增長虛擬節點命中率也會增長。hash

增長虛擬節點,每一個實際節點設置100~500虛擬節點,能夠抑制hash一致性分佈不均勻的現象。table

相關文章
相關標籤/搜索