第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是否安装成功:

[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


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
[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

参考链接:

http://blog.csdn.net/clarkcc1988/article/details/8509822
http://www.cnblogs.com/zgx/archive/2011/08/10/2134097.html


二、测试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来哈希之后到相应的节点去取值。

第2周 简单而有效的键值型内存数据库memcached_第1张图片

每个节点管理一点范围的哈希值。如果一个节点挂了,就把这个这点的管理范围顺时针分给另外一个节点。

如果添加一个节点,就把顺时针的节点管理范围一分为二,分一半给新增的节点管理。

这样做的原因就是为了只造成小范围的数据波动,在这里就有一个问题,节点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
复制代码
再make&&make install,编译之后退出root用户。


测试同步缓存

[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.


你可能感兴趣的:(第2周 简单而有效的键值型内存数据库memcached)