分布式之取模算法
原理
N个Memcached节点,从0->N-1编号,key对N取模,余i,则key地i个节点上。
取模算法对缓存命中率的影响
假设有8台服务器,运行中,突然down了一台,则取模底数变成了7,
则,命中率下降为原来的1/7
有 N 台服务器, 变为 N-1 台, 每 N(N-1)个数中, 只有(n-1)个单元,%N, %(N-得到相同的结果
所以 命中率在服务器 down 的短期内, 急剧下降至 (N-1)/(N*(N-1)) = 1/(N-1)
所以: 服务器越多, 则 down 机的后果越严重!
一致性哈希算法
原理
把各服务器节点映射放在钟表的各个时刻上, 把 key 也映射到钟表的某个时刻上. 该 key 沿钟表顺时针走,碰到的第 1 个节点即为该 key 的存储节点
例: 假设有abcd四个节点,平均分布在钟表上,即a0,b3c6d9, 有key要存储,key用相应的转化规则得到5,则key顺时针走,第一个遇到c6,则key存在c节点。
时钟只是为了便于理解做的比喻,在实际应用中,我们可以在圆环上分布[0,2^32-1]的数字。
可以自己设计转化规则,但注意转化后的碰撞率要低. 即不同的节点名,转换为相同的整数的概率要低.
一致性哈希对其他节点的影响
当某个节点 down 后,只影响该节点顺时针之后的 1 个节点,而其他节点
不受影响.因此,Consistent Hashing 最大限度地抑制了键的重新分布
虚拟节点
N 个真实节点,把每个真实节点映射成 M 个虚拟节点, 再把 M*N 个虚拟节点, 散列在圆环上. 各真实节点对应的虚拟节点相互交错分布
这样,某真实节点 down 后,则把其影响平均分担到其他所有节点上.