傳統(tǒng)hash
把Client的cookieId對服務器數(shù)量做hash計算,從而分配客戶端請求具體的哪個服務器
10% 3 = 1 ?? 10號客戶端請求1號服務器
11% 3 = 2 ?? 11號客戶端請求2號服務器
12 % 3 = 0 ?? 12號客戶端請求0號服務器
13 % 3 = 1 ?? 13號客戶端請求1號服務器
-
弊端
不易擴展飞蚓,若增加一臺服務器配乱,那么hash的值就會變
10% 4 = 2 ?? 10號客戶端請求2號服務器
11% 4 = 3 ?? 11號客戶端請求3號服務器
12 % 4 = 0 ?? 12號客戶端請求0號服務器
13 % 4 = 1 ?? 13號客戶端請求1號服務器
一致性hash
3臺服務器集群
0 ?? 192.168.1.33
1 ?? 192.168.1.76
2 ?? 192.168.1.120
192.168.1.33 % (2^32) = a
192.168.1.76 % (2^32) = b
192.168.1.120 % (2^32) = c
hash環(huán)的值是從 hash(0) ~ hash(2^32-1)
這樣3臺服務器在hash環(huán)的位置就確定了
根據(jù)用戶ID墙基,對其hash(UserId)
也會命中在hash環(huán)上,取上一個服務器作為訪問對象
- 優(yōu)點
當增加/減少一臺服務器時,并不影響原來其他用戶訪問的服務器
一致hash算法數(shù)據(jù)傾斜
當服務器數(shù)量較少時证九,就會出現(xiàn)數(shù)據(jù)傾斜的現(xiàn)象,
引入虛擬節(jié)點機制解決該問題础爬,
對于0甫贯,1,2號服務器各虛擬出3個節(jié)點看蚜,這樣hash環(huán)上共有9個節(jié)點
在實際應用中叫搁,通常將虛擬節(jié)點數(shù)設置為32甚至更大,因此即使很少的服務節(jié)點也能做到相對均勻的數(shù)據(jù)分布供炎。