普通的hash算法
假设我们有许多用户画像需要均匀的存放在多台服务器上
做法:
(1)将用户画像的某些属性(如:名称等)经过hash算法算出hash值
(2)hash%服务器台数,算出该用户画像应该存放在哪台服务器上
(3)之后对该用户画像的修改就在这台服务器上进行,就不需要冗余存储了
因为同一个用户画像计算出的hash值是固定的,所以每次映射到的服务器也是同一台
问题:
(1)当用户数量增大需要进行服务器扩充时会导致映射到的服务器跟之前存储的服务器不是同一台
(2)大量缓存失效,会导致查询都跑到后台的业务服务器,可能会导致雪崩
一致性hash算法
为了解决普通hash算法的问题,我们引入了一致性hash算法
做法:
(1)我们假设有一个2^32长度的hash环
(2)我们除了要计算出用户画像的hash值之外,我们还需要计算各个服务器的hash值
(3)hash%2^32,计算出服务器和用户画像在hash环中所处的位置
(4)各个用户画像就存放在hash环顺时针方向上离它最近的服务器中
当我们扩充服务器数量后,仅会有一小部分缓存失效,大部分还是有效的,因此不会导致雪崩
问题
可能会出现hash偏斜,即服务器在hash环中的位置离的很近,会导致缓存都落在一台服务器上,导致系统崩溃
问题解决
解决的方法:增加虚拟节点,我们让每个服务器都对应hash环上的多个虚拟节点,因为服务器对饮的节点数变多了,因此可以在一定程度上减少不均匀的影响。