memcache的一致性hash算法

          此文是在网上看到别人写memcache一致性hashi算法后进行编写的,感觉写的很好,所以就再录过来:

       现在一般的算法就是一个hash值算法,对服务器个数进行取余来进行hash值的计算,假如你有n个cache,那么对于object的映射,你会通过hash(object)%n来进行映射对应的服务器上,但是当服务器当掉,那么你原来的存储数据会失效,且hash算法会进行修改,同理增加一台也会修改算法,原来的数据也会失效,这对系统来说是灾难性的,可对对数据库的访问造成压力。有什么方法能对这个场景进行优化呢,那就是一致性的hash算法。

    hash算法:衡量一个hash算法的重要指标就是单调性,所谓单调性就是说:如果已经有对象存到到缓存服务器上,那么当缓存服务器有变动时,应该能保证已经缓存的对象能存储到新的缓存对象中,而不是缓存到原来的缓存对象或旧的缓存对象中。很容易看到上面的hash(object)%n是不能保证这个要求的。

     consistent hash算法原理:consistent hashing 是一种 hash 算法,简单的说,在移除 / 添加一个 cache 时,它能够尽可能小的改变已存在 key 映射关系,尽可能的满足单调性的要求。下面就来按照 5 个步骤简单讲讲 consistent hashing 算法的基本原理。

        1考虑通常的 hash 算法都是将 value 映射到一个 32 为的 key 值,也即是 0~2^32-1 次方的数值空间;我们可以将这个空间想象成一个首( 0 )尾( 2^32-1 )相接的圆环,如下面图 1 所示的那样。

            circle Memcached分布式算法详解

图1:环形hash空间

    2.把对象映射到hash空间,接下来将4个对象object1-object4,通过hash算法计算出key值将其分布在环上,其图如下:

    object Memcached分布式算法详解

    3把cache映射到hash空间

    consistent hash的算法思想就是把对象和cache映射到同一个hash空间,并且使用相同的hash算法。假设有a,b,c3台cache,那么映射结果如下图上所示(以对应的hash值进行排列)

      cache Memcached分布式算法详解

  说到这里顺便说下cache的hash算法,一般以cache的ip或者是机器名做hash的输入。

 4把对象映射到cache上

    现在已经将cache和对象通过同一个hash算法映射到同一个hash空间了,现在考虑的是如何将对象和cache进行映射。

   在这个环形空间中,如果以一个对象的key为出发点,按顺时针出发直到遇到第一个cache,那么这个对象就放入到这个cache上,由于hash值时固定的,那么找到的cache也是唯一的,这样就找到了映射的方法。

       按照上面的例子key1--->cacheA  key4--->cacheB  key2,key3--->cacheC

5考察cache的变动

  考虑B挂掉了,那么依据上面的映射方法,只有沿着b逆时针方向直到遇到第一个cache之间的对象会有影响,也就是原来存数到B的对象会存储到c,因此这里只有object4发生了变化。

  remove Memcached分布式算法详解

  增加cache:假如在object2和object3之间添加一台cacheD,那么沿着cacheD逆时针方向直到遇到第一个cache之间的对象将会存放到D中,对此只是object2受到影响。

   add1 Memcached分布式算法详解

     虚拟节点

  考量hash算法的另一个重要指标是:平衡性:即尽可能的使对对象均匀的分布在cache节点上。

   当cache比较少时,对象不能均匀的分布到cache上,就如上面的object2,object3,object4都分布在了c上,而object1只分布在a上了,为了使分布平衡,我们引入了虚拟节点:虚拟节点实际上是hash空间的复制品,一个实际节点对应多个虚拟节点,虚拟节点在hash空间中以hash值进行排列。

   仍以仅部署 cache A 和 cache C 的情况为例,在图 4 中我们已经看到, cache 分布并不均匀。现在我们引入虚拟节点,并设置“复制个数”为 2 ,这就意味着一共会存在 4 个“虚拟节点”, cache A1, cache A2 代表了 cache A ; cache C1, cache C2 代表了 cache C ;假设一种比较理想的情况,参见图 6 。

virtual Memcached分布式算法详解

因此对象 object1 和 object2 都被映射到了 cache A 上,而 object3 和 object4 映射到了 cache C 上;平衡性有了很大提高。引入“虚拟节点”后,映射关系就从 { 对象 -> 节点 } 转换到了 { 对象 -> 虚拟节点 } 。查询物体所在 cache 时的映射关系如图 7 所示。

  map Memcached分布式算法详解

  本文参考来源:http://xiexiejiao.cn/java/memcached-consistent-hashing.html

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值