一致hash算法

传统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号服务器


    一致hash算法_第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环上,取上一个服务器作为访问对象

  • 优点
    当增加/减少一台服务器时,并不影响原来其他用户访问的服务器
一致hash算法_第2张图片
image.png

一致hash算法数据倾斜

当服务器数量较少时,就会出现数据倾斜的现象,
引入虚拟节点机制解决该问题,
对于0,1,2号服务器各虚拟出3个节点,这样hash环上共有9个节点
在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。

你可能感兴趣的