VIP实习笔记——算法应用

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值