Memcached学习笔记之分布式集群算法:取模算法与一致性哈希算法
分布式集群算法:取模算法与一致性哈希算法
1.1、分布式取模算法##
取模算法:N个节点要从0->N-1编号,key对N取模,余i,则key落在第i台服务器上
如下图:

1.2、取模算法对缓存命中率的影响###
假设有8台服务器运行中,突然down一台,则求余的底数变为7,后果:

从数学的概念上来讲,有N台服务器,变为N-1台,每N(N-1)个数中,只有(n-1)个单元,所以,命中率在服务器down的短期内,急剧下降至(N-1)/(N(N-1)) = 1/(N-1),所以,服务器越多,则down机的后果越严重。
2.1一致性哈希算法原理##
通俗理解一致性哈希:把各服务器节点映射放在钟表的各个时刻上,把key也映射到钟表的某个时刻上,该key沿钟表顺时针走,碰到的第一个节点即为该key的存储节点,如下图:

问题1:时钟上的指针最大才11点,如果有上百个memcached节点怎么办?
时钟只是为了便于理解做的比喻,实际应用中,我们可以在圆环上分布[0,2^32-1]的数字,这样,全世界的服务器都可以装下了。
问题2:如何把“节点名”,“键名”转化成整数?
可以使用函数,如crc32(),也可以自己去设计转化规则,但注意转化后的碰撞率要低,即不同的节点名,转换为相同的整数的概率要低。
2.2一致性哈希对其他节点的影响##
通过下图可以看出,当某个节点down后,只影响该节点顺时针之后的1个节点,而其他节点不受影响。因此,Consistent Hashing最大限度地抑制了键的重新分布。

2.3一致性哈希+虚拟节点对缓存命中率的影响##
由上图可以看到,理想状态下,
1)节点在圆环上分配均匀,因此承担的任务也平均,但事实上,一般的hash函数对于节点在圆环上的映射,并不均匀
2)当某个节点down后,直接冲击下一个节点对下一个节点冲击过大,能否把down节点上的压力平均的分担到所有节点上
解决方案:引入虚拟节点来达到目的
虚拟节点即N个真实节点,把每个真实节点映射成M个虚拟节点,再把M*N个虚拟节点,散列在圆环上,各真实节点对应的虚拟节点相互交错分布,这样,某个真实节点down后,则把其影响平均分担到其他所有节点上。


浙公网安备 33010602011771号