首页 > 编程语言 >算法【Hash算法总结】

算法【Hash算法总结】

时间:2023-11-02 10:24:13浏览次数:34  
标签:总结 Hash 哈希 算法 key 一致性 节点

一、简介

       一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系 。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题。

二、应用场景

       我们在项目的负载均衡上要求资源被均匀的分配到所有的服务器节点上,同时,还需要对资源的请求能迅速的路由到具体的节点,例如:

  1. 做RPC服务的时候,会经常部署多台服务器,然而有时有需求,希望将同一类型的请求路由到同一台机器上,这个时候就可以用一致性hash算法来实现 。 
  2. MemCache集群,要求存储数据均匀的放到集群中的各个节点上,访问这些数据时能快速的路由到集群中对应存放该数据的节点上;并且要求增删节点对整个集群的影响很小,不至于有大的动荡造成整体负载的不稳定,这个时候也是可以用一致性hash算法。

三、原理

       核心思想:维护出一个2的32次方整数环【0,2^32-1】,然后将每个节点的计算hash值放到环上。

       现有三个节点分别是Node0、Node1、Node3,要将多个资源尽可能均匀的分配到这三个节点中,如何做。

           

       3.1、为何使用环存储节点,还是顺时针查找。

                我们要向分配节点第一想到的办法就是取余算法。即现在有3个节点,资源key=7,7%3=1,则选择Node1,key=5,5%3= 2,则选择Node2,key=3,3%3=0,则选择Node0。虽然简单,但有个缺点,如果节点数增加或减少,就会有大量的key不命中,导致大量缓存雪崩,造成请求压力转移,可能对系统整体有很大的影响,甚至发生宕机危险。

               而一致性哈希算法增加或减少节点,只会引起很少部分的key不会命中,如下图,增加一个Node4节点,则只会将部分的key值从Node1移到Node4,对集群影响很小,不会导致雪崩。

                

      3.2、一致性Hash的问题

              虽然引用了hash环,但是由于机器数太少,可能导致大量数据被存储在一台机器上,资源没有得到充分有效的利用。这就是Hash倾斜。

      3.3、如何解决Hash倾斜

               引用虚拟节点。Hash环上面的节点数越多,分布越均匀,出现Hash倾斜的概率越小。

               查询资源的顺序可以是:-》虚拟节点-》真实节点-》获取资源。

 四、总结

         

 

标签:总结,Hash,哈希,算法,key,一致性,节点
From: https://www.cnblogs.com/xiaobaicai12138/p/17804744.html

相关文章

  • 每日总结-23.11.1
    软件构造作业生成算式存入csvpackagekousuanti;importjava.util.Scanner;publicclassGongneng{publicstaticvoidmain(String[]args){Scannerscan=newScanner(System.in);Chutichuti=newChuti();System.out.println("请确......
  • 每日总结
    今天我完成了一道软件设计的实验题,运用c++实现一些功能; (1)对应的类图:(2)源代码;1.浅克隆运行代码:#include<iostream>usingnamespacestd;//向量类classVector{private:int*p;intlen;public:Vector(intlen);Vector(constVector&vector);......
  • 每日总结Java设计模式之原型模式
    今天完成了设计模式的原型模式实验用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节简单说就是先创建一个原型类实例,然后通过克隆的方法来复制一个一样的新对象,这个对象和原来......
  • 每日总结11.02
    学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。  Client:package实验7;publicclassClient{    publicstaticvoidmain(Stringa[]){        StudentIDstu1,stu2;        Stringid1,id2;        System.out.pr......
  • 每日总结Java设计模式之单例模式
    今天做了单例模式的实验代码在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式。单例模式有3个特点:单例类只有一个实例对象;该单例对象必须由单例类自行创建;单例类对外提供一个访问该单例的全局访问点;1.单例模式的......
  • 每日总结22
    SpringBoot的配置文件4.1SpringBoot配置文件类型4.1.1SpringBoot配置文件类型和作用SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(application.yaml)进行配置。SpringBoot默认会从R......
  • 每日总结
    1、Hive安装第一步:打开SecureCRT8.3软件,在node-01上进入/export/software/目录,指令如下:cd/export/software/1第二步:使用指令rz进行安装包上传,选择安装包apache-hive-1.2.1-bin.tar.gz。apache-hive-1.2.1-bin.tar.gz第三步:上传完毕后将该安装包解压到/export/servers/目录,使......
  • 2023年11月第一周学习总结
    排序归并排序本质是将多个序列进行合并,和快排一样也用的是分而治之的思想,并且它也是基于比较里面较快的算法且能保持稳定性的算法。那么怎么将两个序列合并呢?(假设左右两边已经有序)开辟一个和数组一样大的辅助数组,再设定两个指针,第一个指针指向第一个序列的开头,第二个指针......
  • 每日总结20231101
    代码时间(包括上课)6h代码量(行):100行博客数量(篇):1篇相关事项:1、今天是周三,上的是软件构造,软件构造讲的是对于csv文件的读写操作。2、今天下午开会然后上班,把erp的作业也完成了,需要加速看软考了。3、今天还打算看看软件设计师相关的题目,我要过!......
  • 2023-2024-1 20231402《计算机基础与程序设计》第六周学习总结
    2023-2024-120231402《计算机基础与程序设计》第六周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第6周作业这个作业的目标自学计算机科学概论第7章《C语言程序设计》第5章作业......