论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
谈谈一致性哈希算法
谈谈一致性哈希算法
飞不高
金牌会员
|
2023-6-2 17:23:39
|
显示全部楼层
|
阅读模式
楼主
主题
895
|
帖子
895
|
积分
2685
一致性哈希算法是1997年由麻省理工的几位学者提出的用于解决分布式缓存中的热点问题。大家有没有发现,我们之前介绍的例如快排之类的算法是更早的六七十年代,此时分布式还没有发展起来,
大家往往还在提高单机性能。但是九十年代开始,逐渐需要用分布式集群来解决大型问题,相应的算法研究也就应运而生。
在说到一致性哈希算法,我们还是得先从缓存的发展谈起:
缓存,我们一般是用来提速的,当规模或者说数据量小时,我们往往用单机来部署一套缓存系统即可,如下图:
多台客户端在查询数据时,只要根据key进入缓存服务器查询到自己想要的内容即可。
但是随着业务的发展,单一的缓存服务器往往无法支撑住我们的业务需要。比如缓存数据太大,多城多活的网络部署等,
我们就需要多台缓存服务器来支撑,如下图:
客户端需要查询缓存时,先根据哈希算法,讲key进行计算,得到哈希值。然后通过哈希值对机器数取模(%n)来判定落在哪台机器上。
这个架构很简单,也很易实现,我们就不多说了。
但是这里会存在一个缓存服务器伸缩的问题:什么意思呢?比如目前是三台,我们由于业务的需要,需要变为四台,或者变为两台。那么我们需要调整一遍所有数据所处的服务器位置,因为他们存在的位置都有可能改变。
分布式缓存本来就是为了解决大数据量问题的,此时重新调整,势必会极度影响可用性。
那么如何解决呢?
来看看一致性哈希算法的思路:
我们假设存在一个虚拟环,这个环足够大,上边存在2^32个节点,三台器机器呢,我们根据id计算出他们在环中所处的位置,如图所示:
当我们计算数据所处的缓存位置,不再是根据n来取模,而是根据2^32来取模,此时会有相当多的数据并没有落在缓存服务器所处的节点上。
那怎么办呢?我们按照顺时针方向计算,将数据落在下一个最*的顺时针节点上。
如下图所示:
这样当我们新增或者删除节点时,只会影响有限的节点上的数据,极大的缩小了受影响的节点和数据。我们只需要重新计算受影响的数据即可,但是这样还会存在新的问题:
1、缓存服务器计算出的位置不均匀,导致覆盖的节点数差异明显;
2、数据并不均衡:数据经过哈希和取模运算后,可能落在集中的一片区域中,造成对应的缓存服务器的数据特别大。
以上问题我们称之为数据倾斜。数据倾斜的程度明显后,可能会导致所解决的问题再次出现(前文中的红字部分)。
那如何解决这种问题呢?很简单,加节点,只要节点足够多,那么就会越来越趋*于*均,数据倾斜的情况就会越不突出。但是缓存服务器是有限的,并不是想加多少都可以的。
那怎么办呢?
我们可以采用虚拟缓存节点的形式解决问题。
什么是虚拟缓存节点,就是并不实际存在的缓存节点。只是一个虚拟的点。
每个真实的缓存服务器对应多个虚拟缓存节点,两者是一对多的关系,如下图所示:
虚拟节点--图中连接在环上的就是虚拟缓存节点。
真实缓存节点--Cache
每个Cache对应若干的虚拟节点。当增减Cache时,我们只要调整对应的虚拟节点所对应的数据即可。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
飞不高
金牌会员
这个人很懒什么都没写!
楼主热帖
WPF开发经验-实现自带触控键盘的TextBo ...
Java集合的lastlastIndexOfSubList()方 ...
如何在 K8S 集群范围使用 imagePullSec ...
Python批量采集百度资讯文章,如何自定 ...
【关系型数据库】事务特性及事务隔离级 ...
微信小程序集合3(百度小说+电商+仿哗 ...
自从用了 EasyExcel,导入导出 Excel ...
mysql总结
MapReduce开发
AnimateDiff论文解读-基于Stable Diffu ...
标签云
存储
服务器
浏览过的版块
数据仓库与分析
快速回复
返回顶部
返回列表