Memcache

生也有涯,知也无涯。这篇文章主要讲述Memcache相关的知识,希望能为你提供帮助。
Memcache官网:??http://memcached.org/??

memcache本身没有像redis所具备的数据持久化功能
可通过做集群同步方式,让各memcache服务器的数据进行同步,从而实现数据的一致性。
memcache借助操作系统的libevent工具做高效的读写
libevent是个程序库,将Linux的epoll,BSD类操作系统的kqueue等事件处理功能封装成统一的接口,即使对
服务器的连接数增加,也能发挥高性能,memcached使用这个libevent库,因此能在linux,BSD,solaris等操作系
统上发挥其高性能
memcache 支持最大的内存存储对象为1M,超过1M的数据可以使用客户端压缩或拆分保存到各个key中,比较大的数据在进行读取的时候,需要消耗的时间比较长
memcache最适合:保存用户的session实现session共享
slab(page):memcached存储数据时,memcached 会去申请1MB的内存,把这个块内存称为slab
memcached 具有多种语言的客户端开发包,包括:Perl/php/java/C/python/Ruby/C#/

单机部署
yum install memcached -y
vim /etc/sysconfig/memcached
------------------------------------
PORT="11211"# 监听端口
USER="memcached"# 启动用户
MAXCONN="4096"# 最大连接数
CACHESIZE="1024"# 最大使用内存
OPTIONS=""# 其他选项

python操作memcached
#!/usr/bin/env python
#coding:utf-8
#Author:Zhang ShiJie
import memcache
m = memcache.Client([192.168.47.54:11211], debug=True)
for i in range(5):
m.set("key%d" % i,"v%d" % i)
ret = m.get(key%d % i)
print(ret)

编译安装
yum install libevent libevent-devel -y
tar xvf memcached-1.5.12.tar.gz
./configure --prefix=/usr/local/memcache
make & & make install

#启动 memcached
/usr/local/memcache/bin/memcached -u memcached -p 11211 -m 2048 -c 65536 &

【Memcache】?集群架构?
?1.基于magent的架构?
该部署依赖于magent实现高可用
应用端通过负载服务器连接到magent
magent代理用户请求到memcached处理
底层memcached为双主结构会自动同步数据
本部署方式:存在magent单点问题,因此需要两个magent做高可用


repcached实现原理
在master上可以通过-X 指定replication port
在slave上通过-x/-X 找到master,并connect上去,
如果同时指定了-x/-X,repcached一定会尝试连接,但如果连接失败,它就会用-X参数来自己listen(master)
如果master坏掉,slave侦测到连接断了,它会自动Listen而称为master
如果slave坏掉,master也会侦测到连接断,它就会重新listen等待新的slave加入

技术实现来看,是一个单master单slave
但master/slave都是可读可写的,而且可以相互同步
从功能上看,也可以认为它是双机master-master方案

?但magent已经有很长时间没有更新,因此可以不再使用magent,直接通过负载均衡连接memcached?
?2.简化后的部署架构?
直接通过负载均衡连接memcached
两台memcached做高可用,memcached会自动同步数据保持数据一致性


?部署repcached?
官网:??http://repcached.sourceforge.net/??
在54和55主机安装上repcached

#1.
#因为repcached依赖于libevent-devel包,所以首先安装libevent-devel包
centos:yum install libevent libevent-devel
ubuntu:apt-get install libevent-dev

#2.
wget https://sourceforge.net/projects/repcached/files/repcached/2.2.1-1.2.8/memcached-1.2.8-repcached-2.2.1.tar.gz
root@ubuntu:~# tar xvf memcached-1.2.8-repcached-2.2.1.tar.gz

#3.
root@ubuntu:~/memcached-1.2.8-repcached-2.2.1# ./configure --prefix=/usr/local/repcached --enable-replication
提示:
checking build system type... Invalid configuration `x86_64-unknown-linux-: machine `x86_64-unknown-linux not recognized
configure: error: /bin/bash ./config.sub x86_64-unknown-linux- failed
解决办法:
apt-get installlibtoollibltdl-dev

#4.root@ubuntu:~/memcached-1.2.8-repcached-2.2.1# make
遇到错误


解决办法
root@ubuntu:~/memcached-1.2.8-repcached-2.2.1# vim memcached.c
---------------------------------------------------------
/* FreeBSD 4.x doesnt have IOV_MAX exposed. */
#ifndef IOV_MAX
#if defined(__FreeBSD__) || defined(__APPLE__)
# define IOV_MAX 1024
#endif
#endif

修改为
/* FreeBSD 4.x doesnt have IOV_MAX exposed. */
#ifndef IOV_MAX
# define IOV_MAX 1024
#endif

#5.
root@ubuntu:~/memcached-1.2.8-repcached-2.2.1# make & & make install

验证
root@ubuntu:~/memcached-1.2.8-repcached-2.2.1# /usr/local/repcached/bin/memcached -h


启动memcache
通过repcached安装的memcached命令启动memcache服务并实现memcache主备结构,
-x为对方,即主memcache的IP
-X 为本地启动的用数据同步的端口

/usr/local/repcached/bin/memcached -d -m 2048 -p 11211 -u root -c 2048 -x 192.168.47.55 -X 16000
/usr/local/repcached/bin/memcached -d -m 2048 -p 11211 -u root -c 2048 -x 192.168.47.54 -X 16000


?测试?
root@ubuntu:~# telnet 192.168.47.54 11211
Trying 192.168.47.54...
Connected to 192.168.47.54.
Escape character is ^].
set name 0 0 4
haha
STORED
get name
VALUE name 0 4
haha
END
quit
Connection closed by foreign host.
---------------------------------------------------
root@ubuntu:~# telnet 192.168.47.55 11211
Trying 192.168.47.55...
Connected to 192.168.47.55.
Escape character is ^].
get name
VALUE name 0 4
haha
END
set tt 0 0 3
ttt
STORED
get tt
VALUE tt 0 3
ttt
END
quit
Connection closed by foreign host.
---------------------------------------------------
root@ubuntu:~# telnet 192.168.47.54 11211
Trying 192.168.47.54...
Connected to 192.168.47.54.
Escape character is ^].
get tt
VALUE tt 0 3
ttt
END




    推荐阅读