【面试题】一致性 Hash 算法是什么?它带来了哪些问题以及解决方案

目录

1、数据分片

2、数据分片会遇到的问题

3、一致性 Hash 算法


1数据分片

先让我们看一个例子吧

我们经常会用 Redis 做缓存,把一些数据放在上面,以减少数据的压力。

当数据量少,访问压力不大的时候,通常一台Redis就能搞定,为了高可用,弄个主从也就足够了;

当数据量变大,并发量也增加的时候,把全部的缓存数据放在一台机器上就有些吃力了,毕竟一台机器的资源是有限的

通常我们会搭建集群环境,让数据尽量平均的放到每一台 Redis 中,比如我们的集群中有 4 台Redis

那么如何把数据尽量平均地放到这 4 台Redis中呢?最简单的就是取模算法:

 

hash( key ) % N,N 为 Redis 的数量,在这里 N = 4 ;

看起来非常得美好,因为依靠这样的方法,我们可以让数据平均存储到 4 台 Redis 中,当有新的请求过来的时候,我们也可以定位数据会在哪台 Redis 中,这样可以精确地查询到缓存数据。
 

2数据分片会遇到的问题

但是 4 台 Redis 不够了,需要再增加 4 台 Redis ;那么这个求余算法就会变成:hash( key ) % 8 ;

那么可以想象一下,当前大部分缓存的位置都会是错误的,极端情况下,就会造成 缓存雪崩

 

3一致性 Hash 算法

一致性 Hash 算法可以很好地解决这个问题,它的大概过程是这样的:

把 0 作为起点,2^32-1 作为终点,画一条直线,再把起点和终点重合,直线变成一个圆,方向是顺时针从小到大。0 的右侧第一个点是 1 ,然后是 2 ,以此类推。

对三台服务器的 IP 或其他关键字进行 hash 后对 2^32 取模,这样势必能落在这个圈上的某个位置,记为 Node1、Node2、Node3。

然后对数据 key 进行相同的操作,势必也会落在圈上的某个位置;然后从数据落到的位置顺时针行走,第一个遇到的Node,这就是这个 key 要储存的服务器。

如果增加一台服务器或者删除一台服务器,只会影响 部分数据

但如果节点太少或分布不均匀的时候,容易造成 数据倾斜,也就是大部分数据会集中在某一台服务器上。

为了解决数据倾斜问题,一致性 Hash 算法提出了【虚拟节点】,会对每一个服务节点计算多个哈希,然后放到圈上的不同位置。
 

当然我们也可以发现,一致性 Hash 算法,也只是解决大部分数据的问题


转载自公众号:会点代码的大叔

全部评论

相关推荐

11-28 17:58
门头沟学院 Java
美团 JAVA开发 n×15.5
牛客786276759号:百度现在晋升很难的 而且云这块的业务没美团好 你看百度股价都跌成啥样了
点赞 评论 收藏
分享
无情咸鱼王的秋招日记之薛定谔的Offer:好拒信,偷了,希望有机会用到
点赞 评论 收藏
分享
10-22 19:18
上海大学 后端
jopajhhdjwnqk:水印都叠杀人书了
点赞 评论 收藏
分享
秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++ & Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
439972次浏览 4484人参与
# 春招别灰心,我们一人来一句鼓励 #
41352次浏览 523人参与
# 北方华创开奖 #
107229次浏览 598人参与
# 地方国企笔面经互助 #
7914次浏览 18人参与
# 虾皮求职进展汇总 #
113497次浏览 880人参与
# 实习,投递多份简历没人回复怎么办 #
2453683次浏览 34846人参与
# 阿里云管培生offer #
119622次浏览 2219人参与
# 实习必须要去大厂吗? #
55552次浏览 959人参与
# 同bg的你秋招战况如何? #
75178次浏览 548人参与
# 提前批简历挂麻了怎么办 #
149763次浏览 1976人参与
# 投递实习岗位前的准备 #
1195578次浏览 18546人参与
# 你投递的公司有几家约面了? #
33165次浏览 188人参与
# 双非本科求职如何逆袭 #
661770次浏览 7394人参与
# 机械人春招想让哪家公司来捞你? #
157585次浏览 2267人参与
# 如果公司给你放一天假,你会怎么度过? #
4714次浏览 53人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11214次浏览 253人参与
# 发工资后,你做的第一件事是什么 #
12359次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35521次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20068次浏览 240人参与
# 实习想申请秋招offer,能不能argue薪资 #
39205次浏览 314人参与
# 我的上岸简历长这样 #
451863次浏览 8087人参与
# 非技术岗是怎么找实习的 #
155831次浏览 2120人参与
牛客网
牛客企业服务