memcached:由LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件,现已成为mixi,hatena,Facebook,Vox,LiveJournal等众多服务器提高Web应用程序扩展性的重要因素;
memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。
memcached完全工作在旁路模式下,自身并不是缓存服务器,数据不会保存在磁盘上,只是一个提供了缓存功能的服务器,可缓存所有可序列化的数据;所能缓存的值的大小不能超过1M;基于事件驱动,使用epoll算法;
memcached的特点
1,协议简单:服务器与客户端通信使用基于文本行的协议,而不是基于其他复杂的协议(如XML等);
2,基于libevent的事件驱动模型:memcached依赖于libevent库;
3,使用内存存储的方式:memcached的数据存储在内存中,因此性能得到提升,但重启机器后数据会丢失,如果要保证数据不丢失可以采用memcachedb或redis;
4,memcached各服务器之间完全独立:多台memcached服务器的情况下,各服务器之间也不会互相通信,存放的数据不会共享;
libevent:一个事件触发的网络库,适用于多种平台(Linux,BSD,windwos),内部使用select,epoll,kqueue等事件机制,拥有高性能,即使对服务器连接数的增加,也能达到O(1)的性能;
LRU(Least Recently Used):尽管memcached或优先使用已经超时的缓存记录空间,但当存放的数据量达到指定的值后(内存空间不足时),LRU算法会自动删除不常使用的数据,以存放新的数据;
memcached内存管理机制
malloc和free:早期使用的内存管理机制,容易导致内存碎片,降低系统性能;
Salb Allocation:现在使用的内存管理机制,将从内核获取到的内存分割成许多不同大小的块,然后把相当大小的块分为一个组;
主要术语
page 分配给slab的内存空间,默认是1MB;分配给slab后根据slab的大小切分成块(chunk);
chunk 用于缓存数据的内存空间;
slab class 特定大小的块的组;
存储过程
memcached收到程序发送的数据后,查找memcached中保存的slab class内空闲chunk的列表,选择与数据的大小合适的chunk保存数据;
缺点:由于chunk的大小是固定的,将100字节的数据缓存到128字节的chunk,会造成28字节的内存空间浪费;
growth factor(生长因子):为了尽量减少内存空间的浪费,可以根据缓存数据的大小为slab指定生长因子,用于控制slab class之间的差异(使用memcached -f指定),默认为1.25,如第一组slas class的chunk大小为88字节,第二组slab class的chunk大小为112字节,第三组为144字节;在该选项出现之前,该因子为2,被称为“powers of 2”策略;
memcached删除机制
memcached类似于磁盘的存储方式,数据删除或超时后不会从内存中删除,而是修改它的状态(类似于inode map,客户端自此将无法查看数据),memcached让新的数据可以重复使用该chunk;
lazy expiration:memcached不会检查缓存记录是否过期,而是在get时查看缓存记录的时间戳,查看是否过期;所以,memcached不会在过期检查上耗费cpu资源;
memcached分布式算法
当有多台memcached服务器时,客户端程序使用的算法主要有以下两种
根据余数计算分散:根据服务器台数的余数进行分散,通过计算对"键"的整数哈希值,然后再除以服务器的台数,根据其余数来选择服务器;
缺点:添加或删除服务器时,余数会发生巨变,将无法获取与数据保存时相同的服务器,从而影响缓存的命中率,因此缓存重组的代价相当大;
一致性hash算法(Consistent Hashing):首先计算出memcached服务器的的hash值,并将其放入到0~2的32次方的圆上,然后用同样的方法计算出"键"的hash值,并映射到圆上,然后从数据映射的位置开始顺时针查找,将数据保存在找到的第一台服务器上;如果超过2的32次方仍然找不到服务器,则保存在第一台服务器上;
优点
1,添加或删除服务器,只有从增删节点的位置到逆时针的第一台服务器这个范围内的键受到影响;
2,为了避免服务器映射点的分布不均匀,一致性hash算法采用了虚拟节点,为每个物理服务器分配100-200个虚拟节点放在圆上,虚拟节点映射到物理服务器,每个存放在虚拟节点上的缓存实际上都是存放在物理节点上,这样就能最大限度的减小分布不均匀;计算公式"(1-n/(n+m))*100",n是原有服务器台数,m是增加服务器的台数;
给予memcached多大内存
1,在32位系统中,每个进程最多只能用2G内存;
2,-m指定的内存为memcached保存数据使用的大小,不包括"slab alloctor"自身占用的内存和为了保存数据而使用的管理空间,因此memcached实际使用的内存会大于指定内存;
3,由于实际使用的内存会大于指定的内存,因此需要确保分配给memcached内存后,不会引发swap(如服务器4G内存,指定memcached使用3G内存);
安装memcached
服务器IP地址:192.168.159.130;
操作系统:CentOS 6.4 x86 (已安装开发工具);
同步时钟:ntpdate time.windwos.com
创建一个memcached用的系统用户:useradd -r -u 112 -M -s /sbin/nologin memcached
memcached默认监听端口:11211 tcp/udp;
安装过程
1,依赖库libevent
下载地址:https://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar xf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure --prefix=/usr/local/libevent-2.0.21
make
make install
ln -s /usr/local/libevent-2.0.21 /usr/local/libevent
2,编译安装memcached
下载地址:http://memcached.org/files/memcached-1.4.20.tar.gz;
tar xf memcached-1.4.20.tar.gz
cd memcached-1.4.20
./configure --prefix=/usr/local/memcached-1.4.20 --with-libevent=/usr/local/libevent-2.0.21
make
make install
ln -s /usr/local/memcached-1.4.20 /usr/local/memcached
3,启动memcached
/usr/local/memcached/bin/memcached -u memcached -d
4,memcached命令的常用选项
-l <ip_addr> 指定进程监听的地址;
-d 以服务(daemon)模式运行在后台;
-u nobody 以指定的用户身份运行memcached进程;
-m 64m 用于缓存数据的最大内存空间,单位为MB,默认为64MB,建议指定的内存大小不应该太大(2G-3G左右);
-c 1024 最大支持的并发连接数,默认为1024;
-p 11211 指定监听的TCP端口,默认为11211;
-U 11211 指定监听的UDP端口,默认为11211,0表示关闭UDP端口;
-t 4 用于处理入站请求的最大线程数,仅在memcached编译时开启了支持线程才有效;
-f 1.25 设定Slab Allocator定义预先分配内存空间大小固定的块时使用的增长因子,默认为1.25;
-M 当内存空间不够使用时返回错误信息,而不是按LRU算法进行操作;
-n 指定最小的slab chunk大小,单位是字节;
-S 启用sasl进行用户认证;
-v 显示调试信息,-vv或-vvv可以显示更详细;
-h 获取命令帮助;
memcached数据管理命令
存储类命令
set 设置一个缓存,无论键是否存在;
add 新增,当键不存在时使用;
replace 替换,替换键中的数据;
append 在已有缓存后面附加值;
prepend 在已有缓存前面加值;
获取数据类命令
get 指定键
delete 清除
incr 原有缓存中的数值加1或指定的数值;
decr 原有缓存中的数值减1或指定的数值;
统计类命令
stats和stats items 查看缓存数据的信息;
stats slabs 查看slabs的占用情况;
stats sizes 查看空间的使用情况;
清理命令: flush_all 清空缓存;
使用telnet测试memcached
telnet 192.168.159.130 11211
示例
add命令:
add keyname flag timeout datasize ketname:键名 flag:标记,通常为0; timeout:超时时长(秒,如果不指定按照LRU计算) datasize:字符的个数;
如:
add mykey 0 10 12
Hello world!
get命令:get keyname
如:
get mykey
VALUE mykey 0 12
Hello world!
END
append命令:append keyname flag timeout datasize
如:
append mykey 0 100 5
hello
quit:退出命令;
在PHP服务器上安装php的memcache扩展
服务器IP:192.168.159.129
操作系统:CentOS 6.4 x86 (已安装开发工具);
PHP版本:php-5.4.26(编译安装)
软件下载地址:http://pecl.php.net/get/memcache-2.2.7.tgz;
首先同步系统时钟:ntpdate time.windows.com
安装步骤
1 tar xf memcache-2.2.7.tgz
2 cd memcache-2.2.7
3 /usr/local/php-5.4.26/bin/phpize
4 ./configure --with-php-config=/usr/local/php-5.4.26/bin/php-config --enable-memcache
5 make
6 make install
配置php载入模块
vim /etc/php.ini
extension=/usr/local/php-5.4.26/lib/php/extensions/no-debug-zts-20100525/memcache.so 在extension位置新增该行;
保存退出;
重启php-fpm服务;
客户端连接memcached使用的库
php
memcache
memcached(库的名称叫memcached,而不是代表memcached服务器)
perl
cache:memcached
c/c++
libmemcached
memcached的监控工具
memadmin:使用php开发的一个工具,类似于phpMyadmin;
下载地址:http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz;
安装方式:将tar.gz直接解压到服务器的网页文件存放目录中即可;
libmemcached:命令行的客户端管理工具;
下载地址:https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz;
安装过程
1 tar xf libmemcached-1.0.18.tar.gz
2 cd libmemcached-1.0.18
3 ./configure --prefix=/usr/local/libmemcached-1.0.18
4 make
5 make install
添加到系统库的搜素路径
1 vim /etc/ld.so.conf.d/libmemcached.conf
2 /usr/local/libmemcached-1.0.18/lib/ 新增此行;
3 保存退出
4 ldconfig
添加到头文件的搜索路径
1 ln -s /usr/local/libmemcached-1.0.18/include /usr/include/libmemcached
修改PATH的搜索路劲
1 vim /etc/profile.d/path.sh
2 export PATH=$PATH:/usr/local/libmemcached-1.0.18/bin 新增该行
3 chmod +x /etc/profile.d/path.sh
4 source /etc/profile
常用命令
memcat --servers=192.168.159.130:11211 mykey 查看键的值;
memstat --servers=192.168.159.130:11211 查看服务器的状态;
memping --servers=192.168.159.130:11211 检测服务器是否在线;
memslap --servers=192.168.159.130:11211 产生一个对memcached服务器的负载,用于测试服务器性能;
注:以上命令可使用"-h"获取帮助;
声明:本文为学习笔记,内容参考多方资料,如涉及版权问题,请告知本人,谢谢!
本文出自 “AD” 博客,转载请与作者联系!