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

本文介绍了一致性哈希算法的基本原理,包括其通过引入虚拟节点解决负载均衡问题的方法,并探讨了该算法如何应用于Redis集群及数据库分库分表场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:这篇写的非常通俗易懂https://blog.youkuaiyun.com/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去做

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值