一致性hash算法的理解

简介:

用hash做缓存,假如有三台服务器,1,2,3,有三万张图片,我想将图片平均缓存到我三台服务器上,一个服务器大概一万张,怎么去实现这个办法呢,可以用hash来取余数进行操作,加入我们是以图片的名字作为key进行hash计算,hash (图片名称)%N 其中N为我们服务器的个数,我们将hash(图片名称)这一部分进行计算后得到的是一个正数,然后除以服务器的数目进行取余数,结果将会是0,1,2三个数,对应我们的服务器的编号,当我们作为客户端去请求图片的时候,图片已经进行过hash运算了,直接找到对应服务器的编号进行图片的访问,这样解决了我需要遍历所有的服务器进行查找
image
那如果我缓存的服务器的数量减少或者增加,如果还是按照原来的算法走,必定会造成缓存数据的丢失,会去向后端的服务器去请求,如果有一台缓存服务器发生了故障,那我原来缓存的位置必定会发生改变,原来本该运算后要进行缓存到某一台服务器的图片,现在找不到对应缓存服务器,肯定会发生缓存的雪崩

所以出现了一致性hash算法
相当于将服务器和图片分别hash到我的hash环上进行就近缓存,hash环就是对2^32次方进行取模,从0开始一直到2^32,均匀分布在一个圆环(一个比方),0的顺时针方向的第一位为1,逆时针方向第一位为2^32,大概如下图
image

具体就是比方我有三个服务器A,B ,C对其进行 hash (服务器Aip)%2^32 得出来的一定是一个整数,而且一定是在0--2^32之间,那么这个数就会分布在hash环上对应的位置,相同的B,C都一样,假设我们hash过后ABC的位置如下图
image
然后我们将需要缓存图片的key进行hash,它的hash值也会分布在我的hash环上,
image
如上图,我hash到了A和C之间,图片的存储规则是顺时针方向的存储,所以应该存储到A,如果有四张的话如下图
image
那如果我们的hash算法将服务器和hash的图片存放位置比较相近,类似于;
image
所有的缓存都集中存储到了A一台,只有5到了B,那么这样A的压力就不言而喻,没有均匀可言了,辛亏hash环可以添加缓存服务器的虚拟节点,类似于虚拟机,一台实机可以虚拟多台,类似于这样:
image
这样的话就会尽可能的把缓存都均衡放在各个服务器

一致性hash算法的优势在哪:
一个是当我有一台缓存节点挂了之后,缓存的存储不会受太大的影响,
image
我们将b节点拿走,本来要在B节点存储的3,因为找不到B服务器,而遵循规则缓存到C,而4的缓存节点不会发生改变,这就是一致hash的优点,如果发生服务器的增加或者减少只有部分的缓存会失效,不造成全盘皆输的可能

一致hash到此结束。。。。。。。。

目录
相关文章
|
4月前
|
消息中间件 算法 分布式数据库
Raft算法:分布式一致性领域的璀璨明珠
【4月更文挑战第21天】Raft算法是分布式一致性领域的明星,通过领导者选举、日志复制和安全性解决一致性问题。它将复杂问题简化,角色包括领导者、跟随者和候选者。领导者负责日志复制,确保多数节点同步。实现细节涉及超时机制、日志压缩和网络分区处理。广泛应用于分布式数据库、存储系统和消息队列,如Etcd、TiKV。其简洁高效的特点使其在分布式系统中备受青睐。
|
4月前
|
算法 分布式数据库
Paxos算法:分布式一致性的基石
【4月更文挑战第21天】Paxos算法是分布式一致性基础,由Leslie Lamport提出,包含准备和提交阶段,保证安全性和活性。通过提案编号、接受者和学习者实现,广泛应用于分布式数据库、锁和配置管理。其简单、高效、容错性强,影响了后续如Raft等算法,是理解分布式系统一致性关键。
|
1月前
|
存储 算法 NoSQL
(七)漫谈分布式之一致性算法下篇:一文从根上儿理解大名鼎鼎的Raft共识算法!
Raft通过一致性检查,能在一定程度上保证集群的一致性,但无法保证所有情况下的一致性,毕竟分布式系统各种故障层出不穷,如何在有可能发生各类故障的分布式系统保证集群一致性,这才是Raft等一致性算法要真正解决的问题。
77 11
|
1月前
|
存储 算法 索引
(六)漫谈分布式之一致性算法上篇:用二十六张图一探Raft共识算法奥妙之处!
现如今,大多数分布式存储系统都投向了Raft算法的怀抱,而本文就来聊聊大名鼎鼎的Raft算法/协议!
|
1月前
|
存储 算法 Java
(五)漫谈分布式之一致性算法篇:谁说Paxos晦涩难懂?你瞧这不一学就会!
没在时代发展的洪流中泯然于众的道理很简单,是因为它们并不仅是空中楼阁般的高大上理论,而是有着完整落地的思想,它们已然成为构建分布式系统不可或缺的底层基石,而本文则来好好聊聊分布式与一致性思想的落地者:Paxos与Raft协议(算法)。
|
2月前
|
缓存 负载均衡 算法
(四)网络编程之请求分发篇:负载均衡静态调度算法、平滑轮询加权、一致性哈希、最小活跃数算法实践!
先如今所有的技术栈中,只要一谈关于高可用、高并发处理相关的实现,必然会牵扯到集群这个话题,也就是部署多台服务器共同对外提供服务,从而做到提升系统吞吐量,优化系统的整体性能以及稳定性等目的。
|
4月前
|
缓存 负载均衡 算法
C++如何实现一致性算法
一致性哈希是一种用于分布式系统的负载均衡算法,旨在减少服务器增减导致的数据迁移。当有N台服务器时,通过哈希环将请求均匀分布到每台服务器,每台处理N/1的请求。若使用缓存如Redis,可进一步处理高并发场景。算法将哈希值空间视为环形,服务器和请求哈希后定位到环上,按顺时针方向找到第一台服务器作为负载目标。提供的C++代码实现了MD5哈希函数,以及一致性哈希算法的物理节点、虚拟节点和算法本身,以实现节点的添加、删除和请求映射。
35 1
C++如何实现一致性算法
|
3月前
|
算法 Java
Java中常用hash算法总结
Java中常用hash算法总结
29 0
|
4月前
|
算法 程序员 分布式数据库
分布式一致性必备:一文读懂Raft算法
Raft算法是一种用于分布式系统中复制日志一致性管理的算法。它通过选举领导者来协调日志复制,确保所有节点数据一致。算法包括心跳机制、选举过程、日志复制和一致性保证。当领导者失效时,节点会重新选举,保证高可用性。Raft易于理解和实现,提供强一致性,常用于分布式数据库和协调服务。作者小米分享了相关知识,鼓励对分布式系统感兴趣的读者进一步探索。
989 0
|
4月前
|
存储 算法 安全
5. raft 一致性算法
5. raft 一致性算法