memcache

实现memcache集群

阅读(623)

一:memcache本身没有redis锁具备的数据持久化功能,比如RDB和AOF都没有,但是可以通过做集群的方式,让各memcache的数据进行同步,实现数据的一致性,即保证各memcache的数据是一样的,即使有任何一台或多台memcache发生故障,只要集群种有一台memcache可用就不会出现数据丢失,当其他memcache重新加入到集群的时候可以自动从有数据的memcache当中自动获取数据并提供服务,以下为详细步骤:

memcached的API使用三十二位元的循环冗余校验(CRC-32)计算键值后,将资料分散在不同的机器上。当表格满了以后,接下来新增的资料会以LRU机制替换掉。由于memcached通常只是当作快取系统使用,所以使用memcached的应用程式在写回较慢的系统时(像是后端的数据库)需要额外的程式码更新memcached内的资料。
memcached具有多种语言的客户端开发包,包括:Perl/PHP/JAVA/C/Python/Ruby/C#/MySQL/

1.1:环境准备:

1.1.1:逻辑架构图:

以下架构中客户端访问Haproxy的VIP,VIP基于keepalived实现,Haproxy代理两个Magent来实现服务的高可用,即任何一个Magent故障不会影响业务的访问,而每个Magent又代理两个Memcached来实现主备,当Magent代理的主Memcached故障之后Magent会自动将用户请求转发至备份的Memcached,因此也不会影响客户端的连接使用,最后端的两个Memcached通过repcached实现双主互从双向数据复制同步的结构,从而保证任何一个memcached故障之后不会丢失数据,当故障的memcached恢复之后自动加入到Magent代理当中,其数据自动从另外一台Memcached恢复数据,因此本结构从一定程度实现了集群的部署,解决了单点故障实现了高可用性和负载均衡的功能。

1.1.2:软件准备:

 

操作系统:Centos 7.2-1511 Memcache1.4.24 #官方下载地址:http://memcached.org/  Libevent1.4.15 #官方下载地址:http://libevent.org/ magent0.6 repcached2.2

 

1.2:安装libevent:

# yum install gcc gcc-c++ automake
# tar xvf libevent-2.0.22-stable.tar.gz 
# cd libevent-2.0.22-stable # ./configure --prefix=/usr/local/libevent # make && make install

 

1.3:安装memcache:

1.3.1:解压并部署:

# tar xvf memcached-1.4.34.tar.gz 
# cd memcached-1.4.34
#  ./configure  --help # ./configure --prefix=/usr/local/memcache --with-libevent=/usr/local/libevent # make && make install

1.3.2:memcached命令帮助:

-p 监听的端口   
-l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭正在运行的memcached服务 -d install 安装memcached服务 -d uninstall 卸载memcached服务 -u 以的身份运行 (仅在以root运行的时候有效) -m 最大内存使用,单位MB。默认64MB -M 内存耗尽时返回错误,而不是删除项 -c 最大同时连接数,默认是1024 -f 块大小增长因子,默认是1.25 -n 最小分配空间,key+value+flags默认是48 -h 显示帮助

1.4:安装magent,是memcache的代理软件:

magent实现N主N备的结构,即当主memcached故障,有备份memcached代替提供服务:

1.4.1:下载安装包:

下载地址:https://code.google.com/archive/p/memagent/downloads
# tar xvf magent-0.6.tar.gz # mkdir magent # mv magent-0.6.tar.gz magent # cd magent # tar xvf magent-0.6.tar.gz # yum install libevent* # /sbin/ldconfig

1.4.2:第一次编译如下:

