[梁山好汉说IT] 如何理解一致性Hash

0x00 摘要

用梁山酒店分配客人为例来理解一致性Hash。

0x01. 与经典哈希方法的对比

  • 经典哈希方法:总是假设内存位置的数量是已知且固定不变的。因为hash映射依赖节点/内存位置,所以如果需要变化集群,需要重新计算每一个key的哈希值。哈希表(服务器数量)大小的变更实际上干扰了所有映射。

  • 一致性哈希:某种虚拟环结构。位置数量不再固定,环有无限数量的点,服务器节点可以放置在环上的随机位置。哈希表(服务器数量)大小改变会导致 只有一部分请求(相对于环分配因子)会受到特定的环变更的影响。

0x02. 一致性哈希如何处理请求

如何决定哪个请求将由哪个服务器节点来处理?如果我们假设环是有序的,以便环的顺时针遍历与位置地址的递增顺序对应,那么每个请求可以由最先出现在该顺时针遍历中的那个服务器节点来处理。

也就是说,地址高于请求地址的第一个服务器节点负责处理该请求。如果请求地址高于最高寻址节点,它由最小地址的服务器节点来处理,因为环遍历以圆形方式进行。

从理论上来说,每个服务器节点“拥有”哈希环的一个区间,进入该区间的任何请求将由同一服务器节点来处理。

现在,如果其中一个服务器节点出现故障,下一个服务器节点的区间就变宽,进入该区间的任何请求都将进入到新的服务器节点,该怎么办?那就需要重新分配的是仅仅这一个区间(与出现故障的服务器节点对应),哈希环的其余部分和请求/节点分配仍然不受影响。

0x03. 一致性哈希的关键点:

按照常用的hash算法来将对应的key哈希到一个具有2^32次方个桶的空间中,即0 ~(2^32)-1的数字空间。我们可以将这些数字头尾相连,想象成一个闭合的环形。

这个就是关键点,就是部署服务器的时候,服务器的序号空间已经是1~2^32。服务器可以分配1~2^32中任一序号。

0x04. 梁山如何处理

经典算法:

梁山4个酒店,按照顺序其序号是1,2,3,4。这个1~4序号就是固定的,不能修改的。

哈希函数:客人姓名笔画/4,按照余数分配到这4个酒店中。

如果减少一个酒店,则客人按照姓名笔画/3,都得重新分配酒店

如果增加一个酒店,则客人按照姓名笔画/5,都得重新分配酒店

一致性算法:

预先就把服务器的序号空间(现在~未来)想好了,定为100个桶。就是在未来可见的年份内,100个肯定够了。

哈希函数:客人姓名笔画/100.

酒店/客人分配规则如下:

  • 酒店1负责 hash(x)--> 1~20,即客人姓名笔画/100位于1~20之间。

  • 酒店2负责 hash(x)--> 21~40,

  • 酒店3负责 hash(x)--> 41~60,

  • 酒店4负责 hash(x)--> 61~100,

客人住店规则如下:

  • a. 客人来了,姓氏笔画/100,得到余数。去余数对应的酒店住。比如余数3住到酒店1,余数22则住到酒店2......

  • b. 如果该酒店出问题关门了,就去比所有 "比余数大的酒店" 中最小那个住。以此类推。比如酒店1挂了,就去酒店2,酒店2挂了去3。

  • c. 如果最大酒店也出问题关门了,就转圈回到最小酒店住。即如果酒店4挂了去酒店1.

异常处理:

  • 减少酒店。如果酒店3挂了,则原来去酒店3的客人去酒店4,原来去酒店4的客人还是酒店4. 这样只有酒店4受到影响,1,2号酒店客人不用搬家。

  • 增加酒店。如果增加了一个酒店5.则需要对 酒店/客人分配规则 做改变。让4号酒店负责61~80,5号酒店负责81~100。这样4号点原有部分客人要迁移到5号。

关键点:

可以看出来,关键在于服务器的序号空间早就确定了是一个大数字100。当然这是梁山。对于其他真实案例可能是2^32。

具体分配酒店的算法,是可以融入到hash中。即酒店号码可能就是21,41,61....

0x05. 参考

https://blog.csdn.net/gerryke/article/details/53939212

