一致性hash 易懂 原理

1.普通hash简介

普通hash是根据 Hash(obj)%机器数 来确定落在哪台机器的。

缺点:当我们减少(宕机)或者增加集群中的机器时,机器数发生变化,所有缓存的位置都要发生改变,之前的数据都要重新根据 Hash(obj)%机器数 来进行迁移到新机器。

2.一致性hash原理

一致性hash算法通过一个叫作一致性hash环的数据结构实现,环的整数分布范围是( 0 , 1 , 2 , 3 … 2^32-1 ) ,如下图:
在这里插入图片描述
假设现在我们有4个对象,分别为o1,o2,o3,o4,使用hash函数计算这4个对象的hash值(范围为0 ~ 2^32-1):

hash(o1) = m1
hash(o2) = m2
hash(o3) = m3
hash(o4) = m4

将m1,m2,m3,m4落在hash环上:
在这里插入图片描述
假设我们集群中有 c1,c2,c3三台机器,分别用其ip地址取hash:

hash(c1的ip) = t1
hash(c2的ip) = t2
hash(c3的ip) = t3

将t1,t2,t3落在hash环上:
在这里插入图片描述
在hash环上顺时针查找距离这个对象的hash值最近的机器,即是这个对象所属的机器。如上图所示:

  • o1[m1] 对象落在 t3[c3]机器上
  • o2[m2] 对象落在 t1[c1]机器上
  • o3[m3] 对象落在 t2[c2]机器上
  • o4[m4] 对象落在 t2[c2]机器上

新增机器情况
在这里插入图片描述
如上图,我们新增了c4机器,计算出落在了hash环上的t4位置,现在只需重组o4对象重新落在c4机器上就ok了,其他对象仍在原有机器上不动。

宕机情况
在这里插入图片描述
如上图,我们c1宕机了,则o2需要重组到c3机器上,其他对象仍在原有机器上。

3.Hash环的数据倾斜问题

一致性Hash算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题,例如系统中只有两台服务器,其环分布如下:
在这里插入图片描述
此时必然造成大量数据集中到Node A上,而只有极少量会定位到Node B上。为了解决这种数据倾斜问题,一致性Hash算法引入了虚拟节点机制。

虚拟节点
就是对真实的机器映射出多个虚拟节点,那么在hash环上就仿佛有很多个机器节点。具体做法可以在服务器IP或主机名的后面增加编号来实现。
例如上面的情况,可以为每台服务器计算三个虚拟节点,于是可以分别计算 “Node A#1”、“Node A#2”、“Node A#3”、“Node B#1”、“Node B#2”、“Node B#3”的哈希值,于是形成六个虚拟节点:
在这里插入图片描述
同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射,例如定位到“Node A#1”、“Node A#2”、“Node A#3”三个虚拟节点的数据均定位到Node A上。这样就解决了服务节点少时数据倾斜的问题。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值