首页 > 编程知识 正文

一致性计算公式,一致性hash 虚拟节点

时间:2023-05-04 16:33:39 阅读:165397 作者:4959

##分布式存储上的APP应用

分布式存储系统使用dxlc算法将数据分布在多个节点上。 如果将初始节点数设为n,则在以往的向n模式的映射方法中,在节点被追加删除时,也就是n值变化时,需要重新映射dxlc表整体Hash Table,存在需要在节点间移动大部分数据的问题

因此,目前常用的是一种称为一致性散列(dxlc )的算法。 术语“一致性”是定语的意思是,当增加和删除节点时,它只影响一个或两个变化的节点,并且散列表的其他部分与原始的一致。 这在一定程度上可以理解为连贯性dxlc算法的dxlc函数与节点数n无关。

其他地方在绘制一致的dxlc时,会选择圆环进行说明,但我个人觉得dxlc表更直观:

上图的左右分别表示增加一个“节点5”前后的dxlc表,dxlc函数使用了md5。 md5根据key值汇总128位dxlc值(校验和),通常表示为32位十六进制数字。 这里,取dxlc值的第一位的范围将key映射到不同的节点,但是分割“节点4”的md5的第一位的范围后,将“节点4”的原始数据的约一半移动到“节点5”即可,其他三个节点受到影响

##负荷分散的改善

但是,这里还有改善的余地。

问题是,上面提到的“节点4”的一半数据必须携带到“节点5”,这种压力会很大。 1.5TB * 1024GB/TB * 1024MB/GB )/(122.5 TB * 1024 GB/TB * 1024 MB/GB ),表示节点间的网络为千兆网络(但在运输过程中只接受25%的负载) 另一方面,“节点5”直接分担了“节点4”的数据的一半,但如果原本4个节点的负载均衡(md5本身是非常均匀的dxlc函数),则现在变得不均衡。

这两个问题有共同的解决方法。 新的“节点5”不仅从“节点4”携带数据,还从所有其他节点(或子集)携带数据,以保持dxlc的完整性。

这个构思的实现方法之一是使用虚拟节点(virtual nodes )。 上面的md5 dxlc表实际上可以分为两个阶段。

在md5中将key dxlc设置为32位十六进制dxlc值

将此dxlc值映射到物理节点

如果使用虚拟节点,则第一个段保持不变,但在第二个段将dxlc值映射到物理节点的过程中,插入另一个虚拟节点中间件,然后按如下方式修改流程:

在md5中将key dxlc设置为32位十六进制dxlc值

将此dxlc值映射到虚拟节点

将此虚拟节点映射到物理节点

新dxlc表的重要之处在于,虚拟节点的数量远远多于物理节点的数量。 通常将虚拟节点的数量设定为“尽可能多”。 这样,新dxlc表的前两行便是固定的,如果要添加或删除物理节点,只需重新分配虚拟节点即可。

在上图中,md5值开始处的16个虚拟节点被拆分为4个物理节点。 (在实际的APP应用中,即使当前只有10个物理节点,md5的前三位也可以划分4096个虚拟节点。 )添加物理“节点5”时,从节点1、2、3开始分别将虚拟节点放入“节点5”中。 在此过程中,“节点5”可以使用100%的网络带宽接收数据。 新的dxlc表也实现了负载均衡。 当然一致性也有保证。

我看到国内有人把这种使用虚拟节点的一致性dxlc算法称为distributedconsistenthashing (distributedconsistenthashing ),这种算法叫做“分布式” 因为,这种改进只与算法的实现有关,无论dxlc进程发生在哪里,谷歌都找不到这种称呼。 所以,一般称为改进的一致性dxlc(improvedconsistenthashing )。 或者,使用虚拟节点一致的dxlc。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。