magent+Memcached集群介绍


由于Memcached服务器与服务器之间没有任何通讯,并且不进行任何数据复制备份,所以当任何服务器节点出现故障时,会出现单点故障,如果需要实现HA,则需要通过另外的方式来解决。

通过Magent缓存代理,防止单点现象,缓存代理也可以做备份,通过客户端连接到缓存代理服务器,缓存代理服务器连接缓存连接服务器,缓存代理服务器可以连接多台Memcached机器可以将每台Memcached机器进行数据同步。如果其中一台缓存服务器down机,系统依然可以继续工作,如果其中一台Memcached机器down掉,数据不会丢失并且可以保证数据的完整性。

memcache键值存储:这个存储过程需要程序员来实现。程序员生成key-value。一般memcache用来缓存静态内容。主节点服务停止,程序上要自动调整到备份节点上。主节点服务恢复后缓存需要重新生成。


magent是memcache的补充,magent下memcache分主备,主节点分散存储所有的键值数据 ,备节点存储一个完整的所有键值数据。magent解决了memcache的不能节点分布式问题。

安装libevent

[root@node2 ~]# ls

libevent-1.4.9-stable  libevent-1.4.9-stable.tar.gz  magent-0.6.tar.gz  mariadb-5.5.46  mariadb-5.5.46.tar.gz  memcached-1.4.13.tar.gz

[root@node2 ~]# 

 

libevent-1.4.9-stable

./configure &&make -j 2 &&make install

 

 

安装memcache

./configure --prefix=/usr/local/memcached-1.4.13  &&make -j 2 &&make install

 

 

安装magent

 tar -xvf magent-0.6.tar.gz

 

报错

[root@node2 ~]# make 

gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c

magent.c: In function ?.ritev_list?.

magent.c:729: error: ?.SIZE_MAX?.undeclared (first use in this function)

magent.c:729: error: (Each undeclared identifier is reported only once

magent.c:729: error: for each function it appears in.)

make: *** [magent.o] Error 1

[root@node2 ~]# 

 

解决:

[root@centos6 memcached]# vi ketama.h 

#在开头加入

#ifndef SSIZE_MAX

#define SSIZE_MAX      32767

#endif

make

 

 

报错

[root@node2 ~]# 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: /usr/lib64/libevent.a: No such file or directory

gcc: /usr/lib64/libm.a: No such file or directory

make: *** [magent] Error 1

[root@node2 ~]# 

 

解决

[root@node2 ~]# find / -name libevent.a

/usr/local/lib/libevent.a

/root/libevent-1.4.9-stable/.libs/libevent.a

yum install glibc glibc-devel

如果是64bit的系统则不会在/usr/lib64/libm.a 生成,如果是32bit即会有。

 

[root@centos6 memcached]# cp /usr/lib64/libm.so /usr/lib64/libm.a

Vim Makefile 

ifeq ($(ARCH), $(X64))

        M64 = -m64

        LIBS = /usr/local/lib/libevent.a /usr/lib64/libm.a

继续make

 

 

报错

[root@node2 ~]# make 

gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/local/lib/libevent.a /usr/lib64/libm.a 

/usr/local/lib/libevent.a(event.o): In function `gettime':

/root/libevent-1.4.9-stable/event.c:150: undefined reference to `clock_gettime'

/usr/local/lib/libevent.a(event.o): In function `detect_monotonic':

/root/libevent-1.4.9-stable/event.c:133: undefined reference to `clock_gettime'

collect2: ld returned 1 exit status

make: *** [magent] Error 1

[root@node2 ~]# 

 

解决

解决办法:

[root@centos6 memcached]# vi Makefile 

CFLAGS = -Wall -g -O2 -I/usr/local/include $(M64)

改为:    

CFLAGS = -lrt -Wall -g -O2 -I/usr/local/include $(M64)

 

[root@centos6 memcached]# make

gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o -lrt /usr/lib64/libevent.a /usr/lib64/libm.a 

[root@centos6 memcached]# ls                                                                                             成功

Makefile  ketama.c  ketama.h  ketama.o  magent  magent-0.6.tar.gz  magent.c  magent.o




软件下载

http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz 

http://memagent.googlecode.com/files/magent-0.6.tar.gz

