|
一. 安装.
1. 准备工作, memcached用到了libevent, 需要下载.
memcached官方下载地址: http://www.danga.com/memcached/
libevent官方下载地址: http://monkey.org/~provos/libevent/
2. 解包/编译/安装
# tar -xzvf libevent-2.0.19-stable.tar.gz
# cd libevent-2.0.19-stable
# ./configure --preix=/usr/local
# make && make install
# cd ../
# tar -xzvf memcached-1.4.13.tar.gz
# cd memcached-1.4.13
# ./configure --prefix=/usr/local/memcached --with-libevent-dir=/usr/local
# make && make install
3. 运行memcached守护进程
/usr/local/memcached/bin/memcached -d -m 20 -p 11211 -u nobody
可以把上面的命令加到/etc/rc.local中, 这样系统启动时, memcached就会自动启动了.
memcached启动参数解释:
-d 以守护方式运行(daemon方式);
-m 设置memcached可以使用的内存大小,单位为M;
-l 监听的IP地址, 如果是本机的话, 通常可以不设置;
-p 监听的端口, 默认为11211, 所以也可以不设置该参数;
-P 存放pid文件的地址(如: /tmp/memcached.pid)
-u 指定用户, 如果当前为root的话, 需要使用此参数指定用户.
其它参数可以使用memcached -h 或者man memcached
4. 可选的管理软件.
magent: 开源的Memcached代理服务器软件. http://code.google.com/p/memagent/
daemontools: 监视memcached进程并自动启动. http://cr.yp.to/daemontools.html
二. 命令和管理
telnet 127.0.0.1 11211
// 保存
set good 32 0 10
helloworld
STORED
// 取值
get good
// 取值(带版本号)
gets good
// 替换
replace good 32 0 10
worldhello
STORED
// 尾部添加: append
// 头部添加: prepend
// 删除: delete
// 按版本号更改: cas (check and set)
// memcached版本号: version
// 删除所有: flush_all
// 退出telnet模式: quit
// 统计命令:
// stats items
// stats sizes
// stats slabs
// stats
#/usr/bin/perl /home/yxw/soft/memcached-1.4.13/scripts/memcached-tool localhost:11211
# Item_Size Max_age 1MB_pages Count Full?
1 88 B 1531 s 1 1 no
2 112 B 0 s 1 0 no
5 232 B 0 s 1 0 no
# slab class编号
Item_Size Chunk大小
Max_age LRU内最旧的记录的生存时间
1MB_pages 分配给Slab的页数
Count Slab内的记录数
Full? Slab内是否含有空闲chunk
(scripts路径: memcached源码目录下scripts)
三. PHP客户端安装
PHP客户端有两种, 一种是pecl memcached, 另一种是pecl memcache.
推荐使用pecl memcahed.
1. 准备软件.
wget https://launchpad.net/libmemcached/1.0/1.0.8/+download/libmemcached-1.0.8.tar.gz
wget http://pecl.php.net/get/memcached-2.0.1.tgz
注: memcahe客户端下载地址:
http://pecl.php.net/get/memcache
2. 安装
tar -xzvf libmemcached-1.0.8.tar.gz
cd libmemcached-1.0.8/
./configure
make && make install
cd ../
tar -xzvf memcached-2.0.1.tgz
cd memcached-2.0.1/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
3. 修改php配置.
vi /usr/local/php/lib/php.ini
extension = memcached.so
4. 重启apache, 测试一下:
<?php
<?php
$m = new Memcached();
$m->addServer('127.0.0.1', 11211);
$m->set('foo', 200);
var_dump($m->get('foo'));
?>
得到结果: int(200)
telnet看一下:
telnet 127.0.0.1 11211
get foo
-----返回------
VALUE foo 1 3
200
END
四. 存储分布算法
memcached服务器端是集中式的缓存系统, 分布式实现由客户端决定. (客户端决定数据存在哪台服务器上)
memcached分布算法一般有两种:
1. 根据hash(key)的结果, 模连接数的余数来决定存储到哪个节点, 即: hash(key)%session.size().
优点: 简单快速, 表现良好.
缺点: 增加或删除节点的时候, 原有的缓存数据大规模失效, 命中率大受影响, 会对后面的db服务器造成很大的压力.
2. consistent hashing, 一致性hash算法. 查找节点过程大致如下:
首先求出memcached服务器节点的hash值, 并将其配置到0~232的圆上,
然后用同样的方法求出存储数据的键的hash值, 并映射到圆上.
然后从数据映射到的位置开始顺时针查找, 将数据保存到找到的第一个服务器上.
如果超过2的32次方后,仍然找不到服务器, 就会保存到第一台memcahed服务器上.
memcahed没有任何配置时, 默认使用第一种方法, 使用:
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);
第二种算法:
memcache在php.ini中加
Memcache.hash_strategy =consistent
Memcache.hash_function =crc32
memcached在程序中加(未确认):
$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);
或
$mem->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT);
$mem->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE,true);
五. Memcache的安全
memcache以root权限运行, telnet可以登录, 所以要注意memcache的安全.
1. 内网访问.
两台服务器之间的访问是内网形态的, 一般是web服务器跟memcached服务器之间.
普遍的服务器都是有两块网卡, 一块指向互联网, 一块指向内网, 让web服务器通过内网的网卡来
访问memcache服务器, memcahe服务器启动时监听内网ip地址和端口, 内网间的访问能够有效阻止其它非法的访问.
2. 设置防火墙.
防火墙是简单有效的方式, 如果是两台服务器都是挂在外网, 并且需要通过IP来访问memcahe的话, 可以考虑使用防火墙或者代理程序来过滤非法访问.
Linux下可以使用iptables或者ipfw来指定一些规则防止一些非法的访问, 比如可以设置只允许我们的web服务器来访问我们memcache服务器,同时阻止其他的访问.
# iptables -F
# iptables -P INPUT Drop
# iptables -A INPUT -p tcp -s 192.168.0.2 --dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.2 --dport 11211 -j ACCEPT
上面的iptables规则就是只允许192.168.0.2这台web服务器对memcache服务器的访问, 能够有效的阻止一些非法访问,
相应的也可以增加一些其他规则来加强安全性, 这个可以根据自己的需要来做.
参考资料:
http://hi.baidu.com/itgp/blog/item/afa47932a73e10ed1b4cff32.html
http://blog.sina.com.cn/s/blog_628961a10100h63d.html
http://hi.baidu.com/xujingood/blog/item/74debe0113f3ae8ae950cd92.html
http://hi.baidu.com/claudeyuan/blog/item/1c186f02939580e108fa9395.html
http://www.iteye.com/topic/346682
http://hi.baidu.com/dong_love_yan/blog/item/afbe1e12d22e7512203f2e21.html
http://hi.baidu.com/thinkinginlamp/blog/item/717cd42a11f6e491023bf67a.html |
|