哈希算法
一致性哈希提出了在动态变化的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算法思路还是蛮不错的。在此记录下自己的轨迹,哈哈