`
qxf567
  • 浏览: 21650 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一致性hash在memcache中的路由应用

    博客分类:
  • Java
 
阅读更多

 

memcache主要由:路由模块、通信模块、接口等等够成。

 

一、普通hash映射的应用

 

人称通常称这种算法为“余数hash”、或者“取模hash”。只考虑hash的应用,不考虑具体hash算法的实现。具体hash算法实现,参考http://baike.baidu.com/view/273836.htm

 

应用场景:

 

比如你有 3 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 3 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到 3 个 cache ;

服务器编号hash(object)%3

 

一切都运行正常,再考虑如下的情况;

 

1由于访问加重,需要添加 cache ,这时候 cache 是 N+1 台,映射公式变成了 hash(object)%(N+1)

 

假如:当向原有的cache服务器中再添加cache时,此时映射结果会有如下变化

keyhash尾数

3台时的映射对象cache

4台时的映射对象cache

5台时的映射对象cache

...

00000

0

0

0

 

00001

1

1

1

 

00002

2

2

2

 

00003

0

3

3

 

00004

1

0

4

 

00005

2

1

0

 

...

...

...

...

 

       

 

根据上表依次类推会发现:

3变成4时有25%的命中,不命中率为75%

4变成5时有20%的命中,不命中率为80%

5变成6时有16.7的命中,不命中率为83.3%;

N变成N+1时有N/NN+1的最小公倍数,不命中率为1-N/NN+1的最小公倍数

 

当减少基数时仍然会发生上述情况,当基数变大时,不命中率如此之高。在实际应该中,对于服务器而言,这是一场灾难,洪水般的访问都会直接冲向后台服务……

 

二、一致性hash的应用

   

1.将整个哈希值空间组织成一个虚拟圆环,假设某哈希函数H的值空间为0-(2^32-1),即32位无符号整数;

2.将各节点用H函数哈希,可以将服务器的IP或主机名作为关键字哈希,这样每个节点就能确定其在哈希环上的位置;

3.将id用H函数映射到哈希空间的一个值,沿该值向后,将遇到的第一个节点做为处理节点。

 

 

 

 

 

 

当向原有的cache服务器中再添加cache时,此时映射结果会有如下变化

 

 

 



  

 

3->4

4->5

5->6

不命中率

1/6

1/8

1/10

1/N*2

 

随着cache服务器的个数增加,在添加会减少服务器个数时,影响范围越来越小,基本上可以解决洪水般的访问都会直接冲向后台服务了。但是,当45时,node4node5的实际利用率和压力大小仅为其它服务的一半。负载不能达到均衡了……

 

三、虚拟节点应用

考量 Hash 算法的另一个指标是平衡性 (Balance) ,定义如下:

 

平衡性

 

  平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。

 

hash 算法并不是保证绝对的平衡,如果 cache 较少的话,对象并不能被均匀的映射到 cache 上,比如在上面的例子中,仅部署 cache A 和 cache C 的情况下,在 4 个对象中, cache A 仅存储了 object1 ,而 cache C 则存储了 object2 、 object3 和 object4 ;分布是很不均衡的。

 

为了解决这种情况, consistent hashing 引入了“虚拟节点”的概念,它可以如下定义:

 

“虚拟节点”( virtual node )是实际节点在 hash 空间的复制品( replica ),一实际个节点对应了若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在 hash 空间中以 hash 值排列。

 

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

 

 

 

  引入“虚拟节点”后的映射关系

 

 

 



  

 

 

此时,对象到“虚拟节点”的映射关系为:

 

objec1->cache A2 ; objec2->cache A1 ; objec3->cache C1 ; objec4->cache C2 ;

 

因此对象 object1 和 object2 都被映射到了 cache A 上,而 object3 和 object4 映射到了 cache C 上;平衡性有了很大提高。

 

引入“虚拟节点”后,映射关系就从 { 对象 -> 节点 } 转换到了 { 对象 -> 虚拟节点 } 。查询物体所在 cache 时的映射关系如图 7 所示。

 

 



  

 

通常一个节点可分为150个虚拟节点。通过使用虚拟节点后,增加或减少cache 服务器对于节点的不命中率大大降低,平衡性也有大的改善。

 

参考:

 

http://blog.csdn.net/sparkliang/article/details/5279393

http://blog.csdn.net/mayongzhan/article/details/4298834

  • 大小: 38.7 KB
  • 大小: 32.6 KB
  • 大小: 11.6 KB
  • 大小: 12.8 KB
分享到:
评论

相关推荐

    MemCache详细解读1

    然而,为了构建一个高效且可扩展的分布式缓存系统,需要考虑如何妥善处理服务器的增减,以及选择合适的路由算法,如一致性Hash,以最小化数据迁移带来的影响。对于大型网站来说,优化缓存策略和管理分布式缓存系统是...

    session共享 tomcat+nginx+memcache

    5. **Nginx配置**:在Nginx的配置文件中,你可以使用`ip_hash`或`sticky`模块来基于用户的IP地址或特定cookie保持会话粘滞,确保同一用户的请求始终路由到同一台Tomcat服务器,以减少Session同步的需求。 6. **测试...

    Dubbo面试.pdf

    4. ConstantHashLoadBalance:一致性Hash策略,保证相同参数的请求总是发送到同一提供者。 关于Dubbo的核心功能和核心组件,面试中可能需要回答以下几点: - Remoting模块:负责网络通信,提供了对多种NIO框架的...

    Dubbo面试及答案(上).pdf111

    - **ConstantHash LoadBalance**:一致性Hash策略,保持相同请求到同一提供者,避免提供者变更引发的波动。 **5. Dubbo的核心功能** - **Remoting**:网络通信框架,支持多种NIO框架,提供同步到异步的转换和请求-...

    Java Dubbo面试及答案

    4. ConstantHash LoadBalance:一致性 Hash 策略,使相同参数请求总是发到同一提供者,一台机器宕机,可以基于虚拟节点,分摊至其他提供者,避免引起提供者的剧烈变动。 五、Dubbo 是什么? Dubbo 是一个分布式、...

    Dubbo面试及答案(上).pdf

    4. **ConsistentHash LoadBalance**:一致性哈希策略,相同参数的请求总是发送到同一个提供者,通过虚拟节点分散提供者变更的影响。 【Dubbo是什么?】 Dubbo是一个分布式、高性能的RPC服务框架,提供了服务自动...

    java高级工程师面试总结

    - 应用最终一致性的设计理念。 - 引入分布式事务技术(如两阶段提交)。 #### 安全 - **什么是XSS攻击,具体如何实现**: - XSS(Cross-Site Scripting,跨站脚本攻击)是一种注入攻击,攻击者在网页中插入恶意...

    Redis面试知识点.pdf

    - **原子性**:所有的操作都是原子性的,确保了数据的一致性和完整性。 - **事务支持**:通过`MULTI`和`EXEC`指令支持多个操作的原子性。 - **额外功能**:包括发布/订阅、通知、key过期等功能。 #### 4、Redis相比...

Global site tag (gtag.js) - Google Analytics