一致性hash算法

来源:互联网 发布:centos rpm安装jdk1.6 编辑:程序博客网 时间:2024/06/05 19:20

1.假设有4个值key1,key2,key3,key4  通常hash算法是int key1=hash(key1) /N; int key2= hash(key2) /N; int key3=hash(key3) /N;int key4=hash(key4) /N;

N为服务器的数量,但是当一台缓存服务器挂掉,N变为N-1,或者增加一台服务器,N变为N+1,此时意味着所有原来的缓存都生效了,因为N变化了

生成hash值后,将数据存放到一个0~2^31-1的闭形hash环中


2.Hash 算法的一个衡量指标是单调性( Monotonicity ),定义如下:

单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。容易看到,上面的简单 hash 算法 hash(object)%N 难以满足单调性要求。

3.一致性hash算法是:在移除 / 添加一个 cache 时,它能够尽可能小的改变已存在 key 映射关系,尽可能的满足单调性的要求

4.一致性hash算法是把对象和cache都hash到一个hash空间中,int cacheA=hash(cacheA) ;   int cacheB=hash(cacheB); cacheA通常是服务器Ip或者服务器名

object1沿着对象hash值,顺时针方向,找到的第一个hash(cacheA)值,就会将对象存放到cacheA中


3.移除cache




如果cacheB被移除了,就会逆时针方向,从CacheB到下一个CacheA之间的对象会受影响,即Object4,此时Object4,会顺时针,找到第一个cacheC,将value存放到cacheC上


4.添加cache









增加cacheD后,逆时针,CacheD到cacheB中,object3受影响,object3会顺时针,找到cacheD,将value存放到cacheD上


5.如果一个cache有多个key,但是一个cache只有一个key,怎么办呢?采用虚拟节点



cacheA1、cacheA2都是cacheA的节点,cacheB1、cacheB2都是cacheB的节点,这样对象就能更均匀分布在虚拟节点上,对应为cache服务器上

int cacheA1=hash(IP#1);int cacheA2=hash(IP#2)
























0 0
原创粉丝点击