`
m635674608
  • 浏览: 4933834 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

使用虚拟节点改进的一致性哈希算法

 
阅读更多

分布式存储中的应用


在分布式存储系统中,将数据分布至多个节点的方式之一是使用哈希算法。假设初始节点数为 N,则传统的对 N 取模的映射方式存在一个问题在于:当节点增删,即 N 值变化时,整个哈希表(Hash Table)需要重新映射,这便意味着大部分数据需要在节点之间移动。

因此现在普遍使用的是被称为一致性哈希(Consistent Hashing)的一类算法。“一致性” 这个定语的意义在于:当增删节点时,只影响到与变动节点相邻的一个或两个节点,散列表的其他部分与原来保持一致。某种程度上可以将其理解为:一致性哈希算法的哈希函数与节点数 N 无关。

其他地方对一致性哈希配图的时候,都会选择一个圆环来解释,但我个人感觉哈希表更加直观:

一致性哈希

上图左右分别表示增加一个 “节点 5” 前后的哈希表,哈希函数使用的是 md5 。md5 会根据 key 的值摘要出一个 128 bit 的哈希值(校验和),一般表示为一个 32 位的 16 进制数。这里我们取哈希值第一位的范围来将 key 映射到不同的节点,可以看到在拆分了 “节点 4” 的 md5 首位范围后,只需要将 “节点 4” 原本数据的约一半移动到 “节点 5” 上去就可以了,其他三个节点并未受到影响。 

负载均衡改进


但这里其实仍有改进的空间。

问题在于,上面需要将 “节点 4” 的一半数据搬运到 “节点 5” 上,这个压力会比较大。以一个节点存有 3TB 的数据、节点间网络为千兆网(但只允许搬运进程使用 25% 负载)来算,搬运完 1.5TB 的数据最少需要 (1.5TB * 1024GB/TB * 1024MB/GB) / (125MB/s * 0.25) ≈ 14h;另一方面,“节点 5” 直接分担走了 “节点 4” 数据的一半,如果原来 4 个节点的负载是均衡的(md5 本身是一个很均匀的哈希函数),那么现在就变得不均衡了。

这两个问题有一个公共的解决方法:新增的 “节点 5” 不只从 “节点 4” 搬运数据,而从所有其他节点(或子集)处搬运数据,同时还要继续保持哈希一致性。

这种想法的一个实现方式就是,使用虚拟节点(virtual nodes)。上面 md5 哈希表实际可以分为两段:

  1. 通过 md5 将 key 哈希出一个 32 位的 16 进制哈希值
  2. 将这个哈希值映射到某个物理节点

当使用虚拟节点时,我们保持第一段不变,但会在第二段将哈希值映射到物理节点的过程中再插入一个虚拟节点中间件,从而将过程变为:

  1. 通过 md5 将 key 哈希出一个 32 位的 16 进制哈希值
  2. 将这个哈希值映射到一个虚拟节点
  3. 将这个虚拟节点映射到一个物理节点

新哈希表的关键之处在于虚拟节点的数量比物理节点数多得多,甚至很多时候会将虚拟节点的数量设置为 “尽可能多”。这样新哈希表的前两段就固定不变了,当增删物理节点时,只是对虚拟节点进行必要的重新分配的过程。

改进的一致性哈希

上图中我们依 md5 值的首位划分了 16 个虚拟节点,然后将它们映射到 4 个物理节点。(实际应用中,即使你当下只有 10 个物理节点,也大可以按 md5 的前三位划分出 4096 个虚拟节点)当我们增加物理 “节点 5” 的时候,就从节点 1、2、3 处各拿一个虚拟节点放到 “节点 5” 中。这个过程,“节点 5” 既可以使用 100% 的网络带宽来接收数据;新的哈希表也实现了负载均衡。当然一致性也得到了保证。

 

这种使用虚拟节点的一致性哈希算法我看到国内有人管它叫分布式一致性哈希(Distributed Consistent Hashing),但这个 “分布式” 叫法显得有些不合适,因为这种改进只涉及到算法的实现而与哈希过程发生的位置无关,并且 google 上也找不到这种叫法。所以一般就称改进的一致性哈希(Improved Consistent Hashing)好了。或者,使用虚拟节点的一致性哈希。

 

http://my.oschina.net/lionets/blog/288066

分享到:
评论

相关推荐

    一致性哈希算法(ketama hashing)

    对已有的负载平衡的改进算法,通过一致性哈希算法,负载平衡更加的有效。

    一致性哈希算法源码 Ketama一致性hash算法源码

    Ketama算法是一致性hash算法的一个优秀实现。增删节点后数据命中率及均分率都很高。

    一致性哈希算法演示.rar

    运行平台:VS 2019 一致性哈希算法演示项目,演示新增节点key分布情况;移除节点key分布情况! C#,C#,C#.......

    一致性哈希算法及其在分布式系统中的应用

    本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及 其在分布式系统中的应用。首先本文会描述一个在日常开发中经常会遇到的问题 场景,借此介绍一致性哈希算法以及这个算法如何解决此问题;接...

    一致性哈希算法 consistent hashing

    在分布式系统中,常常需要使用缓存,而且通常是集群,访问缓存和添加缓存都需要一个 hash 算法来寻找到合适的 Cache 节点。但,通常不是用取余hash,而是使用我们今天的主角—— 一致性 hash 算法。

    解决分布式数据插入数据库~一致性hash算法

    随着虚拟节点的增加,数据量分配就比较平均了,但是并不是虚拟节点数量越多就越好,因为要考虑这些虚拟节点带来的性能开销以及算法的复杂性;

    一致性哈希算法以及其PHP实现详细解析

    在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin)、哈希算法(HASH)、最少连接算法(Least Connection)、响应速度算法(Response Time)、加权法(Weighted )等。...

    Ketama一致性Hash算法(含Java代码) 1

    如果没有找到,则取整个环的第个节点。测试结果测试代码是整理的,主体法没有变分布平均性测试:测试随机成的众多key是否会平均分布到各个结点上测试结果如下:最上是参

    node-redis-cluster:Redis 集群的容器。 支持Rediska一致性哈希算法端口

    支持Rediska一致性哈希算法端口。 用法 var RedisCluster = require('node-redis-cluster'); var redis = new RedisCluster({ servers : [{ host : '127.0.0.1', port : 6379, db : 0 }], redisFactory : Redis...

    一致性Hash算法1

    引入“虚拟节点”后,映射关系就从{对象->节点}转换到了{对象->虚拟节点}。查询物体所在 cache时的映射关系如图 7 所示。图 7 查询对象所在 cach

    websocket-cluster:这是一个针对WebSocket集群服务器的Spring Cloud项目。

    原理我们利用一致性哈希算法,构造一个哈希环,网关监听WebSocket服务实例的上下线消息,根据实例的变化动态地更新哈希环。将需要迁移的WebSocket客户端重新连接到新的实例上,这样的代价是最小的;当然也取决与虚拟...

    PHP实现的一致性Hash算法详解【分布式算法】

    一致性哈希算法是分布式系统中常用的算法,为什么要用这个算法? 比如:一个分布式存储系统,要将数据存储到具体的节点(服务器)上, 在服务器数量不发生改变的情况下,如果采用普通的hash再对服务器总数量取模的...

    一致性hash算法1

    2.每一个缓存key都可以通过Hash算法转化为一个32位的二进制数,也就对应着环形空间的某一个缓存区 3.我们的每一个缓存节点(Shard)也遵循同样的Has

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

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

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

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

    CHKV:基于一致性哈希的键值存储

    系统设计NameNode : 维护 DataNode节点 列表,用心跳检测 DataNode(一般被动,被动失效时主动询问三次),节点增减等系统信息变化时调整数据并通知 Client;DataNode : 存储具体的数据,向 NameNode 主动发起心跳并...

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

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

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

    最后,再通过改进的一致性哈希算法将分配到各分组的数据副本放置在组内对应的存储节点上。理论分析可知,该方法大大提高数据的可靠性。仿真结果表明,该算法能满足副本布局的均衡性、自适应性要求,并能在几十微秒内...

    redis cluster

    此哈希算法存在同一个master内可能有太多的数据,可以用虚拟节点解决。 3、哈希slot算法: 此算法也是为了解决同一个master内有大量的数据。 二、节点之间的通信机制 1、基础通信原理 (1)redis cluster节点间采取...

    consistent-hash:一致的哈希追踪器项目符号

    环一致散列跳转一致哈希集合一致哈希磁悬浮一致性哈希 (第3.4节)粗略设计注意事项从与Karger等人成一直线的圆圈开始N个节点可以复制R次以改善分片分布。 复制的节点称为虚拟节点。 分片复制节点的散列在cicle上成...

Global site tag (gtag.js) - Google Analytics