Nginx+tomcat+memcached实现负载均衡及session(交叉存储)

###在上一篇文章tomcat配置的基础上

Nginx+tomcat+memcached

使用nginx作为前端服务器来实现tomcat负载均衡及高可用,同时基于jsp的动态特征,我们将引入memcache来保持网页在连接过程中的session保持,利用memcached把多个tomcat的session集中管理
图解:
Nginx+tomcat+memcached实现负载均衡及session(交叉存储)_第1张图片
说明:
客户端请求时nginx通过负载调度算法将请求调度至某一后端服务器;tomcat 把会话通过组播的方式复制到集群各节点;所有节点共享会话;

当memcached有两个时可以采用交叉存储,可以更好的避免单点故障
Nginx+tomcat+memcached实现负载均衡及session(交叉存储)_第2张图片
实验环境

主机
server1(nginx+tomcat+memcached) 172.25.5.1
server2(tomcat+memcached) 172.25.5.2

rhel6.5 selinux disable iptables stop

一.sticky(粘至)+nginx1.10实现后端服务器数据同步

1.给server1和server2的tomcat的发布目录下建立一个可以建立存储用户的test.jsp后面有内容

[root@server1 mnt]# cp test.jsp /usr/local/tomcat/webapps/
[root@server1 mnt]# scp test.jsp [email protected]:/usr/local/tomcat/

2.安装nginx1.10.1版本(更好的兼容sticky模块)

[root@server1 sbin]# cd /usr/local/openresty/nginx/sbin/
[root@server1 sbin]# ./nginx -s stop     ##关掉openresty的nginx
[root@server1 mnt]# tar axf nginx-sticky-module-ng.tar.gz ##解压sticky模块
[root@server1 mnt]# cd nginx-sticky-module-ng
[root@server1 nginx-sticky-module-ng]# ls
basic.t        docs                    ngx_http_sticky_misc.h    README.md
Changelog.txt  LICENSE                 ngx_http_sticky_module.c
config         ngx_http_sticky_misc.c  patches
[root@server1 nginx-sticky-module-ng]# cd ..
[root@server1 mnt]# 
[root@server1 mnt]# tar zxf nginx-1.10.1.tar.gz 
[root@server1 mnt]# cd nginx-1.10.1
[root@server1 nginx-1.10.1]# vim src/core/ng  ###修改版本号
[root@server1 nginx-1.10.1]# vim auto/cc/gcc  ###注释debug日至
[root@server1 nginx-1.10.1]# ./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --add-module=/mnt/nginx-sticky-module-ng  ##编译时添加sticky模块
[root@server1 nginx-1.10.1]# make && make install
[root@server1 nginx-1.10.1]# cp /usr/local/openresty/nginx/conf/nginx.conf /usr/local/lnmp/nginx/conf/nginx.conf 拷贝openresty的nginx的
配置文件

3.编辑配置文件

[root@server1 nginx-1.10.1]# cd /usr/local/lnmp/nginx/conf/
[root@server1 conf]# vim nginx.conf
http {
	upstream tomcat {
	#此处不填写算法,默认使用轮叫算法roundrobin
		sticky;     ##添加sticky模块
		server 172.25.5.1:8080;
		server 172.25.5.2:8080;
	}
[root@server1 conf]# cd ..
[root@server1 nginx]# cd sbin/
[root@server1 sbin]# ./nginx -t
[root@server1 sbin]# ./nginx 

测试
在网页上http://172.25.5.1:/test.jsp添加用户时不管后端那台服务器,添加的信息不会丢失
Nginx+tomcat+memcached实现负载均衡及session(交叉存储)_第3张图片
但是这种万一台服务器崩了,前面的数据就没了,所以我们要配置Nginx+tomcat+memcached实现负载均衡及session(交叉存储)

二. nginx+tomcat+memcached负载均衡以及session共享

server1:

[root@server1 mnt]# cd /usr/local/tomcat/logs/
[root@server1 logs]# > catalina.out    ##清空前面添加的数据
[root@server1 tomcat]# cd lib/     
[root@server1 lib]# cp /mnt/jar/* .     ##将jar所以包放进ltomcat的lib目录下      
[root@server1 tomcat]# cd conf/
[root@server1 conf]# vim context.xml      ##编辑在文章的最后添加

[root@server1 conf]# scp context.xml [email protected]:/usr/local/tomcat/conf/   ##给server2发送过去
[root@server1 mnt]# cd jar/
[root@server1 jar]# scp * [email protected]:/usr/local/tomcat/lib/      在将jar里面的软件包给server2的tomcat的lib目录发送过去
[root@server1 mnt]# cd /usr/local/tomcat/bin/
[root@server1 bin]# /etc/init.d/memcached start        ##开启memcache
[root@server1 bin]# ./shutdown.sh          ###重新启动shutdown
[root@server1 bin]# ./startup.sh 

server2:

[root@server2 webapps]# cd /usr/local/tomcat/bin/
[root@server2 bin]# yum install -y memcached     ##下载memcache
[root@server2 bin]# /etc/init.d/memcached start  ##开启memcache
[root@server2 bin]# cd ..
[root@server2 tomcat]# cd conf/
[root@server2 conf]# vim context.xml 

[root@server2 tomcat]# cd lib/  ##查看lib下面的东西是否齐全
[root@server2 bin]# ./shutdown.sh 
[root@server2 bin]# ./startup.sh 

测试:
###在网页上http://172.25.5.1:/test.jsp
Nginx+tomcat+memcached实现负载均衡及session(交叉存储)_第4张图片
#建立用户,如果其中一台tomcat挂了
Nginx+tomcat+memcached实现负载均衡及session(交叉存储)_第5张图片
#另外一台tomcat主机会自动存储数据
Nginx+tomcat+memcached实现负载均衡及session(交叉存储)_第6张图片

#####test.jsp######

<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
Cluster App Test

Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"
");%> <% out.println("
ID " + session.getId()+"
"); String dataName = request.getParameter("dataName"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); } out.print("Session list"); Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = session.getAttribute(name).toString(); out.println( name + " = " + value+"
"); System.out.println( name + " = " + value); } %>
name:
key:

你可能感兴趣的:(Nginx+tomcat+memcached实现负载均衡及session(交叉存储))