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

图解一致性哈希算法的基本原理一致性哈希的基本原理一致性哈希算法是将每个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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 魔兽争霸微操教学(精华篇)「建议收藏」

    魔兽争霸微操教学(精华篇)「建议收藏」基础操作:用键盘制造单位,释放魔法,使用物品。魔兽中的一切东西都可以用快捷键来完成,而鼠标只是起到一个定位的作用。比如,暗夜做小精灵,你可以用鼠标点击基地里精灵的头像,也可以直接按w;或者暗夜做月亮

    2022年7月1日
    29
  • UITabBarController详细说明(简介和设置)

    UITabBarController详细说明(简介和设置)

    2022年1月14日
    44
  • 监听手机录音

    监听手机录音

    2021年11月14日
    160
  • goland 2021 激活码破解方法

    goland 2021 激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    193
  • sql语句练习50题(Mysql版)

    sql语句练习50题(Mysql版)习题来源于网络,sql语句是自己写的。欢迎指正。表名和字段–1.学生表Student(s_id,s_name,s_birth,s_sex)–学生编号,学生姓名,出生年月,学生性别–2.课程表Course(c_id,c_name,t_id)––课程编号,课程名称,教师编号–3.教师表Teacher(t_id,t_name)–教师编号,教师姓名–4

    2022年10月6日
    0
  • 遗传算法经典实例matlab代码_退火算法与遗传算法

    遗传算法经典实例matlab代码_退火算法与遗传算法经典遗传算法及简单实例(MATLAB)1.遗传算法简单介绍1.1理论基础1.2算法要点1.1编码1.2适应度函数1.3基本流程2.雪兔实例1.遗传算法简单介绍1.1理论基础整个算法的基础就是达尔文的生物进化论,“物竞天择,适者生存”这句话已经是常识了。雪兔的故事:东北那旮瘩,有群原始雪兔,刚从未知物种进化而来,五颜六色(表现型)漂亮极了,称之为I(0)。(注意:种群初始化)入夏了,雪兔们出来觅食,浅色兔在草地中无所遁形,被雪狐收割了一波(大批浅色+小批深色)。入冬了,雪

    2022年9月13日
    0

发表回复

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

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