分佈式的兩種算法

 1.取模算法

這種算法很是的簡單,就是根據服務器臺數的餘數進行分散,求得整數值的hash值,再除以服務器的臺數,根據其他數來選擇服務器,將server的hash值與server的總檯數進行求餘,即hash%N。算法

可是在這種算法對緩存命中率的影響下:緩存

咱們假設有8臺服務器,運行中忽然down了一臺,則求餘的底數變成了7,那麼其產生的結果就徹底變了服務器

通常地,咱們從數學上概括之:分佈式

有N臺服務器,變成了N-1臺服務器,因此命中率在服務器down的短時間內,急劇降低至1/(N-1),因此服務器越多,則down機的後果越嚴重函數

2.一致性hash算法

爲了解決上述取模算法遇到的問題,咱們可使用另外一種分佈式算法,即一致性hash算法,所謂的一致性hash算法,就是把服務器的各個節點放在鐘錶的各個時刻上,同時,咱們也將要存儲的key也映射到鐘錶的某個時刻上,該key延鐘錶順時針走,碰到第一個比他小的節點以後,則key就落在這臺服務器上spa

補充:利用crc32()函數能夠將key值轉換成整數server

當某個節點down後,隻影響該節點順時針以後的1個節點,而其餘節點不受影響blog

咱們經過上圖看到,6號節點down後,全部的壓力都轉移到7號節點上,形成了7號節點服務器的壓力特別的大,那咱們考慮是否可以將6號節點的壓力注意到其他的節點上?數學

因此咱們引入了虛擬節點的概念:hash

虛擬節點-N個真實節點,把每一個真實節點映射成M個虛擬節點, 再把M*N個虛擬節點,散列在圓環上. 各真實節點對應的虛擬節點相互交錯分佈,這樣某個真實節點down後,則把其影響平均分擔到其餘全部節點上

相關文章
相關標籤/搜索