1.1. 准备工作
1.1.1.1. 准备安装文件
下载memcached与libevent的安装文件至此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
至此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
参考链接:
[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 ENDset <key> <flag> <expires> <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 ENDflush_all --清楚所有的key—value
quit --退出
启动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.