[思考] 一致性哈希
1 哈希
Hash,一般翻译做散列,是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。[百度百科]
1.常用 Hash 函数
2.作用
使用 Hash 算法可以提高存储空间的利用率,可以提高数据的查询效率,也可以做数字签名来保障数据传递的安全性。
3.常见问题
有 N 台用于缓存图片的服务器,期待图片被均匀的缓存到 N 个节点,此时 '除留余数法' 恰巧满足场景, 使用如下算法:
hash(图片名称)% N
查询缓存时,若服务器集群发生 '扩|缩容' (即 N 数量变化),根据上述算法,几乎所有图片无法从缓存加载,面临着 '缓存雪崩' 的风险;
2 一致性哈希
1 概念
关键字:1) 固定取余基数;2) Hash 环;3) 顺时针就近寻找节点;
类似 '除留余数法',取余的基数固定为一个常数 2^32,即哈希值是一个32位无符号整形,范围 0 ~ 2^32 - 1);
把这 2^32 个点均匀分布在圆环上,并称其为 Hash 环,如图:
当缓存图片时, 根据 [hash(图片名称)% 2^32] 计算图片在 Hash 环上的位置,如图:
如何确定图片缓存在哪个机器上?
从图片的位置开始,寻找沿顺时针方向遇到的第一个服务器,如图:
2 特点
如下,当扩容 D 机器时, 依据 [顺时针就近寻找节点] 原则, 仅图片 2 缓存失效,其余均正常;
3 哈希倾斜 与 虚拟节点
在 Hash 环上,将现有的物理节点通过虚拟的方法复制出来,这些由实际节点复制而来的节点被称为 ”虚拟节点”。
'虚拟节点' 是 '实际节点' 在 Hash 环上的复制品,一个实际节点可以对应多个虚拟节点。
引入虚拟节点后,缓存的分布就均衡多了,虚拟节点越多,Hash 环上的节点就越多,缓存被均匀分布的概率就越大。
That's all, 本篇侧重基本理论,后续介绍常用工具包及其使用。