首页 > 编程知识 正文

一致性hash算法如何保证均匀,负载均衡算法实现

时间:2023-05-03 08:25:21 阅读:165368 作者:1991

要求:如何根据权重将请求分配给服务器。

大致思路:两个全局变量currentWeight必须初始化为最大权力值,currentIndex必须初始化为0。 从当前索引中,在与索引对应的节点的权重大于等于当前权重时,遍历返回节点的ip进行查找。 另外,在currentIndex=currentIndex 1之后,在作为服务器总数的越界的情况下,需要复位为currentIndex=0; 同时判断currentweight=curr net weight-max更新后的值是否为0,如果为0,则需要设定current weight=最大权力值。

publicclassweightroundrobbin { privatestaticintcurrentweight=-1,currentIndex=0; privatestaticfinallistnodenodes=new ArrayList (; private static int max=-1; //最大公约数static{nodes.add(newnode ) ' IP1 ',4 ); nodes.add(newnode ) ' IP2 ',8 ); nodes.add(newnode ) ' IP3 ',16 ); collections.sort(nodes,) Node o1,Node o2 )-{ return o1.weight - o2.weight; ); current weight=nodes.get (nodes.size (-1 ).weight; max=getmaxdivide(nodes; ///取最大公约数(publicstaticvoidmain (string [ ] args ) ) for ) intI=0; i28; I ) system.out.println(getserver (); } System.out.println (; }私有状态字符串获取器() for ) intI=currentindex; i nodes.size (; I )当前权重=节点. get (if ) I ).weight ) {当前索引=I 1; 当前索引==nodes.size () ) {当前索引=0; 当前权重-=max; 当前权重==0(if )当前权重=nodes.get (nodes.size (-1 ).weight; }returnnodes.get(I ).ip; } }返回空值; } publicstaticintgetmaxdivide (listnode nodelist ) intRES=nodelist.get )0).weight; for(intI=1; i nodeList.size (; I ) res=getresult(nodelist.get(I ).weight,RES ); if(RES==1) { return 1; } } return res; } privatestaticintgetresult (inta,int b ) if ) ab ) inttem=b; b=a; a=tem; (while ) ab ) { a %=b; if(a==0) { return b; }else{ int tem=b; b=a; a=tem; } }返回1; } static class Node{ String ip; 输入权重; 公共节点(stringip,int weight ) { this.ip=ip; this.weight=weight; }}一致性哈希算法:解决分布式系统存储器中常见剩余哈希算法伸缩性差的问题。 例如,正常剩余散列需要重新散列所有节点上的数据,以便在删除或增加机器节点时,后续请求命中相应的机器节点。 另一方面,如果使用一致性散列删除或添加节点,则原始请求会更多地命中原始机器节点。

一致性散列解决了分布式缓存系统中由于机器数量的变化导致大量缓存失效的问题。 尽量减少请求和服务器映射关系的变动。 与简单模式ldse相比,一致性散列算法可以将禁用缓存的范围限制在“相邻”节点。 相邻是指哈希值的相邻。 具体原理是将哈希值逻辑定位为0-2^31 - 1的范围圆环,然后将机器哈希值作为环上的节点。 当请求被散列后,出现顺时针机器散列,表示该请求与该机器存在映射关系,当某个机器节点失效时,此前的请求不再像模型ldse那样面临大范围的高速缓存失效,而是依次进行但是,一台计算机可能会收到大量请求,导致计算机级联并停机。 解决方法是使用虚拟节点。 这意味着,每台计算机实际上都对应于多个哈希上的节点,当一台计算机停机时,可以将与该计算机对应的请求分布到其他计算机,而不是像以前那样堆积在一台计算机上。

扩展:缓存有多种类型,包括cpu缓存、TLB虚拟地址-”物理地址缓存和redis缓存

名词解释:缓存直通:使用redis缓存功能时,如果查询的key不在缓存中,并且查询数据库中没有查询值,则不会缓存空值。 如果有大量这样的请求,数据库就会崩溃。

直通缓存解决方案:

为了用bloom Filter解决,基本的想法是使用k个hash函数,对插入数据库的各值的要求key进行散列运算,求出与位数组中的k个值对应的位位置1。 布隆过滤器为什么可以在较少的存储容量下确定数十亿级别的数据呢? 实际上,保存的不是信息本身,而是与信息的k个散列函数对应的散列值比特位置1。 缺点是判定有可能被误判。

缓存雪崩:如果缓存中的大量key在同一时间过期,大量请求会命中数据库,导致数据库压力巨大,甚至瘫痪。

解决办法:

有效期不要相同;

即使最初发现高速缓存中没有数据的线程获取独占锁,然后所有线程都无法再获取数据,仍会尝试获取锁,如果无法获取,请阻塞并等待。 直到缓存更新。

缓存细分与缓存平衡器的区别在于缓存细分是热点数据失效,大量请求命中数据库缓存平衡器,是大量请求同时命中数据库。 果然有点不同。 本质是一样的

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。