http://monkey.org/~provos/libevent-1.4.9-stable.tar.gz

 

 

安装libevent-1.4.9-stable.tar.gz

tar zxvf libevent-2.0.13-stable.tar.gz 

cd libevent-2.0.13-stable

./configure --prefix=/usr/local/libevent-1.4.9-stable

make

make install


安装memcacd

tar zxvf memcached-1.4.13.tar.gz 

cd memcached-1.4.13

./configure --prefix==/usr/local/memcached-1.4.13 --with-libevent=/usr/local/libevent-1.4.9-stable

make

make install

 

 

安装magent

mkdir /usr/local/magent-0.6 && mv magent-0.6.tar.gz /usr/local/magent-0.6

tar zxvf magent-0.6.tar.gz 

make 



memcache命令

memcached启动参数描述:

 

-d :启动一个守护进程,

 

-m:分配给Memcache使用的内存数量,单位是MB,默认是64MB,

 

-u :运行Memcache的用户

 

-l  :监听的服务器IP地址

 

-p :设置Memcache监听的端口,默认是11211    注:-p(p为小写)

 

-c :设置最大并发连接数,默认是1024

 

-P :设置保存Memcache的pid文件   注:-P(P为大写)

 

如果要结束Memcache进程,执行:kill cat pid文件路径

 

/usr/local/bin/memcached -d -m 256 -u memcached -l 172.16.11.20 -p 11211 -c 1024 -P /var/run/memcached/memcached.pid
/usr/local/bin/memcached -d -m 256 -u memcached -l 192.168.11.30 -p 11211 -c 1024 -P /var/run/memcached/memcached.pid
/usr/local/bin/memcached -d -m 256 -u memcached -l 192.168.11.40 -p 11211 -c 1024 -P /var/run/memcached/memcached.pid

/usr/local/magent/magent -u root -n 4096 -l 172.16.11.10 -p 11200 -s 172.16.11.20:11211 -s 172.16.11.30:11211 -b 172.16.11.40:11211



 



报错1:

gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c

magent.c: In function 'writev_list':

magent.c:729: error: 'SSIZE_MAX' undeclared (first use in this function)

magent.c:729: error: (Each undeclared identifier is reported only once

magent.c:729: error: for each function it appears in.)

make: *** [magent.o] Error 1

 

解决办法:

[root@centos6 memcached]# vi ketama.h 

#在开头加入

#ifndef SSIZE_MAX

#define SSIZE_MAX      32767

#endif

 

 

 

继续make

 

报错2:

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: /usr/lib64/libevent.a: No such file or directory

gcc: /usr/lib64/libm.a: No such file or directory

 

 

解决办法:

[root@centos6 memcached]# ln -s /usr/lib/libevent*  /usr/lib64/

[root@centos6 memcached]# make

 

报错3:

gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib64/libevent.a /usr/lib64/libm.a 

gcc: /usr/lib64/libm.a: No such file or directory

make: *** [magent] Error 1

 

 

解决办法:

yum install glibc glibc-devel

如果是64bit的系统则不会在/usr/lib64/libm.a 生成,如果是32bit即会有。

 

[root@centos6 memcached]# cp /usr/lib64/libm.so /usr/lib64/libm.a

继续make

 

 

报错4:

gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib64/libevent.a /usr/lib64/libm.a 

/usr/lib64/libevent.a(event.o): In function `detect_monotonic':

event.c:(.text+0xc79): undefined reference to `clock_gettime'

/usr/lib64/libevent.a(event.o): In function `gettime':

event.c:(.text+0xd60): undefined reference to `clock_gettime'

collect2: ld returned 1 exit status

make: *** [magent] Error 1

 

 

解决办法:

[root@centos6 memcached]# vi Makefile 

CFLAGS = -Wall -g -O2 -I/usr/local/include $(M64)

改为:    

CFLAGS = -lrt -Wall -g -O2 -I/usr/local/include $(M64)

 

 

 

[root@centos6 memcached]# make

gcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o -lrt /usr/lib64/libevent.a /usr/lib64/libm.a 

[root@centos6 memcached]# ls                                                                                             成功

Makefile  ketama.c  ketama.h  ketama.o  magent  magent-0.6.tar.gz  magent.c  magent.o