[梁山好汉说IT] 如何理解一致性Hash
[梁山好汉说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的更多相关文章
- [梁山好汉说IT] 如何理解脑裂问题
[梁山好汉说IT] 如何理解脑裂问题 这个系列是通过梁山好汉的例子来阐述一些IT概念. 1. 问题描述 Split-brain, 就是在集群环境中,因为异常情况发生后,产生两个子集群.每个子集群都选出 ...
- 理解一致性Hash算法
简介 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CAR ...
- Hash哈希(二)一致性Hash(C++实现)
一致性Hash 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,经常用于分布式.负载均衡等. 原理 一致哈希是 ...
- 百度资深架构师带你深入浅出一致性Hash原理
一.前言 在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用. 但是普通的余数h ...
- 浅尝一致性Hash原理
写在前面 在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用.但是普通的余数ha ...
- 一致性hash在分布式系统中的应用
场景 如果要设计一套KV存储的系统,用户PUT一个key和value,存储到系统中,并且提供用户根据key来GET对应的value.要求随着用户规模变大,系统是可以水平扩展的,主要要解决以下几个问题. ...
- 搞懂分布式技术11:分布式session解决方案与一致性hash
搞懂分布式技术11:分布式session解决方案与一致性hash session一致性架构设计实践 原创: 58沈剑 架构师之路 2017-05-18 一.缘起 什么是session? 服务器为每个用 ...
- 深入浅出一致性Hash原理
转自:https://www.jianshu.com/p/e968c081f563 一.前言 在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务 ...
- 一致性hash理解、拜占庭将军问题解读和CAP理论总结
一致性hash理解 白话概述: 比如说存储图片,有10台服务器用来存储,对图片名进行hash(pic_name)%10得到的值就是图片存放的服务器序号.这是正常的hash算法分散图片存储.但是有一天, ...
随机推荐
- 初始化Redis密码
在配置文件/etc/redis/redis.conf中有个参数: requirepass 这个就是配置redis访问密码的参数: 比如 requirepass test123: (需重启Redis才能 ...
- java对象转化为json字符串并传到前台
package cc.util; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import ...
- Linux 用户he用户组管理
8)系统中有一类用户称为伪用户(psuedo users). 这些用户在/etc/passwd 文件中也占有一条记录,但是不能登陆,因为他们的登陆shell 为空,他们的存在主要是方便系统管理,满足 ...
- MySQL列出当前月的每一天
因为工作的原因,要用MySQL列出当前月份每一天的日期,自己查了下网上资料都是列出最近一个月的日期的解决方案,自己根据查到的的方案,修改成了下面两个方案,在此记录下: 方案一: SELECT date ...
- 【codeforces 798D】Mike and distribution
[题目链接]:http://codeforces.com/contest/798/problem/D [题意] 让你选一个下标集合 p1,p2,p3..pk 使得2*(a[p1]+a[p2]+..+a ...
- Android教程-02 在程序中输出Log
视频教程,建议采用超清模式观看 在Android中一般都用Log输出日志,常见的有5个不同的级别 Log.v() Log.d() Log.i() Log.w() Log.e() 当然很多程序员还比较习 ...
- fakeroot与sudo的区别
fakeroot 可以用来模拟 root 权限,以便建立特定权限与档案拥有者的压缩文件案(tar, ar, .deb 等).透过 LD_PRELOAD 的 dynamic loader 功能,用户不必 ...
- SpringBoot 集成 Activiti 一路踩得坑
由于项目需要,本人开始在项目Spring boot 中集成工作流引擎Activiti.由于第一次集成,一路上步步都是坑,怪我没有先去看官方文档.现将一路上遇到的问题一一记录. 一. 环境配置 1.项目 ...
- javascript和jquery 移除事件 和 改变样式
javascript移除事件: document.getElementById("word").onmouseover = null; javascript改变样式: docume ...
- 怎样判断一个jquery对象是否为空jquery对象
if ( $('#myDiv').length ){} http://stackoverflow.com/questions/47... 也可以直接判断$('#myDiv')[0]===undefin ...