首页 > 编程语言 >谈谈一致性哈希算法

谈谈一致性哈希算法

时间:2023-06-02 17:15:20浏览次数:39  
标签:缓存 算法 虚拟 哈希 一致性 服务器 数据 节点

一致性哈希算法是1997年由麻省理工的几位学者提出的用于解决分布式缓存中的热点问题。大家有没有发现,我们之前介绍的例如快排之类的算法是更早的六七十年代,此时分布式还没有发展起来,
大家往往还在提高单机性能。但是九十年代开始,逐渐需要用分布式集群来解决大型问题,相应的算法研究也就应运而生。
在说到一致性哈希算法,我们还是得先从缓存的发展谈起:
缓存,我们一般是用来提速的,当规模或者说数据量小时,我们往往用单机来部署一套缓存系统即可,如下图:

多台客户端在查询数据时,只要根据key进入缓存服务器查询到自己想要的内容即可。
但是随着业务的发展,单一的缓存服务器往往无法支撑住我们的业务需要。比如缓存数据太大,多城多活的网络部署等,
我们就需要多台缓存服务器来支撑,如下图:

客户端需要查询缓存时,先根据哈希算法,讲key进行计算,得到哈希值。然后通过哈希值对机器数取模(%n)来判定落在哪台机器上。
这个架构很简单,也很易实现,我们就不多说了。
但是这里会存在一个缓存服务器伸缩的问题:什么意思呢?比如目前是三台,我们由于业务的需要,需要变为四台,或者变为两台。那么我们需要调整一遍所有数据所处的服务器位置,因为他们存在的位置都有可能改变。

分布式缓存本来就是为了解决大数据量问题的,此时重新调整,势必会极度影响可用性。那么如何解决呢?
来看看一致性哈希算法的思路:
我们假设存在一个虚拟环,这个环足够大,上边存在2^32个节点,三台器机器呢,我们根据id计算出他们在环中所处的位置,如图所示:

 

当我们计算数据所处的缓存位置,不再是根据n来取模,而是根据2^32来取模,此时会有相当多的数据并没有落在缓存服务器所处的节点上。
那怎么办呢?我们按照顺时针方向计算,将数据落在下一个最*的顺时针节点上。
如下图所示:

这样当我们新增或者删除节点时,只会影响有限的节点上的数据,极大的缩小了受影响的节点和数据。我们只需要重新计算受影响的数据即可,但是这样还会存在新的问题:
1、缓存服务器计算出的位置不均匀,导致覆盖的节点数差异明显;
2、数据并不均衡:数据经过哈希和取模运算后,可能落在集中的一片区域中,造成对应的缓存服务器的数据特别大。
以上问题我们称之为数据倾斜。数据倾斜的程度明显后,可能会导致所解决的问题再次出现(前文中的红字部分)。
那如何解决这种问题呢?很简单,加节点,只要节点足够多,那么就会越来越趋*于*均,数据倾斜的情况就会越不突出。但是缓存服务器是有限的,并不是想加多少都可以的。
那怎么办呢?

我们可以采用虚拟缓存节点的形式解决问题。什么是虚拟缓存节点,就是并不实际存在的缓存节点。只是一个虚拟的点。
每个真实的缓存服务器对应多个虚拟缓存节点,两者是一对多的关系,如下图所示:

虚拟节点--图中连接在环上的就是虚拟缓存节点。
真实缓存节点--Cache
每个Cache对应若干的虚拟节点。当增减Cache时,我们只要调整对应的虚拟节点所对应的数据即可。

 

标签:缓存,算法,虚拟,哈希,一致性,服务器,数据,节点
From: https://www.cnblogs.com/jilodream/p/17452331.html

相关文章

  • lca算法
    #include<bits/stdc++.h>usingnamespacestd;intmain(){intn,m,s;scanf("%d%d%d",&n,&m,&s);intN=20;vector<vector<int>>adj(n+1);for(inti=1;i<n;i++){intu,v;scan......
  • 装饰器补充(算法)
    算法之二分法就是将一个列表或(其他容器)里面的数排列组合,将要找里面的数的时候从中间切分比较留半,然后再重复,最终至找到或者最后切分为空1x=[11,2,3,44,55,66,77,88,99,100,23,34,45,56,67]2x.sort()3defbijiao(l):4iflen(l)==0:5......
  • 算法刷题记录:日历中的数字
    题目链接https://ac.nowcoder.com/acm/contest/19859/B题目分析很简单的一道数位统计的题目其中年和月是乘法原理。(固定住年和月,枚举该月有几天,所以是乘法原理)当x=0并且month<10时,月需要特判一位数的情况,是加法原理日是加法原理AC代码//Problem:日历中的数字//Cont......
  • 强化学习基础篇【1】:基础知识点、马尔科夫决策过程、蒙特卡洛策略梯度定理、REINFORCE
    强化学习基础篇【1】:基础知识点、马尔科夫决策过程、蒙特卡洛策略梯度定理、REINFORCE算法1.强化学习基础知识点智能体(agent):智能体是强化学习算法的主体,它能够根据经验做出主观判断并执行动作,是整个智能系统的核心。环境(environment):智能体以外的一切统称为环境,环境在与智能体......
  • 强化学习基础篇[2]:SARSA、Q-learning算法简介、应用举例、优缺点分析
    强化学习基础篇[2]:SARSA、Q-learning算法简介、应用举例、优缺点分析1.SARSASARSA(State-Action-Reward-State-Action)是一个学习马尔可夫决策过程策略的算法,通常应用于机器学习和强化学习学习领域中。它由Rummery和Niranjan在技术论文“ModifiedConnectionistQ-Learning(MCQL)......
  • 算法题分析:反转整数
    最近刷到了一道medium难度的算法题,比较典型,可以用语法特性和常规解法来解决。题目如下:给定一个32字节的有符号整型数字x,将x反转过来返回。如果反转x会让其数值超出32位有符号整型数字范围[-2^31,2^31-1],那么就返回0。假设运行环境不允许你存储64位整型数字(有符号或者无符号)。......
  • 算法——字符串(一)
    1、给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。1classSolution{2publicintlengthOfLongestSubstring(Strings){3intlen=s.length();4intmax=0;5intright=0;6Set<Character>set=new......
  • 最短路与生成树算法
    写在前面最短路部分的代码还是3月的,奇丑无比,大家见谅……最短路单源最短路径首先我们介绍一些基本概念。由于是单源最短路,我们定义一个起点\(s\),\(dis_u\)表示起点\(s\)到节点\(u\)的最短路长度。一般来讲,对于一条为\(w\)的边\(u\tov\),如果目前的最短路是正确......
  • 代码随想录算法训练营第二十三天|669. 修剪二叉搜索树
    [参考链接]669.修剪二叉搜索树 [代码]1#Definitionforabinarytreenode.2#classTreeNode(object):3#def__init__(self,val=0,left=None,right=None):4#self.val=val5#self.left=left6#self.right=right......
  • python算法学习——第1天
    目录1、3,5,7的倍数判定2、鸡兔同笼3、计算有n个字符串中最长的字符串长度4、输出10个不重复的英文字母5、统计一段文字的单词个数并按字母顺序排序输出6、字典合并7、最大公约数&最小公倍数8、输出全排列9、输出<=n的全部回文数10、重复元素判定1、3,5,7的倍数判定num=int(inp......