700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > JAVA面试又被问一致性hash算法 – java – 前端

JAVA面试又被问一致性hash算法 – java – 前端

时间:2022-02-17 17:50:37

相关推荐

JAVA面试又被问一致性hash算法 – java – 前端

偶来给大家讲讲一致性hash算法,如果有理解错误的地方,也请大家留言指正。

单台服务器

就拿Redis来举例吧,大家经常会用Redis做缓存,把一些数据放在上面,以减少数据的压力。

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

多台服务器数据分布的问题

当数据量变大,并发量也增加的时候,把全部的缓存数据放在一台机器上就有些吃力了,毕竟一台机器的资源是有限的,通常大家会搭建集群环境,让数据尽量平均的放到每一台Redis中,比如大家的集群中有三台Redis。

那么如何把数据尽量平均地放到这三台Redis中呢?最简单的就是求余算法:hash(key)%N,在这里N=3。

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

但是注意了,如果要增加一台Redis,或者三台中的一台Redis发生了故障变成了两台,那么这个求余算法就会变成:hash(key)%4或者hash(key)%2;那么可以想象一下,当前大部分缓存的位置都会是错误的,极端情况下,所有的缓存的位置都要发生改变,这样会造成【缓存雪崩】。

一致性hash算法

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

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

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

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

如果增加一台服务器或者删除一台服务器,只会影响部分小部分数据(图3)。

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

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

原谅偶的小学生字体,下一次偶一定好好地画一画图,电脑上画的那种。

偶将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。