Memcached的分布式方式
Memcached是要给分布式的缓存系统,但是Memcached的分布式是基于客户端的方式,Memcached的各个服务端并不会进行互相通信以共享信息。
Memcached的分布式客户端
客户端通过SockIOPool的servers参数来配置服务器地址列表,通过weight参数配置每台服务器的权重。在分布式的Memcached中,一个key只能存放在一台Memcache服务器上,这样可以防止出现刷新不同步的情况,也可以节约内存空间。
Memcached分布式余数计算法
- 根据传入的key值求得key的hashcode值 H。
- 计算H值与服务器总台数(C)的余数M(M = H%C)
- 将对象存入序号为M的服务器上。
余数计算法的特点
余数计算的方法简单,数据的分散性也相当优秀,但也有其缺点。那就是
当添加或移除服务器时,缓存重组的代价相当巨大。添加服务器后,余数就会产
生巨变,这样就无法获取与保存时相同的服务器,从而影响缓存的命中率
Memcached分布式一致性Hash算法
- 先算每台服务器(节点)的hash值,然后将这些值映射到一个0到2^32次方的圆上。
- 计算存储数据的key的hash值,然后将这个值同样也映射到服务器分布的圆上,然后顺时针查找,将数据保存到查找到的第一个服务器。
3.采用一致性Hash算法,这样在添加一个服务器节点的时候。就只会影响增加服务器的地点逆时针方向的第一台服务器受影响。
4.一致性Hash最大限度地抑制了键的重新分布。使用一般的hash函数的话,服务器的映射地点的分布非常不均匀。因此,使用虚拟节点的思想,为每个物理节点(服务器)在圆上分配100~200个点。这样就能抑制分布不均匀,最大限度地减小服务器增减时的缓存重新分布。
5.采用一致性Hash算法的情况下,由N台服务器增加M台服务器后,缓存的命中率为(1-N/(N+M))*100.