分布式算法3 -- 一致性hash算法

来源:互联网 发布:淘宝库存不足 编辑:程序博客网 时间:2024/06/05 01:18

http://blog.csdn.net/cywosp/article/details/23397179/

  • 解决的问题
    为每个客户端映射到服务器,当服务器挂掉或者增加时,尽量少的改变客户端的映射。

  • 问题描述
    用hash算法来分布数据,当数据节点增加或者减少时,需要调整hash算法的模,导致所有的数据都要重新按照最新的模分布到多个节点。如果数据量比较庞大是,这个工作量是很大的。
    eg:HashMap:就是利用key的hash来计算这个key落在哪个区间中,计算规则就是根据当前有区间的总数量,位运算计算出结果。当数量量增大时,这就要扩大区间,这时候就要全部重新对所有的key进行重新的区间定位。
    一致性hash算法就是基于优化hash算法,通过映射关系解决。

  • 场景
    如果你有n个cache服务器,那么如何将Object映射到n个服务器上,这时就会计算Object的hash值,然后均匀映射到n个服务器上。

    hash(object) % N
    那么问题来了:
    1)一个服务器m挂掉了,这时所有映射到m的所有对象将失效,这时要移除m,cache服务器总是就是N-1.映射公式就是hash(object) % (N-1)
    2) 由于访问过重,添加服务器,这时就是n+1,映射公式就是hash(object) % (N+1).
    3) 添加新的服务器时,想让更多的Object映射到这个服务器,显然hash算法做不到。

  • 单调性
    已经有一些通过hash分配到相应的缓存区,现在有新的缓存区,hash的结果保证原有已经分配的可以映射到新的缓存中,而不会映射到旧的缓存集中的其他缓存区。

  • 原理
    在添加、移除一个cache服务器时,尽可能少的改变已经存在key的映射关系。
    环形hash空间
    这里写图片描述

    hash(Object1) = CacheA
    hash(Object2) = CacheB
    hash(Object3) = CacheC

    hash值落在哪个区间就映射到那台服务器上。在这个环形空间中,沿着顺时针房间从对象key值进行出发,那么第一个Cache服务器就是的

    1) Cache移除时
    这里写图片描述
    当CacheB挂掉时,顺时针,落到下一个Cache上(CacheC)

    2)CacheB添加时
    这里写图片描述
    添加CacheD,原来Object1落在CacheC,现在落在CacheD

  • 平衡性
    这里写图片描述
    CacheB -》object1、Object2、Object3
    CacheA -》object5
    CacheC -》object4
    指向CacheB有3个客户端,而 cacheA、CacheA才有1个。这对于Cache分布很不平衡
    这时候引入虚拟节点:增加节点Cache的复制品.
    这里写图片描述
    CacheA1、CahceA2 (虚拟节点)都是代表CahceA
    CacheB1、CahceB2 (虚拟节点) 都是代表CahceB
    映射关系由对象-》节点 ,转换到对象-》虚拟节点

  • 虚拟节点
    这里写图片描述
    hash计算可以采用对应节点的ip地址加数字后缀的模式。
    eg:
    CacheA的ip为202.168.14.241.

    引入“虚拟节点”前,计算 h1 的 hash 值:
    Hash(“202.168.14.241”);
    引入“虚拟节点”后,计算“虚拟节”点v1和v的hash值:
    Hash(“202.168.14.241#1”); // v1
    Hash(“202.168.14.241#2”); // v2

0 0
原创粉丝点击