一、 Memcached安装
1.1. 准备工作
1.1.1.1. 准备安装文件
下载memcached与libevent的安装文件http://memcached.googlecode.com/files/memcached-1.4.16.tar.gz(memcached下载地址)
https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz(libevent下载地址)
1.2. 具体安装步骤
1.2.1. 具体安装步骤
1.由于memcached依赖于libevent,因此需要安装libevent。由于linux系统可能默认已经安装libevent,执行命令:
rpm -qa|grep libevent
查看系统是否带有该安装软件,如果有执行命令:
rpm -e libevent-1.4.13-4.el6.x86_64 --nodeps(由于系统自带的版本旧,忽略依赖删除)
2. 安装libevent命令:
tar zxvf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure --prefix=/usr/local/libevent
make
make install
至此libevent安装完毕;测试libevent是否安装成功:
[root@linux memcached]# ls -al /usr/lib | grep libevent
lrwxrwxrwx 1 root root 21 12-10 19:00 libevent-2.0.so.5 -> libevent-2.0.so.5.1.9
-rwxr-xr-x 1 root root 769655 12-10 19:00 libevent-2.0.so.5.1.9
-rw-r--r-- 1 root root 999618 12-10 19:00 libevent.a
lrwxrwxrwx 1 root root 26 12-10 19:00 libevent_core-2.0.so.5 -> libevent_core-2.0.so.5.1.9
-rwxr-xr-x 1 root root 460431 12-10 19:00 libevent_core-2.0.so.5.1.9
-rw-r--r-- 1 root root 615610 12-10 19:00 libevent_core.a
-rwxr-xr-x 1 root root 970 12-10 19:00 libevent_core.la
lrwxrwxrwx 1 root root 26 12-10 19:00 libevent_core.so -> libevent_core-2.0.so.5.1.9
lrwxrwxrwx 1 root root 27 12-10 19:00 libevent_extra-2.0.so.5 -> libevent_extra-2.0.so.5.1.9
-rwxr-xr-x 1 root root 323470 12-10 19:00 libevent_extra-2.0.so.5.1.9
-rw-r--r-- 1 root root 384080 12-10 19:00 libevent_extra.a
-rwxr-xr-x 1 root root 977 12-10 19:00 libevent_extra.la
lrwxrwxrwx 1 root root 27 12-10 19:00 libevent_extra.so -> libevent_extra-2.0.so.5.1.9
-rwxr-xr-x 1 root root 935 12-10 19:00 libevent.la
lrwxrwxrwx 1 root root 29 12-10 19:00 libevent_openssl-2.0.so.5 -> libevent_openssl-2.0.so.5.1.9
-rwxr-xr-x 1 root root 71205 12-10 19:00 libevent_openssl-2.0.so.5.1.9
-rw-r--r-- 1 root root 79544 12-10 19:00 libevent_openssl.a
-rwxr-xr-x 1 root root 1006 12-10 19:00 libevent_openssl.la
lrwxrwxrwx 1 root root 29 12-10 19:00 libevent_openssl.so -> libevent_openssl-2.0.so.5.1.9
lrwxrwxrwx 1 root root 30 12-10 19:00 libevent_pthreads-2.0.so.5 -> libevent_pthreads-2.0.so.5.1.9
-rwxr-xr-x 1 root root 14297 12-10 19:00 libevent_pthreads-2.0.so.5.1.9
-rw-r--r-- 1 root root 11826 12-10 19:00 libevent_pthreads.a
-rwxr-xr-x 1 root root 998 12-10 19:00 libevent_pthreads.la
lrwxrwxrwx 1 root root 30 12-10 19:00 libevent_pthreads.so -> libevent_pthreads-2.0.so.5.1.9
lrwxrwxrwx 1 root root 21 12-10 19:00 libevent.so -> libevent-2.0.so.5.1.9
3. 安装memcached命令:
tar zxvf memcached-1.4.2.tar.gz
cd memcached-memcached-1.4.2
./configure --prefix=/usr/local/memcached --with-libevent= /usr/local/libevent/
make
make install
至此memcached安装完毕;测试是否成功安装memcached:
[root@linux memcached]# ls -al /usr/local/bin/mem*
-rwxr-xr-x 1 root root 245919 12-10 19:03 /usr/local/bin/memcached
如果出现客户端连接不上memcached的情况,请将防火墙关闭或将防火墙中的memcached端口(11211端口)打开。
2.1.1. 启动memcached
1.打开一个终端,输入以下命令:
/usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211 -c 1024 –P /tmp/memcached.pid
[root@linux memcached]# ps aux | grep memcached
root 15424 0.0 0.0 55408 2020 ? Ssl 19:27 0:00 /usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211 -c 1024 -P /tmp/memcached.pid
root 15523 0.0 0.0 5196 692 pts/1 S+ 19:38 0:00 grep memcached
启动参数说明:
-d 选项是启动一个守护进程。
-u root 表示启动memcached的用户为root。
-m 是分配给Memcache使用的内存数量,单位是MB,默认64MB。
-M return error on memory exhausted (rather than removing items)。
-u 是运行Memcache的用户,如果当前为root 的话,需要使用此参数指定用户。
-l 是监听的服务器IP地址,默认为所有网卡。
-p 是设置Memcache的TCP监听的端口,最好是1024以上的端口。
-c 选项是最大运行的并发连接数,默认是1024。
-P 是设置保存Memcache的pid文件。
-f <factor> chunk size growth factor (default: 1.25)。
-I Override the size of each slab page. Adjusts max item size(1.4.2版本新增)。 也可以启动多个守护进程,但是端口不能重复
2.查看memcached启动命令
ps aux|grep memcached
2.1.2. 停止memcached
打开一个终端,输入以下命令:
ps -ef | grep memcached
在服务开启的状态下,会出现如下图所示的提示:
其中5929为memcached服务的pid
输入一下命令终止memcached服务
kill -9 5929
参考链接:
二、测试memcached
[root@linux ~]# telnet 10.10.10.8 11211
Trying 10.10.10.8...
Connected to linux (10.10.10.8).
Escape character is '^]'.
set abc 0 0 3
pub
STORED
get abc
VALUE abc 0 3
pub
END
set <key> <flag> <expires> <byte>
flag 用于指定是否压缩数据,0不压缩,1压缩
expires 指定数据保存的时间,一个方法是秒数(不超过30天),另一种可以是unix时间戳指定,0为有效期无线
byte 保存值的字节数
set ct 0 0 1
1
STORED
incr ct 1 --加1,变为2
2
get ct
VALUE ct 0 1
2
END
incr ct 2 --加2,变为4
4
get ct
VALUE ct 0 1
4
END
delete ct --删除键
DELETED
get ct
END
set test 0 0 4
test
STORED
get test
VALUE test 0 4
test
END
append test 0 0 3 --追加‘add’串
add
STORED
get test
VALUE test 0 7
testadd
END
flush_all --清楚所有的key—value
quit --退出
三、memcached集群
启动memcached多节点
/usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211 -c 1024 -P /tmp/memcached.pid
/usr/local/memcached/bin/memcached -d -m 256 -u root -p 11212 -c 1024
/usr/local/memcached/bin/memcached -d -m 256 -u root -p 11213 -c 1024
[root@linux libevent-2.0.21-stable]# ps aux | grep memcache
root 3837 0.0 0.0 54380 952 ? Ssl 18:16 0:00 /usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211 -c 1024 -P /tmp/memcached.pid
root 3844 0.0 0.0 54380 932 ? Ssl 18:16 0:00 /usr/local/memcached/bin/memcached -d -m 256 -u root -p 11212 -c 1024
root 3853 0.0 0.0 55124 932 ? Ssl 18:16 0:00 /usr/local/memcached/bin/memcached -d -m 256 -u root -p 11213 -c 1024
root 3862 0.0 0.0 5196 712 pts/0 S+ 18:16 0:00 grep memcache
可以看见上面的命令就可以启动多个memcached,缓存数据是根据key来哈希运算然后决定缓存到具体哪个节点的。读取的时候也是根据key来哈希之后到相应的节点去取值。
每个节点管理一点范围的哈希值。如果一个节点挂了,就把这个这点的管理范围顺时针分给另外一个节点。
如果添加一个节点,就把顺时针的节点管理范围一分为二,分一半给新增的节点管理。
这样做的原因就是为了只造成小范围的数据波动,在这里就有一个问题,节点1挂了,那么节点1里面缓存的数据就没有了,需要重新在节点2再缓存一次。
这就需要另外一个东西:高可用方案repcached,repcached可以接管其它节点的缓存,在节点之间相互复制缓存。
安装repcached
参考:http://www.cnblogs.com/zhoujinyi/archive/2013/04/23/3036862.html
# rpm -ivh libevent-devel-1.4.13-1.i386.rpm --nodeps
warning: libevent-devel-1.4.13-1.i386.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
Preparing... ########################################### [100%]
1:libevent-devel ########################################### [100%]
# tar -zxvf memcached-1.2.8-repcached-2.2.1.tar.gz
# cd memcached-1.2.8-repcached-2.2.1
# ./configure --enable-replication --program-transform-name=s/memcached/repcached/ --with-libevent=/usr/local/libevent/
# make&&make install
--不能以root身份运行
$ /usr/local/bin/repcached -d -m 64 -u nobody -p 11211 -c 1024 -v
$ /usr/local/bin/repcached -d -m 64 -u nobody -p 11212 -c 1024 -x 127.0.0.1 -v
注意:make的时候报错
memcached.c: 在函数‘add_iov’中: memcached.c:696:30: 错误: ‘IOV_MAX’未声明(在此函数内第一次使用) memcached.c:696:30: 附注: 每个未声明的标识符在其出现的函数内只报告一次 make[2]: *** [memcached-memcached.o] 错误 1
需要修改 memcached.c 文件:
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */ #ifndef IOV_MAX #if defined(__FreeBSD__) || defined(__APPLE__) # define IOV_MAX 1024 #endif #endif 改成: /* FreeBSD 4.x doesn't have IOV_MAX exposed. */ #ifndef IOV_MAX # define IOV_MAX 1024 #endif
测试同步缓存
[oracle@linux ~]$ telnet 10.10.10.8 11211
Trying 10.10.10.8...
Connected to linux (10.10.10.8).
Escape character is '^]'.
set test 0 0 4
test
STORED
get test
VALUE test 0 4
test
END
quit
Connection closed by foreign host.
[oracle@linux ~]$ telnet 10.10.10.8 11212
Trying 10.10.10.8...
Connected to linux (10.10.10.8).
Escape character is '^]'.
get test --正向复制
VALUE test 0 4
test
END
set ing 0 0 3
ing
STORED
get ing
VALUE ing 0 3
ing
END
quit
Connection closed by foreign host.
[oracle@linux ~]$ telnet 10.10.10.8 11211
Trying 10.10.10.8...
Connected to linux (10.10.10.8).
Escape character is '^]'.
get ing --反向复制
VALUE ing 0 3
ing
END
quit
Connection closed by foreign host.