https://blog.csdn.net/cb_lcl/article/details/81448570

https://www.iteblog.com/archives/2499.html

http://www.zsythink.net/archives/1182/

https://www.sohu.com/a/239283928_463994

[梁山好汉说IT] 如何理解一致性Hash的更多相关文章

  1. [梁山好汉说IT] 如何理解脑裂问题

    [梁山好汉说IT] 如何理解脑裂问题 这个系列是通过梁山好汉的例子来阐述一些IT概念. 1. 问题描述 Split-brain, 就是在集群环境中,因为异常情况发生后,产生两个子集群.每个子集群都选出 ...

  2. 理解一致性Hash算法

    简介 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CAR ...

  3. Hash哈希(二)一致性Hash(C++实现)

    一致性Hash 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,经常用于分布式.负载均衡等. 原理 一致哈希是 ...

  4. 百度资深架构师带你深入浅出一致性Hash原理

    一.前言 在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用. 但是普通的余数h ...

  5. 浅尝一致性Hash原理

    写在前面 在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用.但是普通的余数ha ...

  6. 一致性hash在分布式系统中的应用

    场景 如果要设计一套KV存储的系统,用户PUT一个key和value,存储到系统中,并且提供用户根据key来GET对应的value.要求随着用户规模变大,系统是可以水平扩展的,主要要解决以下几个问题. ...

  7. 搞懂分布式技术11:分布式session解决方案与一致性hash

    搞懂分布式技术11:分布式session解决方案与一致性hash session一致性架构设计实践 原创: 58沈剑 架构师之路 2017-05-18 一.缘起 什么是session? 服务器为每个用 ...

  8. 深入浅出一致性Hash原理

    转自:https://www.jianshu.com/p/e968c081f563 一.前言 在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务 ...

  9. 一致性hash理解、拜占庭将军问题解读和CAP理论总结

    一致性hash理解 白话概述: 比如说存储图片,有10台服务器用来存储,对图片名进行hash(pic_name)%10得到的值就是图片存放的服务器序号.这是正常的hash算法分散图片存储.但是有一天, ...

随机推荐

  1. 【NS2】添加mUDP、mUdpSink和mTcpSink模块

    根据柯老师的教材可知,mUDP是UDP的延伸,除了具有UDP的功能外,还能记录所发送的包的信息.mUdpSink可以把接收到的包的信息记录 到文件中.mTcpSink是TCPsink的延伸,除了具有T ...

  2. Plupload的上传机制

    plupload支持多文件上传.经过测试发现,plupload在上传多个文件时,会把多个文件拆分成单个的一个一个上传.

  3. websocket实现五子棋联机对战

    GoBang.html // 对弈的页面 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&qu ...

  4. MySQL按天,按周,按月,按时间段统计【转载】

    自己做过MySQL按天,按周,按月,按时间段统计,但是不怎么满意,后来找到这位大神的博客,转载一下,谢谢这位博主的分享 知识点:DATE_FORMAT 使用示例 select DATE_FORMAT( ...

  5. @codeforces - 708D@ Incorrect Flow

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个有源点与汇点的图 G,并对于每一条边 (u, v) 给定 ...

  6. Android 设置ImageView宽度固定,其高度按比例缩放适应

    今天和项目经理对喷了一下,他说在应用的列表数据中的图片应该宽度固定,高度按比例缩放自适应,我说,那岂不是很丑!直接让运营那边把图片处理成固定宽高比不就好了,省的我客户端麻烦了. 这家伙不同意,为毛呢, ...

  7. Activiti快速入门项目-kft-activiti-demo

    1.项目简介 1.1 项目信息 本项目旨在让Activiti初学者可以快速入门,使用工作流里面的请假流程作为Activiti企业实战的Hello World. 简单通过这个实例说明如何结合流程与业务, ...

  8. H3C TCP连接的建立

  9. H3C 802.11无线网络的介质访问控制

  10. Taglib自定义万能标签扩展 DownLoad

    http://www.thinkphp.cn/extend/538.html 用ThinkPHP的标签做网站觉得不够快速,就自己写了一个扩展,感觉挺好的,分享出来,给有需要的TPER. 复制代码 &l ...