1.编译libevent
./configure --prefix=xxx
make && make install
2.编译memcached
./configure --prefix=xxx
make && make install
3.启动memcached
服务器端的命令为:
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,若是有多个地址的话,我这里指定了服务器的IP地址192.168.0.200,
-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,
-c选项是最大运行的并发链接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,
想开机自动启动的话,只需在/etc/rc.d/rc.local中加入一行,上面命令
有人用如下命令:
/usr/local/memcached/bin/memcached -d -m 20 -p 11211 -u apache
上面有些东西能够参考一下:即,ip不指定时,默认是本机,用户,最好选择是:apache 或 deamon
这样,也就是属于哪一个用户的服务,由哪一个用户启动。
4.memcached退出
kill `cat /tmp/memcached.pid`
5.安装libmemcached
./configure --prefix=/xxxx/libmemcached --with-memcached=/xxxx/memcached/bin/memcached
make && make install
--with-memcached 选项要指定到memcached可执行文件
gcc是4.1,所以只能用老版本libmemcached(选了libmemcached-0.50)
6.使用
pythom-memcached下载连接不可用 ( http://www.tummy.com/software/python-memcached/)
改用
pylibmc ( https://pypi.python.org/pypi/pylibmc#downloads)
7.安装magent
ketama.* 是一致性hash的实现
0.5版本:
mkdir magent
cd magent/
wget http://memagent.googlecode.com/files/magent-0.5.tar.gz
tar zxvf magent-0.5.tar.gz
#这两步操做很奇怪,但颇有效
/sbin/ldconfig
sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
make
cp magent /usr/bin/magent
cd ../
0.6版本:
不须要额外操做,直接执行make便可
-------------
光用不理解说不过去,加点料( http://code.google.com/p/memagent/wiki/HowMagentWorks ):
-------------
部署结构:
client---magent---{普通memcached集群, 备份memcached集群}
工做方式:
1.get操做,先到普通mem上读取;若是失败,再到备份mem上读取(即服务器失效会致使两次读,不过只是特殊状况下的处理,能够接受)
2.若是一次get多个key的值,会逐个执行1.中的步骤
3.delete,incr,decr,add,set,replace,prepend,append,cas,同时操做{普通mem,备份mem}
* 写操做:先操做备份men,再操做普通mem
* 不关联二者之间操做的成功/失败
4.client从magent上断开,不影响magent保持与集群server的连接
5.建议:client和magent部署在一块儿,client经过127.0.0.1访问magent时,效率会更高
-------------
8.配置转发
在memcached的bin/目录
./memcached -m 1 -u root -d -l 127.0.0.1 -p 11211
./memcached -m 1 -u root -d -l 127.0.0.1 -p 11212
./memcached -m 1 -u root -d -l 127.0.0.1 -p 11213
magent -u root -n 51200 -l 127.0.0.1 -p 12000 -s 127.0.0.1:11211 -s 127.0.0.1:11212 -b 127.0.0.1:11213
- 分别在112十一、112十二、11213端口启动3个Memcached进程,在12000端口开启magent代理程序;
- 112十一、11212端口为主Memcached,11213端口为备份Memcached;
- 链接上12000的magent,set key1和set key2,根据哈希算法,key1被写入11212和11213端口的Memcached,key2被写入11211和11213端口的Memcached;
- 当112十一、11212端口的Memcached死掉,链接到12000端口的magent取数据,数据会从11213端口的Memcached取出;
- 当112十一、11212端口的Memcached重启复活,链接到12000端口,magent会从11211或11212端口的Memcached取数据,因为这两台Memcached重启后无数据,所以magent取得的将是空值,尽管11213端口的Memcached还有数据(此问题尚待改进)。
9.测试流程
参照 http://blog.s135.com/post/393/ 其中使用的是magent-0.5
我尝试了0.5和最新的0.6,但里面提到的重启后的” 因为这两台Memcached重启后无数据,所以magent取得的将是空值,尽管11213端口的Memcached还有数据(此问题尚待改进)“,仍然存在
10.题外话,缓存集群的造成历程
缓存集群不是天生就有的,只有应用场景的发展才会引起对集群的须要。
STEP1:无缓存--->STEP2:单机memcached--->STEP3:memcached集群+请求端分片--->STEP4:memcached集群+单台代理--->STEP5:memcached集群+代理集群--->再之后,就没有之后了
1~3阶段都是很轻松的(不少业务能到3阶段已是规模不小,值得庆幸了);
4阶段后期就会遇到各类压力,要考虑memcached单台失效对后端(极可能是DB或其余持久化存储)突发压力的影响;magent的备份服务器是方法之一,但具体的备份方案须要琢磨,简单的2倍存储代价不小;
5阶段要考虑集群+集群的失效,须要引入DNS/名字服务等更低层的网络措施; python