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

一致性哈希算法

时间:2022-08-21 20:00:35浏览次数:88  
标签:缓存 Hash 算法 哈希 一致性 服务器 节点


一致性哈希算法主要应用于Redis分布式缓存

问题引出

在单节点的情况下,Redis缓存不用担心命中率的问题,但是一旦上升到分布式的架构中,可能会造成一台机器有缓存而另一台机器没有缓存的情况,基于此使用一致性Hash算法可以有效地解决在分布式存储结构下动态增加和删除节点后尽量有多的请求命中原来的服务器节点。

解决问题

哈希算法

场景描述:假设有3个redis节点用于存储数据,这3台Redis节点的编号是0,1,2。如果希望将数据均匀的存储在这3个节点上,可以采用对数据的key进行Hash计算,将Hash计算后的结果对redis节点的数量进行取模运行,通过取模后的结果,决定将数据存在哪一个Redis节点上。hash(key)% N

当下次访问这个数据时,只需要再次对数据的key进行Hash计算,即可得出数据在哪个redis上,然后从对应的redis节点上获取数据。

 

 

存在的问题:当增加redis节点或者当部分redis节点挂掉后,再进行hash计算然后对节点的数量取模时,就无法找到对应的数据,造成大量的缓存同时失效。

 

 

为了能够尽量使得Redis宕机的情况下缓存命中率损耗最小

一致性哈希!

一致性Hash算法是对232取模。 Hash(服务器的IP地址)% 232 (余数:0~232-1),将232个数想象成由(0~232-1)共232个点组成的圆环,把这个圆环称为Hash环。

 

 

当存储数据的时候,对数据的key进行相同的哈希算法,将数据映射到哈希环上

 

 

如图有三台服务器,三台服务器A,B,C上分别缓存了数据a,b,c,即使这时结点B宕机了,对于缓存数据b也会存储到服务器A上而不用像哈希算法那样再哈希导致缓存失效。

如果使用之前的hash算法对服务器的数量取模,那么当服务器的数量发生改变时,就会找不到数据,所有的缓存将会同时时间失效。而使用一致性Hash算法,服务器数量如果发生改变,并不是所有缓存都会失效,而是只有部分缓存会失效。

 

 

一致性哈希的问题

以上都是理想状态下,服务器的分布很散列但是由于哈希算法设计的很简单无法保证数据散列,所以再绝大多数情况下,这三台服务器在哈希环上的映射很接近,更接近于图中的这种情况,大量的缓存存储在一台服务器上

 

 

Hash环的偏斜问题

假设在理想的情况下,3台服务器将会均匀的映射在Hash环上,但是现实可能是3台服务器在Hash环上的映射的位置挨的比较近。那么,将会有很多数据被存储在某一台服务器上。这样,其它服务器并没有得到平均的充分的利用。如果此时,那个节点出现故障,造成的损失也是最大的。

解决方法

使用虚拟节点,虚拟节点是实际节点在Hash环上的一个复制品,一个实例节点可以对应多个虚拟节点。引入虚拟节点后,节点在Hash环上的分布就变得均衡了。虚拟节点越多,Hash环上的节点就越多,数据被均匀分布的概率就越大。

 

 

标签:缓存,Hash,算法,哈希,一致性,服务器,节点
From: https://www.cnblogs.com/ccywmbc/p/16610686.html

相关文章

  • 算法提高课 第二章 迭代加深、双向DFS、IDA*
    一、迭代加深适用场景:某些分支的层数特别深,但答案在比较浅的层数里170.加成序列剪枝一:优先枚举较大的数减少搜索层数剪枝二:排除等效冗余前面任意两个数的和可能相等......
  • 最小生成树Kruskal+Prim算法
    最小生成树给定一张边带权的无向图G=(V,E),n=|V|,m=|E|。由V中全部n个顶点和E中n-1条边构成的无向连通子图被称为G的一棵生成树。边的权值之和最小的生成树被称为无向图G的最......
  • 11.垃圾回收相关算法
    目录11.1垃圾回收概述1.什么是垃圾2.为什么需要GC11.2垃圾回收相关算法1.标记阶段:引用计数算法2.标记阶段:可达性分析算法3.对象的finalization机制4.MAT与JProfiler的G......
  • Vue/uniapp使用雪花算法生成随机ID
    安装snowflake-id插件npmisnowflake-id 页面导入雪花插件importSnowflakeIdfrom"snowflake-id"; 方法内使用雪花算法constsnowflake=newSnowflak......
  • 算法总结
    1.最近请求次数写一个 RecentCounter 类来计算特定时间范围内最近的请求。请实现RecentCounter类:RecentCounter()初始化计数器,请求数为0。intping(intt)......
  • 进程调度算法
    操作系统有三大调度机制,分别是进程调度、内存页面置换和磁盘调度算法。进程调度算法定义进程调度算法也称CPU调度算法,毕竟进程是由CPU调度的,当CPU空闲时,操作系统......
  • 设计模式学习(5)一致性
    组合模式在文件系统中,文件夹和文件具有一致性将文件夹和文件当作同一种东西看示例模拟一个文件系统。文件和文件夹都具有名称和大小,我们将其抽象成Entry。但是文件......
  • 【2022牛客多校】第五场 Crazy Thursday 二分+字符串哈希
    https://ac.nowcoder.com/acm/contest/33190/G题意给你一个长为n的字符串s,求s中分别以'k'、'f'、'c'结尾的回文串数量\(n<=5e5\)思路首先暴力枚举区间端点加判断,为......
  • Hadoop常见的文件格式及压缩算法
    前言 该文章中将会整理一些大数据中常见的文件格式及压缩算法的理论知识,作为后期实践的理论指导。理论+实践才会更方便用这些文件格式和压缩算法。    目前hadoop中......
  • codeforces963D. Frequency of String【哈希】
    我的腿让我停下,可是我的心却不许我这么做今天又是为了明知多半不可能的事情奔波一早,一天里,出了很多丑,犯了很多错,见了很多人,有了很多意想不到的收获,我选择了我的生存方式......