1 背景
现在的高并发网站,都离不开缓存系统,通常情况下,大部分的请求都会直接打到缓存系统,从而提高响应速度并减少后端DB或者二级缓存的压力。缓存系统通常都是以一个集群的形式存在的,内容被缓存在若干台缓存服务器上,例如我们有 \(n \)台缓存服务器,那么通常的做法是对被缓存的对象 \(O\) 进行哈希操作然后再对 \(n\) 求余,即
2 主要原理
一致性哈希的主要原理是一种环状的Hash空间,然后将待存储对象和可以存储服务的机器都hash到这一个环状的hash空间中(这里和传统的hash负载的主要区别就是,传统的hash仅仅对数据进行hash操作),然后将待存储对象沿着圆环逆时针(顺时针)滑动直到遇到一个机器节点,然后就将该对象存储到这个机器节点中。当删除某一台机器时,就将该机器上的所有数据对象都按照圆环移动到下一台机器,当添加一台机器到圆环上时,这个点的下一台机器就将自己存储的对象中映射空间在被添加的机器节点之前的数据移动到被添加的机器上去。这样一来不管时新增或者删除机器都不会对现有的缓存系统造成很大的影响。
3 举例说明
假设Hash空间为0-99,系统中有A,B,C三台机器,其中:
然后有a,b,c,d四个数据,有:
那么根×据上面的规则,按照递增的方向去则数据分布情况如下:
A=(a),
B=(b),
C=(c,d)
此时如果新增了一个D服务器,且
那么D的下一个节点C中比D小的节点都会移动到D中,则分布情况就变成了:
A=(a),
B=(b),
C=()
D=(c,d)
此时A服务器失效了,那么A中的数据将会转移到下一个服务器节点中,数据分布情况就会变成下面这种情况:
B=(a,b),
C=()
D=(c,d)
4 一致性哈希的特点
- 冗余少
- 负载均衡
- 过度平滑
- 存储均衡
- 关键词单调
5 总结
目前一致性哈希基本成为了分布式系统组件的标准配置,例如Memcached的各种客户端都支持内置的一致性哈希的支持。