我有一個圖片存取服務,爲了快速獲取圖片,我架起了3臺緩存服務器,用簡單的Hash映射決定圖片存儲在哪臺緩存上。好比:node
f(x) % 3 = 0 存儲在s0上算法
f(x) % 3 = 1 存儲在s1上緩存
f(x) % 3 = 2存儲在s2上服務器
某天,緩存負載太高,須要擴容1臺,緩存數量由3變爲4,那麼按獲取圖片按公式:f(x) % n,不少會請求失敗,這樣會直接訪問後臺服務,給後臺服務形成很大的壓力,可能形成雪崩。負載均衡
是否有這樣的算法,解決分佈式緩存中,解決簡單Hash隨緩存服務器伸縮,形成大面積緩存失效的問題框架
緩存穿透分佈式
一致性哈希算法在1997年由麻省理工學院提出,是一種特殊的哈希算法,目的是解決分佈式緩存的問題,解決了簡單哈希算法在分佈式哈希表中存在的動態伸縮等問題3d
引入Hash環blog
假若有3個節點,三個節點位於環的不一樣位置圖片
具體的值,根據Hash值取餘環的大小,順時針方向找到最近的節點就是具體的存儲節點
好比:f(x1)存儲在Node1, f(x2)存儲在node2, f(x3)存儲在Node0
此時,若是加入了節點Node4,那麼原來指向Node2的紅色箭頭部分,緩存會失效,變成存儲在Node4
如:f(x2)存儲在Node4
能夠看到的效果是:當緩存服務器數量發生伸縮時,只有部分緩存失效
圓環大小:232,由來:整數4B=4*8bit(32位無符號整形),值從0~232 -1
每一個節點位置:hash(ip) % 232
存儲的key位置:hash(key) % 232
在分佈式系統中一致性hash起着不可忽略的地位,不管是分佈式緩存,仍是分佈式Rpc框架的負載均衡策略都有所使用。
優勢:在分佈式緩存中
缺點:可能存在Hash偏斜,如
解決策略