Memcached研发测试
/ / 点击 /为准备公司网站的重构,前端时间研究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()函数算出服务器(节点)的哈希值, 并将其分布到0~2^32的圆上。用同样的hash()函数求出需要存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器(节点)上,新增一个节点的时候,只有在圆环上新增节点逆时针方向的第一个节点的数据会受到影响。删除一个节点的时候,只有在圆环上原来删除节点顺时针方向的第一个节点的数据会受到影响,因此通过Consistent Hashing很好地解决了负载均衡中由于新增节点、删除节点引起的hash值颠簸问题。
PHP的Memcached客户端库
目前有两个:PECL::memcache 和PECL::memcached,下边是两个库的比较:
两个库的稳定版本都是使用取模算法作为默认的分布算法,根据上面两个算法的解释可以看出,一致性算法是做memcached分布集群的最佳算法,因此我们需要将客户端库的默认分布算法改为一致性算法:
PECL::memcache库启用consistent一致性算法:
修改php.ini添加:1
2
3
4
5
6[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方法:1
2ini_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一致性算法:1
2
3$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分布集群的最佳选择,即提高了性能,又减少了由增删节点而引起的大量数据迁移的风险。
使用facebook的xprof模块测试PHP程序性能:
从Facebook开源项目中下载xprof1
2http://github.com/facebook
http://pecl.php.net/package/xhprof
安装过程:1
2
3
4
5# 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模块生成目录1
/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/
手动在php.ini里面添加xprof段:1
2
3[xhprof]
extension=xhprof.so
xhprof.output_dir=/data0/htdocs/test.letv.com/logs/xhprof/
用法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<?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