memcached虽然能够通过分布式缓存,实现其中memcached宕掉不会丢失全部缓存数据,但部分数据还是难逃一劫。
我们可以利用magent代理memcached实现主从备份来保证缓存数据完好无损,而且magent还可以作为从继续使用,但大体工作原理如下:
1.magent每次写数据都会写到主memcached和从memcached上,并且向主从memcached写的算法一样;
2.当主memcached宕掉,magent会向从memcached中读取数据;
3.当主memcached恢复后,magent将重新向主memcached中读数据;此时由于主memcached刚恢复,其中并无数据,因此会导致部分数据无法读取,这也是magent的一大缺点。
针对magent的缺点有几种想法:
1.在生产环境中主memcached宕掉的可能性非常小,大部分时间都是工作的;而从memcached只是在主memcached宕掉后才使用,因此从memcached分配的空间不可能和主memcached一样,这样无疑是在浪费宝贵的内存空间。
2.既然从memcached分配空间较小,而随着存入的数据会越来越多,会导致缓存的数据不断被过期驱逐出内存,因此在主memcached宕掉后,只能暂时起到缓解数据库压力的作用。
3.主memcached宕掉后,不宜直接将其启动,还是在数据库压力比较小的时候再启动吧,就当预热缓存。
总结:我引入magent除了主从方面,还考虑到magent---magent实现memcached入口的负载均衡,也就是说读写请求按照一定的算法分配到两个magent入口上,既能达到高可用,还能起到负载均衡。
一。安装部分
1.安装memcached-1.2.2
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
cd libevent-2.0.22-stable
./configure --prefix=/usr/local/libevent
make
make install
cd memcached-1.2.2
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
make
make install
###安装错误###
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
###启动错误###
[root@test memcached-1.2.2]# /usr/local/memcached/bin/memcached
/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
需要修改:
ln -s /usr/local/libevent/lib/libevent-2.0.so.5 /lib64/libevent-2.0.so.5
2.安装magent-0.5
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
cd magent-0.5
/sbin/ldconfig
sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
make
报错如下:
gcc -Wall -O2 -g -c -o magent.o magent.c
magent.c:65:19: 错误:event.h:没有那个文件或目录
magent.c:124: 错误:字段‘ev’的类型不完全
magent.c:154: 错误:字段‘ev’的类型不完全
magent.c: 在函数‘server_free’中:
magent.c:468: 警告:隐式声明函数‘event_del’
magent.c: 在函数‘put_server_into_pool’中:
magent.c:522: 错误:‘sizeof’不能用于不完全的类型‘struct event’
magent.c: 在函数‘out_string’中:
magent.c:696: 错误:‘EV_WRITE’未声明(在此函数内第一次使用)
magent.c:696: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
magent.c:696: 错误:所在的函数内也只报告一次。)
magent.c:699: 警告:隐式声明函数‘event_set’
magent.c:699: 错误:‘EV_PERSIST’未声明(在此函数内第一次使用)
magent.c:700: 警告:隐式声明函数‘event_add’
magent.c: 在函数‘do_transcation’中:
magent.c:816: 错误:‘sizeof’不能用于不完全的类型‘struct event’
magent.c:818: 错误:‘EV_PERSIST’未声明(在此函数内第一次使用)
magent.c:818: 错误:‘EV_WRITE’未声明(在此函数内第一次使用)
magent.c: 在函数‘start_backup_transcation’中:
magent.c:902: 错误:‘sizeof’不能用于不完全的类型‘struct event’
magent.c:904: 错误:‘EV_PERSIST’未声明(在此函数内第一次使用)
magent.c:904: 错误:‘EV_WRITE’未声明(在此函数内第一次使用)
magent.c: 在函数‘try_backup_server’中:
magent.c:994: 错误:‘sizeof’不能用于不完全的类型‘struct event’
magent.c:996: 错误:‘EV_PERSIST’未声明(在此函数内第一次使用)
magent.c:996: 错误:‘EV_WRITE’未声明(在此函数内第一次使用)
magent.c: 在函数‘drive_memcached_server’中:
magent.c:1014: 错误:‘EV_WRITE’未声明(在此函数内第一次使用)
magent.c:1060: 错误:‘EV_READ’未声明(在此函数内第一次使用)
magent.c:1062: 错误:‘EV_PERSIST’未声明(在此函数内第一次使用)
magent.c: 在函数‘process_get_response’中:
magent.c: 在函数‘process_get_response’中:
magent.c:1236: 错误:‘EV_WRITE’未声明(在此函数内第一次使用)
magent.c:1238: 错误:‘EV_PERSIST’未声明(在此函数内第一次使用)
magent.c: 在函数‘process_update_response’中:
magent.c:1283: 错误:‘EV_WRITE’未声明(在此函数内第一次使用)
magent.c:1285: 错误:‘EV_PERSIST’未声明(在此函数内第一次使用)
magent.c: 在函数‘drive_backup_server’中:
magent.c:1305: 错误:‘EV_WRITE’未声明(在此函数内第一次使用)
magent.c:1343: 错误:‘EV_PERSIST’未声明(在此函数内第一次使用)
magent.c:1343: 错误:‘EV_READ’未声明(在此函数内第一次使用)
magent.c: 在函数‘drive_client’中:
magent.c:1618: 错误:‘EV_READ’未声明(在此函数内第一次使用)
magent.c:1669: 错误:‘EV_WRITE’未声明(在此函数内第一次使用)
magent.c:1682: 错误:‘EV_PERSIST’未声明(在此函数内第一次使用)
magent.c: 在函数‘server_accept’中:
magent.c:1734: 错误:‘sizeof’不能用于不完全的类型‘struct event’
magent.c:1735: 错误:‘EV_READ’未声明(在此函数内第一次使用)
magent.c:1735: 错误:‘EV_PERSIST’未声明(在此函数内第一次使用)
magent.c: 在函数‘main’中:
magent.c:2106: 警告:隐式声明函数‘event_init’
magent.c:2111: 错误:‘EV_READ’未声明(在此函数内第一次使用)
magent.c:2111: 错误:‘EV_PERSIST’未声明(在此函数内第一次使用)
magent.c:2121: 警告:隐式声明函数‘event_loop’
make: *** [magent.o] 错误 1
修改Makefile
LIBS = -levent -lm -L/usr/local/libevent/lib
INCLUDE=-I/usr/local/libevent/include
再重新make,出现以下
gcc -Wall -O2 -g -I/usr/local/libevent/include -c -o magent.o magent.c
magent.c: 在函数‘writev_list’中:
magent.c:623: 错误:‘SSIZE_MAX’未声明(在此函数内第一次使用)
magent.c:623: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
magent.c:623: 错误:所在的函数内也只报告一次。)
make: *** [magent.o] 错误 1
需要修改vim ketama.h
在第一行加上
#ifndef SSIZE_MAX
在第四行加上
#define SSIZE_MAX 32676
在最后添加
#endif
再重新make,出现以下则成功
[root@test magent]# make
gcc -Wall -O2 -g -I/usr/local/libevent/include -c -o magent.o magent.c
gcc -Wall -O2 -g -I/usr/local/libevent/include -c -o ketama.o ketama.c
gcc -Wall -O2 -g -o magent magent.o ketama.o -levent -lm -L/usr/local/libevent/lib
执行magent后又报错,则需要执行cp magent /usr/bin/magent
bash: magent: command not found
执行magent出现以下则表示成功
[root@test magent]# magent
please provide -s "ip:port" argument
memcached agent v0.4 Build-Date: Apr 23 2015 21:24:28
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.magent1、magent2作为memcached的总入口,我们使用算法来实现负载均衡,分配读写请求,无论使用哪个入口分配到后端的memcached是一样的,因为它们分配memcached使用的都是同一个算法consistent-hash
2.后端mecached1,mecached2,mecached3,mecached4多位4个主memcached
3.magent3作为从,同时也是从memcached的入口,其后端还有两个memcached5,mecached6;由magent3,mecached5,mecached6共同组成从memcached
工作流程:
1.magent1,magent2接受写请求,将key分别写入mecached1-mecached4中,同时也将key写入从memcached上,也就是magent3上,magent3再分别写入mecached5,mecached6中;主和从都是用的同一个分配算法
2.magent1,magent2接受读请求,将分别向主memcached中进行读取,而不想从memcached中读取;
3.一旦mecached1-mecached4中有一个memcached宕掉,此时magent1和magent2将向从memcached,也就是magent3中读取数据,达到缓存数据不丢失的效果;
4.当主中的memcache恢复后,将再次加入主memcached中,此时magent1和magent2将不会向从memcached中读数据了,但是写仍正常进行;
启动如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
memcached1-memcached6
/usr/local/memcached-1.4.22/bin/memcached -u root -d -p 11211 -m 1024 -c 102400
/usr/local/memcached-1.4.22/bin/memcached -u root -d -p 11212 -m 1024 -c 102400
/usr/local/memcached-1.4.22/bin/memcached -u root -d -p 11213 -m 1024 -c 102400
/usr/local/memcached-1.4.22/bin/memcached -u root -d -p 11214 -m 1024 -c 102400
/usr/local/memcached-1.4.22/bin/memcached -u root -d -p 11215 -m 1024 -c 102400
/usr/local/memcached-1.4.22/bin/memcached -u root -d -p 11216 -m 1024 -c 102400
magent3
/usr/bin/magent -u root -n 102400 -l 192.168.3.127 -p 12002 -s 192.168.3.127:11215 -s 192.168.3.127:11216
magent1:
usr/bin/magent -u root -n 102400 -l 192.168.3.127 -p 12000 -s 192.168.3.127:11211 -s 192.168.3.127:11212 -s 192.168.3.128:11213 -s 192.168.3.127:11214 -b 192.168.3.127:12002
magent2:
usr/bin/magent -u root -n 102400 -l 192.168.3.127 -p 12001 -s 192.168.3.127:11211 -s 192.168.3.127:11212 -s 192.168.3.128:11213 -s 192.168.3.127:11214 -b 192.168.3.127:12002
magent1,magent2算法:
1.可以根据magent总入口的个数(此处为2),使用除以2取余的方式,若为0分配到magent1,若为1分配到magent2,这样会实现将请求平均分配到magent1和magent2上
注:
1.若memcached读写的数据多,一定将关掉防火墙或将防火墙设置为不使用跟踪链接表,否则会导致/var/log/message报错“kernel: nf_conntrack: table full, dropping packet”,详情请参考本博客中的博文http://blog.csdn.net/yanggd1987/article/details/45886913。
2.使用service iptables stop关掉,并且不能用iptables -L -vnx查看,因此使用此命令会将防火墙开启,虽然规则是清空的,但仍会记录连接跟踪表。
分享到:
相关推荐
**Memcached集群Linux搭建** Memcached是一款高性能的分布式内存缓存系统,用于减轻数据库的负载,提高Web应用的响应速度。在Linux环境下搭建Memcached集群是优化服务性能的关键步骤,尤其是对于那些处理大量数据和...
这个是Linux系统memcached集群的搭建方法,需要用到magnet包,libevent和memcached
在开始搭建集群之前,首先需要在所有参与节点上安装Memcached。对于Linux系统,通常使用包管理器进行安装: #### 1. Ubuntu/Debian: ```bash sudo apt-get update sudo apt-get install memcached ``` #### 2. ...
memcached单机到集群完整搭建过程
标题中的“tomcat + apache + memcached 集群jar包”揭示了这是一个关于构建分布式系统的技术组合,其中涉及到三个核心组件:Tomcat(一个流行的Java应用服务器)、Apache(一个广泛应用的HTTP服务器)和Memcached...
标题中的“tomcat与memcached集群jar”指的是在Apache Tomcat服务器上集成Memcached缓存技术所需的Java档案(JAR)文件。Tomcat是流行的开源Java应用服务器,用于部署和运行Java Servlet和JavaServer Pages(JSP)。...
【标题】:“Tomcat6与Memcached集群整合实现Session共享” 在Web应用开发中,Session共享是一个关键问题,尤其是在分布式环境中。Tomcat6是Apache软件基金会的Java Servlet容器,广泛用于部署Java Web应用程序。而...
Nginx+Tomcat+Memcached集群Session共享实例,Nginx 1.81 + tomcat1 + tomcat2 + Memcached 完整可运行 访问根目录下 test.jsp 可看效果
couchbase-client-1.2.2.jar ...memcached-session-manager-1.6.5.jar memcached-session-manager-tc6-1.6.5.jar minlog-1.2.jar msm-kryo-serializer-1.6.5.jar reflectasm-0.9.jar spymemcached-2.10.2.jar
它利用Memcached这个高性能、分布式的内存对象缓存系统来存储和管理用户的Session数据,从而实现Session在不同服务器之间的共享。以下是关于这个主题的详细知识: 1. **Memcached简介** Memcached是一款开源的、高...
挺实用的memcached集群安装教程
5. **安装与配置**:在搭建这个集群时,需要安装Nginx、Tomcat7和Memcached,并进行相应的配置。Nginx配置文件中需要添加反向代理和负载均衡规则,Tomcat需要配置Session的Memcached监听器,Memcached则需要设置合适...
标题中的“tomcat7 memcached集群”指的是在Tomcat 7这个流行的Java应用服务器中,利用memcached构建的分布式缓存系统,以实现session共享。Session共享是Web应用程序中的一个关键概念,它允许用户在不同服务器之间...
这里我们讨论的主题是如何通过Nginx、Tomcat和Memcached来实现集群环境下的session共享。Nginx作为反向代理服务器,负责负载均衡,Tomcat作为应用服务器运行Java Web应用程序,而Memcached则作为分布式内存缓存系统...
Nginx+Tomcat7+Memcached集群Session共享 完整例子 主要是利用memcached-session-manager(下面简称msm)开源tomcat插件改变tomcat原始的session存储机制,将session的存储放到分布式缓存memcache中,从而实现对...
nginx+tomcat+memcached集群和负载均衡所有资源包,具体集群方法请参见博文:http://blog.csdn.net/l1028386804/article/details/48289765
在 Tomcat 中,我们可以利用 Memcached Session Manager (MSM) 这一工具来实现这一目标。该工具有多种序列化策略,例如 msm-javolution-serializer,用于将 Java 对象转换为可在网络上传输的字节序列。 下面是实现 ...
搭建Memcached缓存服务器1 Memcached是一种高性能的缓存服务器,通常用于加速动态网页和减少数据库的负载。在本文中,我们将详细介绍如何搭建Memcached缓存服务器。 标题解释 Memcached缓存服务器是一种流行的缓存...
本文旨在探讨Memcached集群的负载均衡机制,并为对此领域感兴趣的读者提供参考与指导。我们期望这份文档能够为那些寻求解决方案的朋友们提供有价值的帮助。热忱欢迎感兴趣的朋友前来查阅。
apache 集群tomcat,session管理使用memcached,可部署javaweb,javaee的项目. 压缩包包含安装配置文档,apache no ssl 32bit 64bit,memcached 32bit 64bit安装文件以及tomcat所需要的jar,以及主要apache的配置文件. ...