文章目录
- 背景
- 目的
- 3大步骤
- 算法构建一致性hash环
- 服务器ip节点映射
- key落到服务器的落键规则
- 优点
- 缺点
- 代码
背景
一致性hash
算法是为了解决分布式缓存数据变动和映射问题
,某个机器坏了,分母的数量改变了,自然取于数就不行了
目的
提出一致性hash解决方案目的是:当服务器个数发生变动时候,尽量减少影响客户端到服务器的映射关系
3大步骤
算法构建一致性hash环
哈希环
![在这里插入图片描述]()
我们之前是对机器(节点)数量进行取余
,而现在一致性hash通过对2^32取模
我们把全量集设置成了分母,将整个哈希值空间组织成了一个虚拟的圆环,无论什么值都不会大过这个值
服务器ip节点映射
将集群中的每个ip节点映射到环上的某个位置
将每个服务器使用hash
进行一个哈希
,具体可以使用服务器的ip或者主机名作为关键字进行hash,这样每台机器就能确定的落在哈希环
上的位置,假如有3个服务器节点n1
,n2
,n3
,使用ip地址进行哈希后在环空间的位置如下
![在这里插入图片描述]()
key落到服务器的落键规则
我们的每个key和服务器节点使用相同的hash函数,将该key落在环上
然后在哈希环上的key顺时针
走,第一个遇到的服务器就是其应该定位到的服务器,并将该key存储
在该服务器上
![在这里插入图片描述]()
keyn6存储在noden3
keyn3存储在noden2
依次类推,存储在顺时针的第一个节点上
使用虚拟节点来解决hash不均匀问题
如果按照顺序延续,一个节点坏了,另一个节点承当前一个节点的数据,这样可能导致自身的负载上升,导致自己也挂掉了
![在这里插入图片描述]()
为了引入了一个虚拟节点
的概念
想象在环中有很多个“虚拟节点”,数据的存储会沿着环找到相对应的一个虚拟节点
,而每个虚拟节点会关联到一个真实节点
![在这里插入图片描述]()
图中A1 A2,B1,B2,C1,C2...
都是虚拟节点,A1,A2的数据存储在机器A上,机器B负载B1,B2的数据 …,这些虚拟节点的数量很多,分布均匀,所以不会造成一个"雪崩"
现象
优点
如果上图中的n2节点
挂掉了,那么keyn3
按照顺时针旋转
应该到达的就是n1节点
容错性很好,这样其他机器也不会受到影响,如果n2
挂了这些数据就会转移到n1
进行存储
如果机器增加,在n2和n3之间再加上一个n4,那么keyn3把数据顺延到n4即可(只影响hash环中的相邻节点)
不会导致hash取余全部数据重新洗牌
缺点
容易头重脚轻,可能会导致多个key被缓存到了一台机器上,数据分配不均匀
- 如果按照顺序延续,一个节点坏了,另一个节点承当前一个节点的数据,这样可能导致自身的负载上升,导致自己也挂掉了
代码
/*step1:插入存储节点,也就是虚拟节点(上图中A1,A2,B1,B2)这里需要记录两个信息1. 每个虚拟节点对应的哪个真实节点2. 哈希环上每个哈希值对应哪个虚拟节点step2:给每个数据分配存储的节点,先通过哈希函数计算出hash值,然后可以找到对应的虚拟节点,再映射到正式的节点上*/#include
#include
#include
#include