loading...

Memcache分布式部署方案

发布时间:April 29, 2009 分类:Memcache

奇矩互动招聘进行中

2009年五一生活小结

前言
应该是很久之前,我开始研究Memcache,写了一系列的学习心得,比如《Discuz!的Memcache缓存实现》等。后面的好几十条回复也让这篇文章成为了此博客中颇受关注的一员。

同时在百度和Google,关键词Memcache在长达一年多的时间里占据着第二位(第一位是官方),为很多需要了解或者应用Memcache的朋友提供了一些信息,但是我始终觉着还不够,于是本文诞生。

唠唠叨叨说了半天,如果你觉着前面啰嗦,请直接看最后一大段,那是本文的重点。

基础环境
其实基于PHP扩展的Memcache客户端实际上早已经实现,而且非常稳定。先解释一些名词,Memcache是danga.com的一个开源项目,可以类比于MySQL这样的服务,而PHP扩展的Memcache实际上是连接Memcache的方式。

首先,进行Memcache被安装具体可查看:
Linux下的Memcache安装:http://www.ccvita.com/257.html
Windows下的Memcache安装:http://www.ccvita.com/258.html;
其次,进行PHP扩展的安装,官方地址是http://pecl.php.net/package/memcache
最后,启动Memcache服务,比如这样

/usr/local/bin/memcached -d -p 11213 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid
/usr/local/bin/memcached -d -p 11214 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid
/usr/local/bin/memcached -d -p 11215 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid

启动三个只使用10M内存以方便测试。

分布式部署
PHP的PECL扩展中的memcache实际上在2.0.0的版本中就已经实现多服务器支持,现在都已经2.2.5了。请看如下代码

$memcache = new Memcache;
$memcache->addServer('localhost', 11213);
$memcache->addServer('localhost', 11214);
$memcache->addServer('localhost', 11215);
$memStats = $memcache->getExtendedStats();
print_r($memStats);

通过上例就已经实现Memcache的分布式部署,是不是非常简单。

分布式系统的良性运行
在Memcache的实际使用中,遇到的最严重的问题,就是在增减服务器的时候,会导致大范围的缓存丢失,从而可能会引导数据库的性能瓶颈,为了避免出现这种情况,请先看Consistent hashing算法,中文的介绍可以参考这里,通过存取时选定服务器算法的改变,来实现。

修改PHP的Memcache扩展memcache.c的源代码中的

"memcache.hash_strategy" = standard


"memcache.hash_strategy" = consistent

重新编译,这时候就是使用Consistent hashing算法来寻找服务器存取数据了。

有效测试数据表明,使用Consistent hashing可以极大的改善增删Memcache时缓存大范围丢失的情况。
NonConsistentHash: 92% of lookups changed after adding a target to the existing 10
NonConsistentHash: 90% of lookups changed after removing 1 of 10 targets
ConsistentHash: 6% of lookups changed after adding a target to the existing 10
ConsistentHash: 9% of lookups changed after removing 1 of 10 targets

Tags: Memcache, 分布式, 部署


已有 16 条评论 »

  1. deeka deeka

    我觉得最好拿一台稳定的机子,在addServer之connect着

  2. Guest Guest

    Come on, boy! It should be "Memcached"....

    1. kimi kimi

      @Guest, tks for reminding me

  3. 丹木秋风 丹木秋风

    再看的时候又实际化了一些啊.

  4. small small

    最近在看 memcache的源码,不知道楼主可否写一些源码分析,或者分析一下memcache的实现原理

  5. 陈敏 陈敏

    本来是搜索 memcached 搜到你网站的
    看见你 “媳妇” 标签也挺大的
    做了个友情链接
    下次找技术文章 就来你这里看看

  6. liaofuqian liaofuqian

    多谢分享,很好很强大,学习。

  7. near near

    到此一游,留名。学习了。

  8. CrazyTom CrazyTom

    请问一下,memcache 有没有容灾处理啊,如何分组部署

  9. chinaphp.com chinaphp.com

    其实没必要修改源码在编译,直接修改 PHP.INI 的配置文件就可以实现consistent算法。当然如果只有一台 ,那算法也无所谓了。

  10. Musikar Musikar

    看了你很多文章 也来凑个热闹

  11. dawn dawn

    大哥,麻烦会回小学在学下语文,要不,就别写博文了。语文都没学好,自己看看你写的鸟文,逻辑混乱。

  12. darthvader7 darthvader7

    产品内同时引入ehcache和memcache,并要求可替换,觉得有点怪,感觉这两个就不是以个级别的,但还是要做。
    ehcache有缓存块,可以flush一个块,这样不同模块的缓存互不影响,场景如:
    spring+ehcache配置接口的缓存,现在缓存了一个接口其结果是一个列表,modify了其中一个对象,则应更新列表的返回结果,此时我们使用了flush
    对应的场景在memcache中,首先我感性的人为在new client时这个poolname和缓存块类似,但测试时(windows上的memcahced服务)发现同一个服务内不同的poolname并没有划分出缓存块来,这个poolname是干嘛的??
    现在如果想在memcache上实现不同模块相对独立的缓存,是否只能以不同的poolname对应不同的服务来准备出一群client??

  13. nanquan nanquan

    很多错误啊... 楼主很长时间没有更新文章了.....
    就像你说的, 你的文章确实在搜memcached时候比较靠前, 所以楼主更要负起责任来呐>>

    比如: 启动时, 要指定不同的pid文件吧, 要不然前面的pid就没有了...
    -P /tmp/memcached.pid

  14. jimmy jimmy

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

    实际使用中可以这样手动调节

    1. seven seven

      加在配置文件里面嘛

添加新评论 »

captcha
请输入验证码