Hash一致性算法

一致性哈希算法在1997年由麻省理工学院提出。

hash取余产生的问题:新增节点、删除节点会让绝大多数的缓存失效,除了导致性能骤降外很有可能会压垮后台服务器。

解决点一:

集群中节点挂掉或新增节点的时候,要对已有节点的影响降到最小。其解决思路,就是对缓存的object和Node使用同一个hash函数(实际不需要完全一致,但至少保证产生的hash空间相同),让他们映射到同一个hash空间中去,当然这很容易实现,因为大多数的hash函数都是返回uint32类型,其空间即为1~232 232-1(2^32 = 4 294 967 296,近43亿)。然后各个Node就将整个hash空间分割成多个interval空间,然后对于每个缓存对象object,都按照顺时针方向遇到的第一个Node负责缓存它。通过这种方法,在新增加Node和删除Node的时候,只会对顺时针方向遇到的第一个Node负责的空间造成影响,其余的空间都仍然有效。

Hash取余算法: hash(object.key)%N,随object.key和N的变化而变化

Hash取余算法有个极大的缺点: 如果有节点发生变化,几乎重新分配,那就意味着已经分配好的数据都要迁移到新节点上,这是不好的现象,但节点变化在集群是再正常不过的,怎么办呢?

专家: 在动态变化的Cache环境中,判断哈希算法好坏的四个标准

  1. 平衡性(Balance): 平衡性是指哈希的结果能够尽可能分布到所有的缓存中去,这样可以使得所有的缓存空间都得到利用,很多哈希算法都能满足这一条件
  2. 单调性(Monotoicity): 单调性是指如果已经有一些内容通过哈希分派的了相应的缓存中,又有新的缓存加入到系统中,哈希的结果应能够保证和原来已分配的内容可以被映射到原来的或者新的缓存中去,而不会被映射到旧的缓存集合中的其他缓存区
  3. 分散性(Spread):在分布式环境中,终端有可能看不到所有的缓存,而是只能看到其中的一部分,当终端希望通过哈希过程将内容映射到缓存上时,由于不同终端所见到的缓存范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被终端映射到不同的缓存区中,这种情况显然是可以避免的,因为它导致相同的内容被缓存到不同的缓存中去,降低了系统存储的效率,分散性的定义就是上述情况发生的严重后果,好的哈希算法应该能够尽量避免不一致的情况发生,也就是尽量降低分散性
  4. 负载(Load): 负载问题实际上是从另一个角度看待分散性问题,既然不同的终端可能将相同的内容映射到不同的缓存区中,那么对于一个特定的缓存区而言,也可能被不同的用户映射为不同的内容,与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓存的符合

总结: 平衡性:尽量分散

         单调性: 已经分配的不能换地方

         分散性和赋值都应该避免

Hash一致性算法底层工作原理

两大设计: Hash环的设计和虚拟节点的设计

hash环 : 满足了单调性,分散性,负载

虚拟节点: 满足了平衡性

Hash环(hash桶):这个环非常大,从0到2^32(43亿个值),通过这样的设计就把对象(数据)和服务器映射到同一映射空间中

按顺时针转动

object1 存储到了NODE1中

object2 存储到了NODE3中

object3,object4 存储到了NODE2中

在这样的部署环境中,hash环是不会变更的,因此:通过算出对象的hash值就能快速的定位到对应的机器中,这样就能找到对象的真正的存储位置了

举例(集群的动态伸缩)

1.节点的添加

增加节点NODE4

通过按顺时针迁移的规则,那么object2被迁移到了NODE4中,其他对象还保证着原来的存储位置

2.节点的删除

删除节点NODE2 

如果NODE2 出现故障被删除了,那么安照顺时针迁移的方法,object3将会被迁移到NODE3中,这样仅仅是object3的映射位置发生了变化,其他的对象没有任何的改动

结论: 通过对节点的添加和删除的分析,一致性哈希算法在保持了单调性的同时,还使数据的迁移达到了最小,这样的算法对分布式集群来说是非常合适的,避免了大量数据迁移,减小了服务器的压力

一致性哈希算法满足了单调性和负载的特性以及一般hash算法的分散性,但这还并不能当做其被广泛应用的原因,因为还缺少了平衡性

一致性哈希算法是如何满足平衡性的

hash算法是不保证平衡的

如只部署了NODE1和NODE3的节点,object1 存储到了NODE1 中,object2,object3,object4 存储到了NODE3,这样就造成了非常不平衡的状态

在一致性哈希算法中,为了尽可能的满足平衡性,其引入了虚拟节点

虚拟节点(virtual node) : 虚拟节点是实际节点(机器)在hash空间的复制品(replica)  ,一个实际节点(机器)对于若干个"虚拟节点",这  也成为"复制个数","虚拟节点"在hash空间中以hash值 排列,上面只部署了NODE1和NODE3的情况(NODE2被删除的图)为例,之前的对象在机器上的分布很不均衡,现在我们以2个副本(复制个数)为例 ,这样整个hash环中就存在了4个虚拟节点  

结论: 通过虚拟节点的引入,对象的分布就比较均衡了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值