1. 程式人生 > >一致性Hash算法原理白話

一致性Hash算法原理白話

mage 9.png 計算 其它 容易 映射 emc mem 主機

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算法原理白話