一致性Hash算法原理白話
1、技術背景
1.1、技術舉例:Memcache
1.2、技術瓶頸
memcached服務器端本身不提供分布式cache的一致性,由客戶端實現提供。以余數分布式算法為例。
余數分布式算法是根據添加進入緩存時key的hash值通過特定的算法得出余數,然後根據余數映射到關聯的緩存服務器,將該key-value數據保存到該服務器
1.2.1、假設有3臺緩存服務器以及它們對應的余數值
Node A:0,3,6,9
Node B:1,4,7
Node C:2,5,8
1.2.2、此時添加一臺服務器Node D
服務器對應的余數值發生變化,如下
Node A:0,1,2
Node B:3,4
Node C:5,6
Node C:7,8,9
根據上面的變化,發現只有余數值為0,4,5所對應的緩存服務器沒有發生改變,也就是說其它余數值對應的緩存服務器發生了改變,即緩存失效,如果大量緩存失效會嚴重影響系統的性能,也就是緩存動蕩。針對這樣大片緩存失效的技術瓶頸,於是提出了一致性hash算法。縮小失效緩存範圍。
2、一致性Hash算法
2.1、將hash值範圍看成一個0~232的圓。
2.2、將服務器節點的hash值映射到該圓上。
2.3、對數據進行緩存時,計算key的hash值,然後找到該值在圓上的位置,順時針進行查找,將數據保存到第一個查找到的服務器。
2.4、添加一個緩存服務器,如圖
根據hash一致算法的映射查找規則,受影響的緩存只有新服務器的hash值----新服務器逆時針的第一個服務器hash值得範圍,也就這塊區域的緩存失效,大大降低了失效範圍。
2.5、當服務器過少時,會帶來數據傾斜問題
加入只有兩臺服務器A和B,那麽hash範圍如下
Node A:0-231
Node B:0-232
很容易造成數據堆積在節點A,於是一致性哈希算法引入了虛擬節點機制,即對每一個服務節點計算多個哈希,每個計算結果位置都放置一個此服務節點,稱為虛擬節點。具體做法可以在服務器ip或主機名的後面增加編號來實現。過程如圖
無虛擬節點
引入虛擬節點
註:圖是從其它網站下載
一致性Hash算法原理白話