传统hash
把Client的cookieId对服务器数量做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号服务器
image.png
一致性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环的值是从 hash(0) ~ hash(2^32-1)
这样3台服务器在hash环的位置就确定了
根据用户ID,对其hash(UserId)
也会命中在hash环上,取上一个服务器作为访问对象
- 优点
当增加/减少一台服务器时,并不影响原来其他用户访问的服务器
image.png
一致hash算法数据倾斜
当服务器数量较少时,就会出现数据倾斜的现象,
引入虚拟节点机制解决该问题,
对于0,1,2号服务器各虚拟出3个节点,这样hash环上共有9个节点
在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。