memcache的分布式

memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能。服务器端仅包括内存存储功能,其实现非常简单。至于memcached的分布式,则是完全由客户端程序库实现的。这种分布式是memcached的最大特点。



memcache分布式算法

1. 余数分散法,就是“根据服务器台数的余数进行分散”。 求得键的整数哈希值,再除以服务器台数,根据其余数来选择服务器。

在php客户端中,默认采用该算法,也可以在ini中设置Memcached::OPT_DISTRIBUTION=Memcached::DISTRIBUTION_MODULA。

余数计算的方法简单,数据的分散性也相当优秀,但也有其缺点。 那就是当添加或移除服务器时,缓存重组的代价相当巨大。 添加服务器后,余数就会产生巨变,这样就无法获取与保存时相同的服务器, 从而影响缓存的命中率。为了在解决这个问题,实现了另一种分布式算法:hash一致性算法。

2.hash一致性算法(Consistent Hashing)

Consistent Hashing如下所示:首先求出memcached服务器(节点)的哈希值, 并将其配置到0~232的圆(continuum)上。 然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。 然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。 如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上,如下图。在php客户端中在ini中设置Memcached::OPT_DISTRIBUTION=Memcached::DISTRIBUTION_CONSISTENT




具体的设置:

ini_set('memcache.hash_strategy', "consistent");

phpinfo();

?>


wKiom1U3FHnSxax4AABmRjrH4eg543.jpg

consistent:哈希一致性算法。。




ini_set('memcache.hash_strategy', "standard");

standard取余算法

wKiom1U3FgHiZ6a6AABUkRuhf38324.jpg



文件:

/etc/php.d/memcache.ini