zoukankan      html  css  js  c++  java
  • 一致性哈希算法

    首先讲一下判断哈希算法好坏的三个原则
    1、平衡性(Balance):是指 hash的结果应该平均分配到各个节点, 这样从算法上就解决了负载均衡问题.
     
    2、单调性(Monotonicity): 在新增或者删减节点时, 同一个key访问到的值总是一样的.
     
    3、分散性(Spread):在分布式环境中,数据应该分散的存放在 分布式集群中的各个节点(节点自己可以有备份), 不必要每个节点都存储所有的数据.
     

      一致性哈希算法是分布式系统中常用的算法。比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数,如果有一个机器加入或退出这个集群,则所有的数据映射都无效了,如果是持久化存储则要做数据迁移,如果是分布式缓存,则其他缓存就失效了。

      这里提到的一致性hash算法ketama的做法是:选择具体的机器节点不在只依赖需要缓存数据的key的hash本身了,而是机器节点本身也进行了hash运算。

    一致性哈希的情景描述

    1、 hash机器节点

    首先求出机器节点的hash值(怎么算机器节点的hash?ip可以作为hash的参数吧。。当然还有其他的方法了),然后将其分布到0~2^32的一个圆环上(顺时针分布)。如下图所示:
                                                                             

    图一 

    集群中有机器:A , B, C, D, E五台机器,通过一定的hash算法我们将其分布到如上图所示的环上。

    2、访问方式

    如果有一个写入缓存的请求,其中Key值为K,计算器hash值Hash(K), Hash(K) 对应于图 – 1环中的某一个点,如果该点对应没有映射到具体的某一个机器节点,那么顺时针查找,直到第一次找到有映射机器的节点,该节点就是确定的目标节点,如果超过了2^32仍然找不到节点,则命中第一个机器节点。比如 Hash(K) 的值介于A~B之间,那么命中的机器节点应该是B节点(如上图 )。

    3、增加节点的处理

    如上图 – 1,在原有集群的基础上欲增加一台机器F,增加过程如下:

    计算机器节点的Hash值,将机器映射到环中的一个节点,如下图:
                                                                                  

    图二 

    增加机器节点F之后,访问策略不改变,依然按照(2)中的方式访问,此时缓存命不中的情况依然不可避免,不能命中的数据是hash(K)在增加节点以前落在C~F之间的数据。尽管依然存在节点增加带来的命中问题,但是比较传统的 hash取模的方式,一致性hash已经将不命中的数据降到了最低。

    以上是一致性哈希的具体实现,基于这种原理,我们可以看到一致性哈希的优点

    1。单调性

      因为一致性哈希的这种算法,有效的解决了单调性的问题。当分布系统中节点发生变化时,只有少量的数据参与重新计算和迁移。

    2。平衡性

      对于数据的分布均衡问题,通过虚拟节点的思想来达到均衡分配。当然,我们cache server节点越少就越需要虚拟节点这个方式来均衡负载。

    当物理服务器的数量很小时,需要更多的虚拟节点,反之则需要更少的节点。

    3。分散性

      关于分散性,人家还没有想明白,再说吧,大过年的

  • 相关阅读:
    [CF1106E] 边界有问题
    UOJ 67 新年的毒瘤
    BZOJ 1093 [ZJOI2007]最大半连通子图
    codeforces round#510
    codeforces round#509
    杂谈
    BZOJ 3007 [SDOI2012]拯救小云公主
    BZOJ 1799
    BZOJ 3329
    BZOJ 3209 花神的数论题
  • 原文地址:https://www.cnblogs.com/luluQQ/p/4295277.html
Copyright © 2011-2022 走看看