文章目录
1 一致性哈希算法
文章内容详细请参考 王超的个人博客: https://writings.sh/post/consistent-hashing-algorithms-part-1-the-problem-and-the-concept,本文是在通篇阅读之后的总结,概括和精炼。
1.1 问题简述
我们希望构造一种函数
f
(
k
,
n
)
→
m
f(k,n)\rightarrow m
f(k,n)→m 把字符串映射到 n 个槽上:
它的输入是随机到来的字符串
k
k
k和槽的个数
n
n
n.输出是映射到的槽的标号
m
,
m
<
n
m, m<n
m,m<n
这个函数需要有这样的性质:
映射均匀
: 对随机到来的输入
k
k
k, 函数返回任一个
m
m
m的概率都应该是
1
/
n
1/n
1/n。
一致性
:相同的
k
k
k,
n
n
n输入, 一定会有相同的输出。
当槽的数目增减时, 映射结果和之前不一致的字符串的数量要尽量少。
这个算法的关键特征在于, 不要导致全局重新映射, 而是要做增量的重新映射。
1.2 经典一致性哈希算法——哈希环
1.2.1 增删槽位的影响
新增槽位拦截了原本到下一节点的部分映射,其他槽位不受影响。顺时针方向的下一个节点
N
1
N_1
N1 需要迁移部分数据到新节点
N
4
N_4
N4 上才可以正常服务, 其他节点不受影响。
删除槽位时, 被删除槽位的映射会转交给下一槽位,其他槽位不受影响。
哈希环做到了在槽位数量变化前后的增量式的重新映射, 避免了全量的重新映射。
假设整体的
k
k
k的数量是
K
K
K, 由于哈希映射的均匀性, 所以,添加或者删除一个槽位,总会只影响一个槽位的映射量,也就是
1
/
K
1/K
1/K, 因此,哈希环做到了最小化重新映射(minimum disruption),做到了完全的一致性。
1.2.2 时空复杂度分析
将环拉直,发现其实是二分查找
算法,时间复杂度为
O
(
l
o
g
n
)
O(logn)
O(logn),空间复杂度为
O
(
n
)
O(n)
O(n)
1.2.3 带权重的一致性哈希环
实际应用中, 还可以对槽位(节点)添加权重。 大概的逻辑是构建很多指向真实节点的虚拟节点, 也叫影子节点。 影子节点之间是平权的,选中影子节点,就代表选中了背后的真实节点。 权重越大的节点,影子节点越多, 被选中的概率就越大。
就是说实际在哈希环中的节点都是虚拟节点,我们后面在将这些虚拟节点
V
V
V映射到真正的物理机
N
x
N_x
Nx上
实际应用中,即使节点之间是平权的, 也会采用影子节点。 比如,常用的ketama方法中,一般采用一个节点对应40个影子节点。 原因是,节点越多、映射的分布越均匀, 采用影子节点可以减少真实节点之间的负载差异。
1.2.4 热扩容和容灾
1.3 跳跃一致性哈希算法
1.4 Maglev高一致性哈希法 (磁悬浮??)
我们要设计一个一致性哈希算法, 要求映射均匀, 并尽力把槽位变化时的映射变化降到最小(避免全局重新映射)
这里需要说明的是左表生成的是偏好序列,所谓偏好序列就是说对所有的槽位的标号打乱顺序,然后纵列观察目前可以填入的位置。注意看,下面是对整个过程的理解:
这里需要思考一个问题,为什么哈希表的槽位数最好是一个质数?这是由于所有的由哈希函数生成的数字都一定与 哈希表的槽位数
m
m
m和输入
n
n
n有关,入最简单的哈希函数可以写作函数
f
(
n
)
=
m
%
n
f(n)=m \% n
f(n)=m%n,这里我们一定可以提取出 m 和 n的最大公因数,也就是说,f(n)一定会是
g
c
d
(
m
,
n
)
gcd(m,n)
gcd(m,n)他俩最大公因数的倍数,那么为了让所生成的最大公因数不是任何一个数的倍数,我们就必须要令
g
c
d
(
m
,
n
)
=
1
gcd(m,n) = 1
gcd(m,n)=1,也就是要求m和n互质。
不过这个算法还存在一个边缘情况:假如所有的偏好序列都不包含某个数字呢? 下面的图1.4中,所有偏好序列都不包含 2,导致最终的查找表的
e
n
t
r
y
[
2
]
entry[2]
entry[2]是空的。这种情况出现的概率非常低,但是并不是没有可能。 论文中未对这种情况做出说明,不过还是可以想到解决办法的(当然,方法不止一种): 如果填充后的查找表有位置没有被填充,可以统计下哪个槽位的占比最小,把那个槽位填到这里。
上面的图1.4中,不巧的是三个槽位都占了2个位置,那么直接随意给标号最小的
B
0
B_0
B0好啦。
后面涉及到增删节点时的操作分别对应了扩容和容灾,想说明的是这篇文章详细介绍了Google对应的学术论文,细致到就算是每一句话就有深度的了解和思考,我认为是一篇十分不错的好文。
2. 大文件处理算法
家人们,这里的东西太多,有好多是需要我们了解和明白的,根本就学不完,由点到面,由浅入深我们可以学习好久,让我们一起加油吧,博客记到这里就先告一段落吧。
https://pdai.tech/md/algorithm/alg-domain-bigdata-overview.html