负载均衡一致性hash算法一点总结

参考:这篇写的非常通俗易懂https://blog.csdn.net/cywosp/article/details/23397179#commentsedit

大意:
利用一个环形的hash空间selectors(散列范围0~(2^32)-1,实际上底层是一个ConcurrentMap),按照hash算法将一个key散列到指定的位置。对象(o1,o2,o3)的散列与机器(Node1,Node2,Node3)的散列算法是一样的。

形成过程:
1)考虑负载均衡算法的一致性和分散性:o1,o2,o3顺时针地去找离自己最近距离的机器位置。这样的设
计就保证了机器的动态上下线后,仅有少量的数据需要迁移
2)考虑负载均衡算法的平衡性:1)的方式会造成散列的不均衡,原本存储在挂掉的机子上的数据都迁
移到了后一台机子上,造成了不平衡的结果。改进的做法是加入许多个“虚拟节点”,看做是机器的复
制点,虚拟节点在selectors上按照hash值排列,这样就能相对平衡的平摊

一点总结:
1)虚拟节点的总数是一定的(默认160),虚拟节点的散列位置是根据  Hash(机器ip+数字后缀)的方
式,假设Node1的IP为192.168.1.100,根据设置的虚拟节点复制个数,比如2,那就分别映射到Hash
(192.168.1.100#1)与Hash(192.168.1.100#2)
2)一致性hash算法能够减少数据的迁移量,能够使相同参数的请求总是被发到同一机器上

联想:

1)联想到Redis也可以使用一致性hash算法来搭建集群。好处是,将数据平摊到各个机器了,某台机器宕机之后,所有的关联“虚拟节点”都会消失,新添加的数据会顺时针存储到下一个最近距离的机器中去,老的数据会被删除,重新查询该数据要到数据库中去查,这个去数据库中查的操作会比原先的hash算法少很多!!;

为1)举个例子,复制自haozi_ncepu有5台服务器,编号分别是0(A),1(B),2(C),3(D),4(E)  ,正常情况下,假设用户数据hash值为12,那么对应的数据应该缓存在12%5=2号服务器上,假设编号为3的服务器此时挂掉,那么将其移除后就得到一个新的0(A),1(B),2(C),3(E)(注:这里的编号3其实就是原来的4号服务器)服务器列表,此时用户来取数据,同样hash值为12,rehash后的得到的机器编号12%4=0号服务器,可见,此时用户到0号服务器去找数据明显就找不到,出现了cache不命中现象,如果不命中此时应用会从后台数据库重新读取数据再cache到0号服务器上,如果大量用户出现这种情况,那么后果不堪设想。同样,增加一台缓存服务器,也会导致同样的后果。

2)数据库的分库分表也可以用一致性hash去做

你可能感兴趣的:(查漏补缺)