架构师日记——理解Memcached的分布式方式

Memcached尽管是“分布式”的缓存系统,但服务器端并没有分布式功能。各个Memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现

Memcached的分布式客户端

客户端可以通过配置SockIOPool的servers参数保存服务器地址列表,通过weight参数配置每台服务器的权重。SockIOPool提供了连接池的服务,可以通过SockIOPool来配置memcahce服务器相关信息,如最大连接数,最小连接数等。
一个key只能存放在一台Memcache服务器上,是不会在多个服务器上有多份拷贝的,这样的话既可以防止出现刷新不同步的情况,也可以避免磁盘空间的浪费

Memcached的分布式特点

1:服务器端不关心分布式
2:依靠客户端来实现分布式
3:客户端存储着可以访问到的Memcached服务器列表
4:在客户端用算法来保证,对同样key值的数据,读写都操作同一个服务器

根据余数计算分散

Memcached的分布式方法简单来说,就是“根据服务器台数的余数进行分散”。求得键的整数哈希值,再除以服务器台数,根据其余数来选择服务器。

根据余数计算分散的缺点

余数计算的方法简单,数据的分散性也相当优秀,但也有其缺点。那就是当添加或移除服务器时,缓存重组的代价相当巨大。添加服务器后,余数就会产生巨变,这样就无法获取与保存时相同的服务器,从而影响缓存的命中率

分布式中的一致性Hash算法

Consistent Hashing方式如下:首先求出Memcached服务器(节点)的哈希值,并将其配置到0~2的32次方的圆上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2^32仍然找不到服务器,就会保存到第一台memcached服务器上。
这里写图片描述
如果要添加一台memcached服务器。余数分布式算法由于保存键的服务器会发生巨大变化而影响缓存的命中率,但Consistent Hashing中,只有在continuum上增加服务器的地点逆时针方向的第一台服务器上的键会受到影响。
这里写图片描述

从上面的分析可知,Consistent Hashing最大限度地抑制了键的重新分布。而且,有的Consistent Hashing的实现方法还采用了虚拟节点的思想。使用一般的hash函数的话,服务器的映射地点的分布非常不均匀。因此,使用虚拟节点的思想,为每个物理节点(服务器)在continuum(环)上分配100~200个点,也就是这些点都类似12341234……的循环。这样就能抑制分布不均匀,最大限度地减小服务器增减时的缓存重新分布。

使用Consistent Hashing算法的memcached客户端函数库进行测试的结果是,由服务器台数(n)和增加的服务器台数(m)计算增加服务器后的命中率计算公式如下:
(1 - n/(n+m)) * 100

猜你喜欢

转载自blog.csdn.net/qq_32198277/article/details/77777031