[root@mem1 magent]# make
gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c magent.c: In function writev_list’: magent.c:729:17: error: SSIZE_MAX undeclared (first use in this function) if (toSend > SSIZE_MAX || ^ magent.c:729:17: note: each undeclared identifier is reported only once for each function it appears in make: *** [magent.o] Error 1

解决办法:

# vim ketama.h #在开头添加以下三行:

#ifndef SSIZE_MAX
# define SSIZE_MAX      32767
#endif

1.4.3:第二次make报错如下:

[root@mem1 magent]# make
gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c
gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o ketama.o ketama.c
gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib64/libevent.a /usr/lib64/libm.a 
gcc: error: /usr/lib64/libevent.a: No such file or directory
gcc: error: /usr/lib64/libm.a: No such file or directory
make: *** [magent] Error 1
#解决办法:
# ln -s /usr/lib64/libm.so /usr/lib64/libm.a

1.4.4:第三次make报错如下:

[root@mem1 magent]# make
gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib64/libevent.a /usr/lib64/libm.a gcc: error: /usr/lib64/libevent.a: No such file or directory make: *** [magent] Error 1 #解决办法: # ln -sv /usr/local/libevent/lib/libevent.a /usr/lib64/libevent.a

1.4.5:第四次make成功:

[root@mem1 magent]# make
gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib64/libevent.a /usr/lib64/libm.a 

1.4.6:复制magent命令到系统命令目录:

# cp magent /usr/bin/

1.4.7:验证magent命令:

[root@mem1 magent]# magent  -h
memcached agent v0.6 Build-Date: Jan 18 2017 16:40:43 Usage: -h this message -u uid -g gid -p port, default is 11211. (0 to disable tcp support) -s ip:port, set memcached server ip and port -b ip:port, set backup memcached server ip and port -l ip, local bind ip address, default is 0.0.0.0 -n number, set max connections, default is 4096 -D don't go to background -k use ketama key allocation algorithm -f file, unix socket path to listen on. default is off -i number, set max keep alive connections for one memcached server, default is 20 -v verbose

1.5:部署repcahed:

 repcached是memcached的补丁,实现了不同memcached实例内存数据同步的功能,类似于实现了主从的功能,但是每个memcached都是可以写入的,即可以双向复制主从的都是可读可写的,所以也不是简单的主从结构,更像是多主互从的结构,通过repcachd可以解决memcached单机内存数据不能持久化的问题,因为可以实现memcached主从结构,项目地址:http://repcached.sourceforge.net/ 

1.5.1:下载repcached:

# wget http://downloads.sourceforge.net/repcached/memcached-1.2.8-repcached-2.2.tar.gz

1.5.2:解压并部署:

# tar xvf memcached-1.2.8-repcached-2.2.tar.gz 
# cd memcached-1.2.8-repcached-2.2
#./configure  –prefix=/usr/local/repcached –enable-replication 

报错如下:

1.5.3:更改配置文件:

# vim memcached.c 
  55 /* FreeBSD 4.x doesn't have IOV_MAX exposed. */ 56 #ifndef IOV_MAX 57 #if defined(__FreeBSD__) || defined(__APPLE__) 58 # define IOV_MAX 1024 59 #endif 60 #endif 改为如下内容: 55 /* FreeBSD 4.x doesn't have IOV_MAX exposed. */ 56 #ifndef IOV_MAX  57 # define IOV_MAX 1024  58 #endif 

1.5.4:再次编译安装:

# ./configure  --prefix=/usr/local/repcached --enable-replication
#make && make install

1.5.5:验证安装完成且命令可用:

[root@mem1 memcached-1.2.8-repcached-2.2]# /usr/local/repcached/bin/memcached -h memcached 1.2.8 repcached 2.2 -p <num> TCP port number to listen on (default: 11211) -U <num> UDP port number to listen on (default: 11211, 0 is off) -s <file> unix socket path to listen on (disables network support) -a <mask> access mask for unix socket, in octal (default 0700) -l <ip_addr> interface to listen on, default is INDRR_ANY -d run as a daemon -r maximize core file limit -u <username> assume identity of <username> (only when run as root) -m <num> max memory to use for items in megabytes, default is 64 MB -M return error on memory exhausted (rather than removing items) -c <num> max simultaneous connections, default is 1024 -k lock down all paged memory. Note that there is a limit on how much memory you may lock. Trying to allocate more than that would fail, so be sure you set the limit correctly for the user you started the daemon with (not for -u <username> user; under sh this is done with 'ulimit -S -l NUM_KB'). -v verbose (print errors/warnings while in event loop) -vv very verbose (also print client commands/reponses) -h print this help and exit -i print memcached and libevent license -P <file> save PID in <file>, only used with -d option -f <factor> chunk size growth factor, default 1.25 -n <bytes> minimum space allocated for key+value+flags, default 48 -R Maximum number of requests per event limits the number of requests process for a given con nection to prevent starvation. default 20 -b Set the backlog queue limit (default 1024

转载于:https://www.cnblogs.com/you0329/p/8590417.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值