一致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号服务器


    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甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容