一致性哈希设计目标用于解决热点问题。
一致性哈希需要满足以下几个条件: 1:均衡性(Balance),数据应该均匀地分布到所有的缓冲中 2:单调性(Monotonicity),当缓冲发生变化时,能够保证部分内容被分配到新的缓冲中去(包括原有已分配的内容和新加入的内容) 3:分散性(Spread),由不同终端映射相同内容时,应保证映射到相同的缓冲中,避免发生不一致的情况。 4:负载(Load),能够尽量降低缓冲的负荷 5:平滑性(Smoothness),服务器的数目平滑改变和缓冲对象的平滑改变。
如果通过哈希取余HASH(Object)%N的方式来实现缓存,当某一节点出现故障时,故障节点对应的内容将无法映射到其他节点中,而当新增一节点时,也无法将部分内容映射到新缓冲中,因此不满足一致性哈希的单调性原则。
为解决上述问题,使用HASH环来实现,按hash后的值查找临近的缓冲节点,因此无论是删除还是新增节点,都能保证内容被影射到特定一个缓冲节点上。
对于上面的实现方式,存在一个问题,当某个节点被删除后,该节点上所对应的缓冲范围将移动到其邻居节点上,导致其邻居节点的负载增加;当新增一个节点后,新缓存节点只能分担其邻居节点的缓存压力,不满足一致性hash的负载性。
为解决节点变动导致的缓存负载问题,可以采用虚拟缓冲节点来处理,将hashkey的范围均分到很多个虚拟节点上,再将这些虚拟节点映射到缓冲物理节点上,
1>当删除物理节点时,可以将该物理节点对应的虚拟节点均匀地拆分到其余物理节点上;
2>当新增物理节点时,可以将其余各个节点上的虚拟节点拆分一部分到新物理节点上;
1>当删除物理节点时,可以将该物理节点对应的虚拟节点均匀地拆分到其余物理节点上;
2>当新增物理节点时,可以将其余各个节点上的虚拟节点拆分一部分到新物理节点上;