第2周 简单而有效的键值型内存数据库memcached
memcached 是一个键值型的内存数据库。http://www.memcached.org/
http://www.memcached.org/files/memcached-1.4.16.tar.gz
memcached的特点:
全内存运转
哈希方式存储简单文本协议进行数据通信
只操作字符型数据
其它类型数据由应用解释,序列化以及反序列化
集群也由应用进行控制,采用一致性哈希算法
一、 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是否安装成功:
#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:
# ls -al /usr/local/bin/mem*
-rwxr-xr-x 1 root root 245919 12-10 19:03 /usr/local/bin/memcached
2.2.2. 可能存在的错误以及解决方案
如果出现客户端连接不上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
# ps aux | grep memcached
root 154240.00.0554082020 ? Ssl19:27 0:00 /usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211 -c 1024 -P /tmp/memcached.pid
root 155230.00.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
参考链接:
http://blog.iyunv.com/clarkcc1988/article/details/8509822
http://www.cnblogs.com/zgx/archive/2011/08/10/2134097.html
二、测试memcached
# 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>
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
ENDset 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集群
启动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
# ps aux | grep memcache
root 38370.00.054380 952 ? Ssl18:16 0:00 /usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211 -c 1024 -P /tmp/memcached.pid
root 38440.00.054380 932 ? Ssl18:16 0:00 /usr/local/memcached/bin/memcached -d -m 256 -u root -p 11212 -c 1024
root 38530.00.055124 932 ? Ssl18:16 0:00 /usr/local/memcached/bin/memcached -d -m 256 -u root -p 11213 -c 1024
root 38620.00.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... ###########################################
1:libevent-devel ###########################################
# 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]: *** 错误 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
再make&&make install,编译之后退出root用户。
测试同步缓存
$ 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.
$ 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.
$ 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.
版权声明:本文为博主原创文章,未经博主允许不得转载。
页:
[1]