`

一种特殊的一致性哈希算法的研究

 
阅读更多
一致性哈希简单介绍

     Consistent Hashing 算法早在 1997 年就在论文《Consistent hashing and random trees》中被提出,提出了在动态变化的Cache环境中,哈希算法应该满足的4个适应条件:

    平衡性(Balance)
    单调性(Monotonicity)
    分散性(Spread)
    负载(Load)

一致性哈希原理

一致性哈希将key用hash函数进行映射,映射出来的所有点能够分布到一个圆环内,实际上consistent hashing 是一种 hash 算法, 在改变映射内容的大小时,而不需要改变hash算法,且能够尽可能小的改变已存在 key 映射关系,尽可能的满足单调性的要求。。这里我要讲述一种特殊的一致性哈希——分布式一致性哈希(Distributed Consistent Hashing):
普通的一致性哈希

    分布式一致性哈希(DCH)满足节点的对称分布,普通的一致性哈希表现如图1:




    3个节点平均分布在圆环上,每个节点之间的角度为120°,此时,只要hash函数够均匀,那么每个节点所命中的概率则都是一样的。

    如果再增加一个节点,普通的一致性哈希认为无论在那个节点之间增加新的节点,那么与新的节点非相邻的节点尽量保持不变,这样保证一致性哈希的单调性,如图 2:



    新的节点4(n4)自由分配到节点2(n2)和节点3(n3)之间,那么原来的key的映射范围k3变成了新的k3和k4,插入时,新的k3将着落在节点 4(n4)上;新的k4将着落在节点3上(n3)。为了节点的老数据不丢失,我们还需要将节点3上的属于k3范围的数据迁移到新的节点4(n4)上,并定期删除节点3(n3)的冗余数据(一致性哈希的分散性),这样在查询时,不会有命中不到的情况。虽然保证了一致性哈希的单调性,但是这样的方式不能保证节点的负载均衡,毕竟大部分的查询会着落在节点1(n1)和节点2(n2)上。

    如果减少节点,普通的一致性哈希情况如图3:



    节点3(n3)因为某种原因不能进行映射,那么圆环上只剩下2个节点(n1、n2),这样原来k1和k3合并成新的k1,即所有的负载全部着落在节点 1(n1)上,同新增加节点一样,虽然保证了单调性,但是明显不能保证负载均衡。

分布式一致性哈希

    分布式一致性哈希(DCH)只是在普通的的一致性哈希算法进行的一点改进。同样DCH是将key映射到一个圆环中,与普通一致性哈希不同的是,节点增加了虚拟的节点;包括实节点对之对应的虚节点不是按照连续的弧度范围进行划分,而是定义一个最小的弧度单位(最好能够被圆整分),在这个最小的弧度单位里面均匀放置所有的节点,如图4:



    上图实线部分表示实节点,虚线部分表示虚节点。

    当增加新节点或删除节点的时候,保证最小弧度单位不变化,每个节点分别控制插入和数据迁移的大小,如图5所示:



    当新增加节点时

    最小弧度中数据迁移大小=最小弧度/节点数
    总共数据迁移量=最小弧度中数据迁移大小*360/最小弧度=360/节点数

    与传统一致性哈希比较,迁移数据从1点节点开始增加,那么迁移的数据弧度比例分别为:

    传统一致性哈希(2分法):1/2+1/4+1/4+1/8+1/8+1/8+1/8+...
    DCH:1/2+1/3+1/4+1/5+1/6+1/7+1/8...

    很明显,传统一致性哈希迁移数据量少,但是负载集中在某几个节点上;而DCH则主要体现在迁移数据会利用各个节点的资源达到均衡,查询时也会比传统一致性哈希更均匀些。

    当删除节点时,并无数据迁移;

总结

    对于在分布式的环境中来说,数据的访问负载均衡更加重要,所以采用DCH的类似架构可能比数据迁移更加重要,比如memcache当中就采用了虚拟节点方式去达到负载均衡的目的。

    对于数据迁移来说,普通的一致性哈希针对的是某两个节点的数据迁移,而DCH针对的是一个分布式的环境,在数据量特别大的时候,DCH方式将数据迁移的压力分散到各个节点,而不是集中在某些节点上。
分享到:
评论

相关推荐

    CHB-Consensus:一种基于一致性哈希算法的区块链共识机制研究.pdf

    #资源达人分享计划#

    一致哈希算法

    一致哈希算法属于哈希算法的一种。它是对哈希算法的完善。此文件是一致性哈希算法的实现代码,完成的是一些基本的操作

    基于一致性哈希算法和Ckafka技术的IMS电话实时录音系统

    其次介绍了系统的实现流程,阐明了系统的关键技术:利用录音服务器对其镜像端口的SIP报文进行解析获得媒体流并解码、采用一致性哈希算法的内存数据库作为解码数据的缓存机制、利用Ckafka技术在两者之间构建实时数据...

    一致性哈希

    /** * 分布式缓存部署方案 * 当有1台cache服务器不能... * 一致性哈希算法 * 优点:在分布式的cache缓存中,其中一台宕机,迁移key效率最高 * 将服务器列表进行排序,根据$this->myHash($key) 匹配相邻服务器 */

    VPCH:一种一致的哈希算法,可在Hadoop环境中实现更好的负载平衡

    针对MR过程的减少阶段,提出了一种虚拟分区一致性哈希(VPCH)算法,以实现工作分配的权衡。 根据结果​​,使用我们的方法可以减少带有或不带有MJR(mapreduce.job.reduce.slowstart.completedmaps)参数集的任务...

    ist的matlab代码-hash_ring:在Python中实现一致的哈希(使用md5作为哈希函数)

    一致性哈希是一种以提供或删除一个插槽不会显着改变键到插槽的映射的方式提供哈希表功能的方案。 可以在博客文章中阅读有关hash_ring的更多信息(该文章更详细地解释了该想法): 一致的散列仅在python中实现 这些...

    memcached:在Node.js之上构建的功能齐全的Memcached客户端。 考虑到扩展性,因此它将支持Memcached集群和一致的哈希

    一致性哈希是一种提供哈希表功能的方案,该方式使得添加或删除服务器节点不会显着更改密钥到服务器节点的映射。 用于一致性哈希的算法与libketama相同。 例如,有多种处理错误的方法,例如,当服务器不可用时,您...

    论文研究-软件定义网络中利用IMKVS结合NFV的分布式网络负载均衡策略.pdf

    IMKVS系统使用一致性哈希来决定在何处存储目标。一致性哈希使用起来方法简单,但可能引起网络负载的不平衡。为了提高IMKVS的缓存性能,提出一种软件定义网络中利用IMKVS结合NFV的分布式网络负载均衡策略。该策略包含...

    大规模云存储系统副本布局研究 (2012年)

    然后,通过改进的一致性哈希算法将同一数据对象的多个副本分别分配到不同分组中;最后,再通过改进的一致性哈希算法将分配到各分组的数据副本放置在组内对应的存储节点上。理论分析可知,该方法大大提高数据的可靠性...

    论文研究-一种基于纠删码的数据放置容错算法.pdf

    提出的CHGDPS(consistent hash and greedy data placement algorithm based on sets)算法在基于划分集合的思想上,将一致性hash方法与贪婪算法相结合,极大地减少了数据传输时间。实验结果表明,该算法具有更短的...

    算法, 数据结构, 多线程, 缓存, 分布式事务, 一致性协议, RPC等实现.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    实时通信集群负载均衡策略研究与应用

    本文首先分析单服务器场景下的实时通信流程,然后研究和分析常见的负载均衡算法,同时为满足同群组客户端需转发到相同服务器的一致性要求,提出一种基于一致性哈希算法和遗传算法的自适应负载均衡算法,并对该算法...

    论文研究-海量存储系统的数据分布策略研究.pdf

    该算法采用一致性哈希的存储思想,利用“二分”的映射方式映射物理存储节点,摒弃了Chord算法中每台节点对路由表维护的做法,实现[O(1)]时间内直接路由。该算法还采用了“微分逼近”的思想,实现数据的均匀分布性。...

    Jump-Consistent-Hashing-Evaluation:对一致性哈希的评估,尤其是 Google 的 Jump Consistent Hashing

    跳跃一致哈希计算 甚至服务器之间的数据分布也非常重要:另一个重要方面是能够... 关于一致性哈希,使用的算法是谷歌的论文“A Fast, Minimal Memory, Consistent Hash Algorithm”中提出的Jump Consistent Hashing。

    jch-rs:跳转一致的哈希值以进行Rust

    jch-rs-为Rust跳转一致的哈希值 跳转一致性哈希是一种线性复杂性算法,在例子use jch;let key = 5u64 ;let num_buckets = 1024i32 ;println! ( "{}" , jch :: hash (key, num_buckets));

    MD5 小写 C语言

    Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and ...

    md5检测工具

    essage Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and ...

    无差别视频批量修改MD5

    MD5是一种用于计算数据(包括视频)的摘要算法,它将数据转换为一个固定长度的字符串(通常是32个字符),称为MD5哈希值。这个哈希值是唯一的,即使数据只改变了一个位也会产生不同的哈希值。因此,MD5哈希值可以...

    基于hash的图像检索软件

    (具体算法见平均哈希算法步骤) 3.计算DCT:DCT把图片分离成分率的集合 4.缩小DCT:DCT是32*32,保留左上角的8*8,这些代表的图片的最低频率 5.计算平均值:计算缩小DCT后的所有像素点的平均值。 6.进一步减小DCT:...

    一致性hash的PHP库.zip

    }Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的...

Global site tag (gtag.js) - Google Analytics