注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

成长...

坚持,一定要坚持!

 
 
 

日志

 
 

Memcached研发测试  

2010-05-17 00:36:01|  分类: 私人日志 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
为准备公司网站的重构,前端时间研究Memcached分布式集群 和 Hiphop-php(Facebook的一个开源项目)的搭建 ,花了不少时间和精力,下边进行一下整理。。。

一、Memcached客户端库算法研究

       取模算法与一致性算法

Memcached虽然被称为分布式缓存服务器,但是服务器段并没有分布式功能,实现分布式主要是通过客户端库来实现。无论使用哪种语言实现的客户端库都会包含至少一种分布算法来实现Memcached分布式。

因此笼统来说客户端库是通过一个分布算法和维护的一个服务器列表来实现Memcached分布式的,关于分布算法目前有两种选择:取模算法(modula hashing)和一致性算法(consistent hashing)

取模算法(modula hashing)是当前多数客户端库默认算法 [Hash($key) % $svrNum ],就是根据服务器节点数的余数来进行分散,就是通过hash函数求得的Key的整数哈希值再除以服务器节点数并取余数来选择服务器。这种算法取余计算简单,分散效果好,但是缺点是如果某一台机器宕机,那么应该落在该机器的请求就无法得到正确的处理,这时需要将当掉的服务器从算法从去除,此时候会有(N-1)/N的服务器的缓存数据需要重新进行计算;如果新增一台机器,会有N/(N+1)的服务器的缓存数据需要进行重新计算。对于系统而言,这通常是不可接受的颠簸(因为这意味着大量缓存的失效或者数据需要转移)。

      一致性算法(consistent hashing)来源于p2p网络的路由算法,算法描述:hash值一般为unsigned int型,因此对于hash函数的结果应该均匀分布在[0,2^32-1]间,把一个圆环用2^32  个点来进行均匀切割,首先按照hash()函数算出服务器(节点)的哈希值, 并将其分布到02^32的圆上。用同样的hash()函数求出需要存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器(节点)上,新增一个节点的时候,只有在圆环上新增节点逆时针方向的第一个节点的数据会受到影响。删除一个节点的时候,只有在圆环上原来删除节点顺时针方向的第一个节点的数据会受到影响,因此通过Consistent Hashing很好地解决了负载均衡中由于新增节点、删除节点引起的hash值颠簸问题。

PHP的Memcached客户端库目前有两个:PECL::memcache 和PECL::memcached,下边是两个库的比较:

 

 

PECL::memcache

PECL::memcached

第一个版本时间

2004-06-08

2009-01-29(beta)

外部依赖

libmemcached

二进制协议

3.0.0以上版本

可选

当前最新稳定版本

2.2.5

1.0.1

通讯超时支持

connect支持

多种选项

一致性算法

支持

支持

储存数值类型

转化为字符串

支持

UDP支持

3.0.0以上版本支持

不支持


两个库的稳定版本都是使用取模算法作为默认的分布算法,根据上面两个算法的解释可以看出,一致性算法是做memcached分布集群的最佳算法,因此我们需要将客户端库的默认分布算法改为一致性算法:

PECL::memcache库启用consistent一致性算法:

修改php.ini添加:

[Memcache]

memcache.allow_failover= 1

memcache.max_failover_attempts  = 20

memcache.chunk_size= 32768

memcache.hash_strategy = consistent
memcache.hash_function= crc32

或在PHP中使用ini_set方法:

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

ini_set('memcache.hash_function ',' crc32');

 

PECL::memcache模块使用手册

http://www.php.net/manual/en/book.memcache.php

 

PECL::memcached(libmemcached)库启用consistent一致性算法:

$mc = newMemcached();  

$mc->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT);
$mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);


PECL::memcached模块使用手册

http://www.php.net/manual/en/book.memcached.php



二、两个客户端库的性能测试

从上面的表格我们看出pecl::memcached库是基于libmemcached工具库的,我使用facebook的xprof库对二者进行了一下测试,基于libmemcached的pecl::memcached库性能要比pecl::memcache库高出很多,数据这里就不给了。

综上两点使用pecl::memcached库,并使用一致性算法并同时设置LIBKETAMA_COMPATIBLE选项为true,这是我们做memcached分布集群的最佳选择,即提高了性能,又减少了由增删节点而引起的大量数据迁移的风险。

下面记录一下xprof的用法:

使用facebookxprof模块测试PHP程序性能:

Facebook开源项目中下载xprof

http://github.com/facebook

http://pecl.php.net/package/xhprof

 

安装过程:

      # tar zxvf xhprof-0.9.2.tar.gz

      # cd xhprof-0.9.2/extension

      # /usr/local/webserver/php/bin/phpize

      # ./configure--with-php-config=/usr/local/webserver/php/bin/php-config

      # make && make install

Xhprof.so模块将安装在

/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/目录中

 

手动在php.ini里面添加xprof段:

[xhprof]

extension=xhprof.so

xhprof.output_dir=/data0/htdocs/test.letv.com/logs/xhprof/

用法:

<?php

//启用初始化
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

…….测试程序放在这里

//生成性能分析数据文件

$xhprof_data= xhprof_disable();

 

//调用xhprof提供的web接口,通过Web方式查看性能数据

include_once"xhprof_lib/utils/xhprof_lib.php";

include_once"xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs= new XHProfRuns_Default();

$run_id= $xhprof_runs->save_run($xhprof_data, "xhprof_testUDP");

echo"---------------\n".

     "Assuming you have set up the httpbased UI for \n".

     "XHProf at some address, you can viewrun at \n".

     "http://10.57.30.70/xhprof_html/index.php?run=$run_id&source=xhprof_testUDP\n".

     "---------------\n";

?>


xhprof参考文档:

xhprof手册:http://mirror.facebook.net/facebook/xhprof/doc.html#installation



  评论这张
 
阅读(1757)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017