Posts Tagged ‘PHP’
关于memcached的PHP扩展
March 27th, 2011刚接触”memcache”时,一直被”memcache”的正确写法究竟是”memcache”还是”memcached”所困扰。今天在查如何配置session保存到”memcache”时,又遇到了各种版本困扰的问题,于是整体整理一下,如下:
首先,无论memcache还是memcached,所指的系统都是memcached内存对象缓存系统。
至于,为什么有memcache,这得从PHP的扩展说起,memcached是一个开源的系统,最初在PECL中出现的是一个叫memcache的PHP扩展(04年),按照memcached的接口实现的。
在09年某月某日的时候,PECL中又出现了一个叫memcached的PHP扩展,很好,这下有3个概念了。
1. 服务器跑的进程是memcached系统
2. 实现memcached接口的PHP扩展之PECL/memcache
3. 实现memcached接口的PHP扩展之PECL/memcached
无论使用哪种PHP扩展,在服务器安装都需要先安装memcached,最新的版本为1.4.5(安装文档可参考该篇文章)
而PECL/memcache和PECL/memcached则也有各自的版本(与memcached系统的版本号无关)
PECL/memcache 2.*系列的版本最新stable版为2.2.6(这也是在phpinfo中查看的memcache扩展的版本号),PECL/memcache 3.*版本最新为3.0.5beta版
PECL/memcached 1.*系列的版本最新stable版为1.0.2,2011-03-13则提交了2.0.0b1版
这里有这两个扩展的对比表,简单翻译如下:
这两个扩展都支持最基本的操作,比如多组服务器,读写值,值的增减以及获取服务器的统计信息。
这里是一些更为高级的特性和信息。
| pecl/memcache | pecl/memcached | |
|---|---|---|
| 首次发布日期 | 2004-06-08 | 2009-01-29 (beta) |
| 活跃发展? | Yes | Yes |
| 依赖的外部组件 | None | libmemcached |
| 特性 | ||
| key的自动修正1 | Yes | No |
| 追加/预置Prepend | No(注:从3.0.0开始已增加对Append/Prepend的支持) | Yes |
| 自动序列化2 | Yes | Yes |
| 二进制协议 | No(注:从3.0.0开始已增加对二进制协议的支持) | Optional |
| CAS3 | No(注:从3.0.0开始已增加对CAS的支持) | Yes |
| 压缩 | Yes | Yes |
| 通信超时 | Connect Only | Various Options |
| Consistent Hashing4 | Yes | Yes |
| 延迟获取 | No | Yes |
| 一次获取多值Multi-Get | Yes | Yes |
| 支持Session | Yes | Yes |
| 读写到指定的一个服务器 | No | Yes |
| 存储数值 | Converted to Strings | Yes |
- pecl/memcache会自动转换无效的key为有效。pecl/memcached则会返回false。
- 你无须对对象、数组进行序列化,这两个客户端都会自动完成序列化的过程。
- CAS:Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程更改过程的并发问题。
在Memcached中,每个key关联有一个64-bit长度的long型惟一数值,表示该key对应value的版本号。这个数值由 Memcached server产生,从1开始,且同一Memcached server不会重复。在两种情况下这个版本数值会加1:1、新增一个key-value对;2、对某已有key对应的value值更新成功。删除 item版本值不会减小。参考:http://langyu.javaeye.com/blog/680052 - Consistent Hashing:Memcached分布式的一种策略,比余数策略要好很多,具体原理可以参考这里,在pecl/memcache 3.0.0之前,默认的策略为stardard,即余数策略,在3.0.0之后则默认为consistent。可以通过php.ini里修改memcache.hash_strategy = consistent来指定。
从pecl/memcache的3.0.0开始,对原先许多不支持的特性进行支持,具体可以参考changelog,对二进制协议的支持可以通过memcache.protocol = {ascii, binary}来设置,并且修改了默认的设置:
memcache.hash_strategy = consistent(在3.0.0之前默认是stardard,即余数策略)
memcache.chunk_size = 32768(在3.0.0之前默认是8192,说明中也提到这个参数指数据传输块大小,这个值越小网络I/O次数越多,如果发现莫名的速度降低, 可以尝试将此值调至32768,所以在3.0.0中干脆直接默认值就是32768了)
当然pecl/memcache 3.0.*还没有stable版本发布,所以相比较而言,pecl/memcached 1.0.2 stable版就比pecl/memcache 2.2.6 stable版功能要强大些(二进制协议和CAS的支持),但是pecl/memcached 1.0.2 stable版也有一些不支持的功能,比如不支持发生错误时(对用户)透明的转移到其他服务器(即memcache.allow_failover ),也不支持持久连接等等。
在社区看到有人讨论,pecl/memcached有项功能getServerByKey,可以返回key所映射的服务器,这对于调试很是方便。
现在在pecl/memcache 3.0.5 的changelog中也加入了类似的功能MemcachePool::findServer(key)
目前我们用的是pecl/memcache 2.2.5,期待3.0系列的stable版!
最后,回到今天的问题上来,如何保存session到memcached中
对于pecl/memcache设置如下:
session.save_handler = memcache
session.save_path = "tcp://host1:11211, tcp://host2:11211"
(注:每个url可以包含参数,这些参数于方法Memcache::addServer()的参数相同。比如: “tcp://host1:11211?persistent=1&weight=1&timeout=1&retry_interval=15″)
对于pecl/memcached设置如下:
session.save_handler = memcached
session.save_path = "host1:11211, host2:11211"
注意:无tcp协议标识符
大型网站设计经验分享 技术交流讲座
December 3rd, 2010安哥的技术分享,宣传下~~~
报名地址:http://bbs.lampbrother.net/read-htm-tid-44436.html
讲座时间:2010年12月18日(星期六)14:00-16:00
活动地点:北京市海淀区东北旺西路8号中关村软件园9号楼2区附厅312室
活动收费:50元/人(报名即赠送兄弟连身份牌一个、价值35元的PHP视频教程光盘一套)
活动人数:100人
主办方:LAMP兄弟连 互动阳光
协办方:电子工业出版社 CSDN乐知教育 学生大本营
【讲座介绍】
大 型网站设计,无法回避这样一些问题:数据量大、访问量高、并发高……如何进行大型网站的部署与设计,本次讲座我们邀请到了业内资深专家,曾经在新浪、 UUsee、Comsenz等多家业内知名公司担任项目经理及技术总监的安然老师来为大家分享大型网站设计的经验。
【讲座议程】
引用13:30-14:00 签到
14:00-15:30 技术分享
15:30-16:00 答疑
16:00-16:05 抽奖
16:05-16:15 合影及交流
【讲座大纲】
引用1. 大型网站的特点
2. 大型网站技术的选择
a) 操作系统的选择
b) Web服务器的选择
c) 数据存储的选择
d) 语言的选择
3. 架构大型网站
a) 网站系统的设计
b) 网站服务器设计
c) 数据库的设计
4. 大型网站数据库压力解决方案
a) 缓存-动态缓存
b) 读压力:主从复制+读写分离
c) 容量:表分区
d) 读写压力:表分区+主从复制
e) 分库分库分表
f) NoSql数据库
5. 实际项目中PHP框架的选择
a) 框架的特点
b) 框架适合的领域
c) 如何选择框架
d) AnPHP介绍及设计特点
6. 实际项目开发经验分享
a) 腾讯品啦结婚频道
b) 新浪房产
c) 爱卡汽车论坛
【面向人群】
网站站长、技术主管、Web程序员及对网站开发有强烈兴趣的朋友
【讲师简介】
![]() |
安然 北京互动阳光科技有限公司创 始人,兄弟连项目经理,毕业于吉林大学计算机科学与技术专业。十余年互联网开发与管理经验,精通Linux、Apache、MySQL、PHP等Web技 术,熟悉网站架构、网站服务器部署、网站开发流程以及熟悉项目管理,熟悉中国特色社区的特点。曾任新浪房产研发经理、北京康盛创想有限公司项目总监、北京 悠视互动科技有限公司技术总监、新浪互动社区项目经理、新浪交友高级工程师以及慧聪高级工程师等职位。 |
“memcached全面剖析”笔记
December 3rd, 20101. 现在的memcached规格中,键长度最大为250字节,但二进制协议中键的大小用2字节表示。因此,理论上最大可使用65536字节(2的16次方)长的键。尽管250字节以上的键并不会太常用,二进制协议发布之后就可以使用巨大的键了。
二进制协议从版本1.3系列开始支持,memcached最新的版本为1.4.5
2. memcached默认采用slab allocation机制分配、整理内存,其基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块(chunk),以完全解决内存碎片问题。
2.5 slab allocation术语介绍
slab(有时又写作page):分配给slab的内存空间,默认是1M。分配给slab后根据slab的大小切分成chunk。
chunk:用于缓存记录的内存空间。
slab class:特定大小的slab组(所有在slab class中的slab拥有同样大小的chunk)
3. slab allocation可以重复使用已分配的内存,分配到的内存不会释放,而是重复利用。
4. slab allocation的缺点是由于分配的是特定长度的内存,因此无法有效利用分配的内存,将100字节的数据缓存到128字节的chunk中,就有28字节浪费了。
比较好的调优方案是计算预先客户端的数据大小,采用合适的chunk大小分组,调整chunk大小方法见第5点
5. chunk大小分组的方法:memcached -f 2,其中-f是growth factor因子,默认为1.25,曾经为2,即每个chunk划分的大小是前一个chunk大小的f倍。
按照计算的数据预期长度来调节growth factor值
6. 连接上memcached(可以用telnet连接),输入stats可以查看memcached状态,stats slabs或者stats items可以获得关于缓存的信息,quit退出。
7. 关于memcached分布式
7.1 根据余数进行打散:mc key的hash值(crc32等)/服务器台数,无法连接时将连接次数添加到key后面,rehash后再连接
余数打散法优点:方法简单,数据分散性也很优秀。
缺点:当添加/移除服务器时,缓存重组的代价相当巨大,缓存命中率明显下降。
7.2 mixi采用的Consistent Hashing分布法:首先求出memcached服务器(节点)的hash值,并将其配置到0~2的32次方的圆上,然后用同样的方法求出mc key的hash值,并映射到圆上。然后从数据映射的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2的32次方仍然找不到服务器,就会保存到第一台memcached服务器上。
优点:当添加服务器时,只有这台服务器添加位置的逆时针方向的第一台服务器上的key会受到影响,最大程序抑制了key的重新分布。
*而且,有的Consistent Hashing实现方法还采用了虚拟节点的思想。使用一般hash函数的话,服务器的映射地点非常不均匀。因此,使用虚拟节点的思想,为每个服务器在圆上虚拟分配100~200个点。这样就能抑制分布不均匀,最大限度减少服务器增减时的缓存重新分布。
8. last.fm开发了一个支持Consistent Hashing的PHP库,名为ketama
9. memcached进程的实际内存分配量要比指定的容量要大,因为启动指定的只是用于数据保存的内存大小,并不包括slab allocation本身占用的内存以及为保存数据而设置的管理空间等。
10. memcached内存分配量尽量不要超过3G(即使是64位的4G内存的服务器),因有可能造成内存交换(swap)
11. 将与memcache的连接保持在进程中,以减少TCP连接的开销。
12. 如果不支持连接失败的rehash功能,则最好限制连接失败后指定时间内不要再连接该失败的服务器。
13. 将所有共享/公用的缓存数据设置类命名空间,将该命名空间下的key保存到多台memcached服务器中,取得时从中仅选取一台即可。
14. daemontools可以监视memcached进程的停止并自动启动。
15. nagios监视memcached的get、add动作,也可以监视stats
16. rrdtool将stats目录转化成图形,进行性能监视
