一、编译安装libevent
下载libevent-1.4.9-stable.tar.gz安装包
tar zxvf libevent-1.4.9-stable.tar.gz
cd libevent-1.4.9-stable/
./configure --prefix=/usr
make && make install
cd ../
二、编译安装Memcached
下载memcached-1.4.0.tar.gz安装包
tar zxvf memcached-1.4.0.tar.gz
cd memcached-1.4.0/
./configure --with-libevent=/usr
make && make install
cd ../
三、编译安装magent
1、mkdir magent cd magent/
下载magent-0.6.tar.gz安装包
tar zxvf magent-0.6.tar.gz
2、在ketama.h文件开头添加
#ifndef SSIZE_MAX
#define SSIZE_MAX 32767
#endif
3、ln -s /usr/lib64/libm.so /usr/lib64/libm.a
4、vim Makefile
1)LIBS = /usr/lib64/libevent.a /usr/lib64/libm.a
修改为:
LIBS = /usr/lib/libevent.a/usr/lib64/libm.a
2)CFLAGS = -Wall -g -O2 -I/usr/local/include $(M64)
修改为:
CFLAGS = -lrt -Wall -g -O2-I/usr/local/include $(M64)
5、/sbin/ldconfig
6、sed -i "s#LIBS = -levent#LIBS = -levent -lm#g"Makefile
7、make
8、cp magent /usr/bin/magent
cd ../
四、启动memcached和magent实例
1、memcached启动:memcached -u root -d -l192.168.0.59 -p 11211
参数说明:
-d选项是启动一个守护进程
-m是分配给Memcache使用的内存数量,单位是MB,默认64MB
-u是运行Memcache的用户
-l是监听的服务器IP地址
-p是设置Memcache监听的端口,最好是1024以上的端口
-c选项是最大运行的并发连接数,默认是1024,按照你服务器的负载量来设定
-P是设置保存Memcache的pid文件
2、magent启动:magent -u root -n 51200 -l192.168.0.59 -p 12000 -s 192.168.0.90:11211 -s 192.168.0.91:11211 -b192.168.0.59:11211
参数说明:
· -h this message
· -u uid
· -g gid
· -p port, default is 11211. (0 to disable tcp support)
· -s ip:port, set memcached server ip and port
· -b ip:port, set backup memcached server ip and port
· -l ip, local bind ip address, default is 0.0.0.0
· -n number, set max connections, default is 4096
· -D do not go to background
· -k use ketama key allocation algorithm
· -f file, unix socket path to listen on. default is off
· -i number, max keep alive connections for one memcached server, default is 20
· -v verbose
五、magent测试流程
现有测试服务器:192.168.0.59/90/91
先在三台服务器上安装好libevent和memcached,启动memcached实例;
然后在59上安装好magent,启动magent实例
1、登录59上的magent,存储key1到key5:
sykdeMacBook-Pro:~syk$ telnet 192.168.0.59 12000
Trying192.168.0.59...
Connected to192.168.0.59.
Escapecharacter is '^]'.
stats
memcached agentv0.6
matrix 1 ->192.168.0.90:11211, pool size 0
matrix 2 ->192.168.0.91:11211, pool size 0
END
set key1 0 0 1
1
STORED
set key2 0 0 2
22
STORED
set key3 0 0 3
333
STORED
set key4 0 0 4
4444
STORED
set key5 0 0 5
55555
STORED
get key1
VALUE key1 0 1
1
END
get key2
VALUE key2 0 2
22
END
get key3
VALUE key3 0 3
333
END
get key4
VALUE key4 0 4
4444
END
get key5
VALUE key5 0 5
55555
END
quit
Connectionclosed by foreign host.
2、登录59上的memcached,取值key1到key5:
sykdeMacBook-Pro:~syk$ telnet 192.168.0.59 11211
Trying192.168.0.59...
Connected to192.168.0.59.
Escapecharacter is '^]'.
stats
STAT pid 1479 memcached服务器的进程ID
STAT uptime1079 服务器已经运行的秒数
STAT time1457675550 服务器当前的unix时间戳
STAT version1.4.0 memcached版本号
STATpointer_size 64 当前操作系统的指针大小
STATrusage_user 0.013997
STATrusage_system 0.057991
STATcurr_connections 7 当前打开的连接数
STATtotal_connections 12 服务器打开以后打开的总连接数
STATconnection_structures 8 服务器分配的连接构造数
STAT cmd_get 0 get命令总请求次数
STAT cmd_set 62 set命令总请求次数
STAT cmd_flush0 flush命令总请求次数
STAT get_hits 0 总命中次数
STAT get_misses0 总未命中次数
STATdelete_misses 0
STATdelete_hits 0
STATincr_misses 0
STAT incr_hits0
STATdecr_misses 0
STAT decr_hits0
STAT cas_misses0
STAT cas_hits 0
STAT cas_badval0
STAT bytes_read5407 总读取字节数(请求字节数)
STATbytes_written 4184 总发送字节数(结果字节数)
STATlimit_maxbytes 67108864 分配给memcached的内存大小(字节)
STATaccepting_conns 1
STATlisten_disabled_num 0
STAT threads 5 当前线程数
STATconn_yields 0
STAT bytes 8308 当前服务器存储items占用的字节数
STAT curr_items62 服务器当前存储的items数量
STATtotal_items 62 服务器总存储的items数量
STAT evictions0 为获取空闲内存而删除的items数(分配给memcached的空间用满后需要删除旧的 items来得到空间分配给新的items)
END
get key1
VALUE key1 0 1
1
END
get key2
VALUE key2 0 2
22
END
get key3
VALUE key3 0 3
333
END
get key4
VALUE key4 0 4
4444
END
get key5
VALUE key5 0 5
55555
END
quit
Connectionclosed by foreign host.
3、登录90上的memcached,取值key1到key5:
sykdeMacBook-Pro:~syk$ telnet 192.168.0.90 11211
Trying192.168.0.90...
Connected to192.168.0.90.
Escapecharacter is '^]'.
get key1
END
get key2
VALUE key2 0 2
22
END
get key3
END
get key4
VALUE key4 0 4
4444
END
get key5
END
quit
Connectionclosed by foreign host.
4、登录91上的memcached,取值key1到key5:
sykdeMacBook-Pro:~syk$ telnet 192.168.0.91 11211
Trying192.168.0.91...
Connected to192.168.0.91.
Escapecharacter is '^]'.
get key1
VALUE key1 0 1
1
END
get key2
END
get key3
VALUE key3 0 3
333
END
get key4
END
get key5
VALUE key5 0 5
55555
END
quit
Connectionclosed by foreign host.
还可以模拟一台memcached挂掉进行测试
通过以上测试可以得出结论:
1. 通过magent的连接池存放的值会分别存在magent代理的所有memcached上去。
2. 如果有一个memcached宕机通过magent代理方式还能取到值。
3. memcached修复重启后通过magent代理方式取到的值就会为Null,这是由于memcache重启后里边的值随着memcache服务的停止就消失了(因为在内存中),但是magent是通过key进行哈希计算分配到某台机器上的,memcache重启后会还从这台机器上取值,所以取到的值就为空。
解决办法:
1. 在每次memcache宕机修复后可以写一个程序把集群中的其他memcache的所有信息全给拷贝到当前宕机修复后的memcache中。
2. 自己写代理,当从一个memcached服务上取到的值为Null时再去其他memcached上取值。
缓存与DB的同步
比较保险的做法是:查询的时候从缓存中取,add、updae、delete的时候同时操作缓存与DB。
当然你也可以定时同步缓存与DB的数据,不同的业务应该有不同的选择。