vlambda博客
学习文章列表

[思考] 一致性哈希

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 特点

1) 避免因 扩/缩容 引起的缓存雪崩

如下,当扩容 D 机器时, 依据 [顺时针就近寻找节点] 原则, 仅图片 2 缓存失效,其余均正常;

[思考] 一致性哈希

2) 可通过虚拟节点,解决 哈希倾斜 问题
公司自研  MQ,broker 分区有 sub partition 概念, consumer 支持多线程消费,重写 HashSubPartitioner  时,因 Hash 算法问题,导致 Hash 倾斜;

[思考] 一致性哈希

[思考] 一致性哈希


3 哈希倾斜 与 虚拟节点

1) Hash 倾斜
如图不同机器上缓存的图片数量比例失衡,被称为 哈希倾斜;


2) 虚拟节点

在 Hash 环上,将现有的物理节点通过虚拟的方法复制出来,这些由实际节点复制而来的节点被称为 ”虚拟节点”。

'虚拟节点' 是 '实际节点' 在 Hash 环上的复制品,一个实际节点可以对应多个虚拟节点。

引入虚拟节点后,缓存的分布就均衡多了,虚拟节点越多,Hash 环上的节点就越多,缓存被均匀分布的概率就越大。


That's all, 本篇侧重基本理论,后续介绍常用工具包及其使用。