图解一致性哈希算法的基本原理

图解一致性哈希算法的基本原理一致性哈希的基本原理一致性哈希算法是将每个Node节点映射到同一个圆上。将各Node的key采用hash计算,可得到一个整数数组。将该数组排序后,首尾相连即是一个圆。如下图所示简单来说,一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希环如下:整个空间按顺时针方向组织,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……直到2^32-1,也就是说0点左侧..

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一致性哈希的基本原理

一致性哈希算法是将每个Node节点映射到同一个圆上。将各Nodekey采用hash计算,可得到一个整数数组。将该数组排序后,首尾相连即是一个圆。如下图所示

图解一致性哈希算法的基本原理

 

简单来说,一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希环如下:

图解一致性哈希算法的基本原理

 

整个空间按顺时针方向组织,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……直到2^32-1,也就是说0点左侧的第一个点代表2^32-1, 0和2^32-1在零点中方向重合,我们把这个由2^32个点组成的圆环称为Hash环

假如有4个服务器节点,分别为NodeA、NodeB、NodeC和NodeD,根据他们的IP或者服务名称计算hash值对2^32取模就可以分别得到它们在圆环上的位置。

图解一致性哈希算法的基本原理

 

接下来使用如下算法定位数据访问到相应服务器:  将数据key使用相同的函数Hash函数计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针找到的第一个服务器就是其本次访问的服务器。

 

容错性和可扩展性

 

假如Node C此时宕机,A、B、D节点不受影响,受影响的是此节点C到其前面一个节点(Node B)之间的环空间会受影响。但是如果我们在Node C宕机时及时将其从圆环中移除,则原本可能受影响的环空间可以沿着顺时针找到下一个节点(Node D)

图解一致性哈希算法的基本原理

 

 

新增节点X,那么节点X到其前面一个节点(Node B)环上的对象会从原本请求的节点(Node D)调整到Node X节点上。所以一致性哈希算法有非常好的容错性和可扩展性。 

图解一致性哈希算法的基本原理

 

解决Hash环的倾斜问题

一致性Hash算法在服务节点太少时,往往会出现节点分布不均匀的情况,如下图所示

图解一致性哈希算法的基本原理

 

这样就导致服务器请求不均衡,请求到Node A上的对象远远大于请求到节点B上的对象。为了解决哈希环倾斜的问题往往在实际应用一致性哈希算法时会引入虚拟节点

这些由实际节点虚拟复制而来的节点被称为“虚拟节点”,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器IP或主机名的后面增加编号来实现。

 

例如上面的情况,可以为每台服务器计算三个虚拟节点,于是可以分别计算 “Node A#1”、“Node A#2”、“Node A#3”、“Node B#1”、“Node B#2”、“Node B#3”的哈希值,于是形成六个虚拟节点:

图解一致性哈希算法的基本原理

 

由于hash是随机的,所以虚拟节点越多hash环上的节点分布就会越均匀

图解一致性哈希算法的基本原理

 

一致性哈希的性质

1.平衡性(Balance)

平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。

 

2.单调性(Monotonicity)

单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲区加入到系统中,那么哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲区中去,而不会被映射到旧的缓冲集合中的其他缓冲区。简单的哈希算法往往不能满足单调性的要求,如最简单的线性哈希:x = (ax + b) mod (P),在上式中,P表示全部缓冲的大小。不难看出,当缓冲大小发生变化时(从P1到P2),原来所有的哈希结果均会发生变化,从而不满足单调性的要求。哈希结果的变化意味着当缓冲空间发生变化时,所有的映射关系需要在系统内全部更新。而在P2P系统内,缓冲的变化等价于Peer加入或退出系统,这一情况在P2P系统中会频繁发生,因此会带来极大计算和传输负荷。单调性就是要求哈希算法能够应对这种情况。

 

3. 分散性(Spread)

在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。

 

4. 负载(Load)

负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。

 

5. 平滑性(Smoothness)

平滑性是指缓存服务器的数目平滑改变和缓存对象的平滑改变是一致的。

 

以上内容主要整理自:https://blog.csdn.net/my8688/article/details/85264880

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164578.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 前端基础:100道CSS面试题总结

    前端基础:100道CSS面试题总结前言CSS是层叠样式表(CascadingStyleSheets)的简称。CSS主要作用是美化网页、布局页面。CSS规则主要由两个主要部分构成:选择器及一条或多条声明。在前端基础面试中,CSS是不会缺席的,下面就给大家分享下CSS的常见面试题。CSS面试题:介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的?CSS选择符有哪些?::before和:after中双冒号和单冒号有什么区别?解释一下这2个伪元素的作用。伪类与伪元素的区别CSS中

    2022年5月27日
    35
  • 字符指针 赋值

    字符指针 赋值字符串赋值给字符指针(char*a=“hello”)的正确理解方式 对于语句 char*a=”hello”;       对于这个声明方式,会造成的误解是:声明了一个字符指针(它会指向一个位置),将“字符串”赋值给指针表达式”*a”所指向的地址。但正解是:声明了一个字符指针后,并用字符串常量的第一个字符的地址赋值给指针变量a。       即正确顺序是:1.分配

    2022年7月11日
    16
  • request.getParameterValues与request.getParameter的区别

    request.getParameterValues与request.getParameter的区别一、简单的对比request.getParameter用的比较多,相对熟悉  request.getParameterValues(String  name)是获得如checkbox类(名字相同,但值有多个)的数据。  接收数组变量,如checkobx类型    request.getParameter(String  name)是获得相应名的数据,

    2022年7月22日
    7
  • 盘点多款国产Linux桌面操作系统[通俗易懂]

    盘点多款国产Linux桌面操作系统[通俗易懂]关注、星标公众号,不错过精彩内容编辑:strongerHuang微信公众号:strongerHuang素材来源:百度百科、网络国产操作系统多为以Linux为基础二次开发的操作系统。2014年4月8日起,美国微软公司停止了对WindowsXPSP3操作系统提供服务支持,这引起了社会和广大用户的广泛关注和对信息安全的担忧。工信部对此表示…

    2022年5月17日
    59
  • Java中的构造方法[通俗易懂]

    Java中的构造方法[通俗易懂]简述前言:【08-10】构造方法   定义:就是类构造对象时调用的方法,主要用来实例化对象。构造方法分为无参构造方法、有参构造方法。   概念:构方法是一种特殊的“成员方法”     1,构造方法作用:(1)构造出来一个类的实例(2)对构造出来个一个类的实例(对象)初始化     2,构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有 …

    2022年7月8日
    23
  • java helloworld源代码_Java Hello World源代码notepad++版

    java helloworld源代码_Java Hello World源代码notepad++版Notepad++中写JavaHelloWorld代码并运行,步骤如下:1、在E:\CodeDemo\Java文件夹下(你也可以选择自己的文件夹)新建一个txt文本文件。如果没有NotePad++,请去官网下载安装。2、重命名为Hello.java,在弹出对话框单击是。3、右单击新建的Hello.java文件弹出快捷菜单,使用editwithnotepad++编辑Hello.java文件…

    2022年5月28日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号