Consistent Hashing Algorithm 一致性hash算法

本文深入探讨了一致性哈希算法在动态变化的Cache环境下的优势,详细解释了其如何解决传统路由分配策略在增删MemcachedServer时导致的数据不一致问题。通过虚拟节点和环状维护方式,一致性哈希算法实现了数据的均匀分布,显著提高了系统的稳定性和数据访问效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哈希算法

  一致性哈希提出了在动态变化的Cache环境中,哈希算法应该满足的4个适应条件: 平衡性(Balance)    单调性(Monotonicity)   分散性(Spread)   负载(Load)  此处摘自http://baike.baidu.com/view/1603139.htm

 

一致性哈希算法(Consistent Hashing Algorithm)是一种分布式算法,常用于负载均衡。Memcached client也选择这种算法,解决将key-value均匀分配到众多Memcached server上的问题。

传统的取模操作的路由分配策略,无法应对动态的增删Memcached Server的问题,比如当某台cache Server 的压力或者数据量比较大或者宕机的时候,动态的增删server会导致同一个key,在get操作时分配不到数据真正存储的server,命中率会急剧下降。这种情况一般是依靠cache 失效策略来做,如何降低这种情况的影响呢,Consistent Hashing 是个不错的思路。

在一致性哈希算法中cache server 以一个环状形式维护,每个server 维护一定范围的key 值,通过一定的hash 算法,使得不同的数据均匀分布在不同的cache server 上,针对server 数量小的情况也可以通过虚拟节点的形式来存储和路由数据节点。实际的存储还是在实际的 cache server上,只是一个 cache server 映射为多个虚拟的节点,并存储这几个虚拟节点的数据。具体的原理参考 http://weblogs.java.net/blog/2007/11/27/consistent-hashing 按照这篇blog的测试经验数据,为每个物理节点(服务器)在圆上分配100~200个虚拟节点对于均匀分布数据来说效果是最好的。

关于一致性hash算法的实现 ketama 采用了几种语言做了实现,源代码可以拉下来看一下,对于理解还是蛮有帮助的 http://www.audioscrobbler.net/development/ketama/

 

看了下java 版本的实现,里面以一个server 提供多个socket链接为例,阐述了一致性hash算法的应用,使得客户端均匀的获取到服务端的socket数据。不过里面是用的hashMap 来做的信息存储,多线程下是存在并发安全性问题的。但是对于理解一致性hash算法思路还是蛮不错的。在此记录下自己的轨迹,哈哈

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值