Nginx+tomcat+memcached实现session共享

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx+tomcat+memcached实现session共享相关的知识,希望对你有一定的参考价值。


nginx装载skity模块

出现原因


1.要想做Nginx+tomcat+memcached实现session共享,首先在nginx装载skity模块

保证同一个用户的访问由同一个tomcat处理.

2.ip hash 算法存在弊端因为通过cdn访问的网页,

在服务器看来都是同一个ip访问的,结果都是同一个服务器响应,不能很好的负载均衡.


nginx 添加skity模块

静态编译重新编译

tar zxf nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz

cd nginx-1.10.3

make clean

./configure --prefix=/usr/local/nginx/ --with-http_ssl_module --with-http_stub_status_module 
make && make install


cd /usr/local/nginx/conf/

vim nginx.conf

 22         upstream westos{
 23         sticky;
 24         server 172.25.88.12:8080;
 25         server 172.25.88.13:8080;
 26         }

nginx -s reload


检验

在浏览器访问    http://172.25.88.11/test.jsp

不清空cookie访问的一直都一样删了cookie就不一样拉
或者开两个浏览器,因为cookiecookie不一样,所以访问的不一样
不断刷新,也不会便变!!

技术分享




技术分享




tomcat+memcached实现session共享


什么是session?

在网页上注册上填的一些信息还没来的及存入数据库这个时候是存在session的。

   

在生产环境中,为了负载均衡,通常不同的服务器,可能会存储不同的session,但这样就会有一些问题,同一个用户的session有可能不全在一个服务器上,所以实现session共享就显得格外重要了


Tips:

1.session和memcache都在内存中

2.cookie不能跨域名。

3.云平台弹性计算在线扩容


架构设计(交叉存储)

t12在正常工作的时候,把session存储m12:planA
当m13坏了,才存储在m12(planB:副本) m12是t12的failoverNode(故障切换点) 

这样配置的好处是,当t12,m12同时坏了,t12的数据在m13上,m13可以直接读取t12的数据 
这样一来就可以防止单点故障啦~



技术分享



server12,server3

yum install -y memcached
/etc/init.d/memcached start


真机


scp jar/ [email protected]:/usr/local/tomcat/lib
scp jar/
 [email protected]:/usr/local/tomcat/lib

cd /usr/local/tomcat/lib/
rm -rf memcached-session-manager-tc6-1.6.3.jar


技术分享


cd /usr/local/tomcat/conf/
vim context.xml

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.4.12:11211,n2:172.25.4.13:11211"
      #server13为n2
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>

测试页面

cd /usr/local/tomcat/webapps/ROOT

vim test.jsp

<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>

bin/startup.sh

tail -f logs/catalina.out

当出现finished Initialzation 才说明,tomcat启动成功!!!


技术分享


技术分享




server13:

Server Info: 172.25.88.13 : 8080           

ID 0412CF61D0CD936D00445533643F8B79-n1
Session listuser2 = 22222
user1 = 111111


 访问的是13,可以从日志中看出来,但是存储在server12


技术分享

server12:

telnet localhost 11211

[[email protected] bin]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is ‘^]‘.
get 0412CF61D0CD936D00445533643F8B79-n1
VALUE 0412CF61D0CD936D00445533643F8B79-n1 2048 118
W[<[<01[<[<#0412CF61D0CD936D00445533643F8B79-n1user222222user1111111
END

技术分享


servr13中就没有~


[[email protected] bin]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is ‘^]‘.
get 0412CF61D0CD936D00445533643F8B79-n1
END


技术分享


模拟t13故障了,t12就接管业务了,还是存储在12上!


[[email protected] tomcat]# bin/shutdown.sh

Server Info: 172.25.88.12 : 8080

ID 0412CF61D0CD936D00445533643F8B79-n1
Session listuser2 = 22222
user1 = 111111
user3 = 333333


技术分享


还是存储在server12的m12上



技术分享



这个时候,如果server12的m12坏了,就存入存储在server13拉

[[email protected] bin]# /etc/init.d/memcached stop

Server Info: 172.25.88.12 : 8080

ID 0412CF61D0CD936D00445533643F8B79-n2
Session listuser4-2mdown = 44444
user2 = 22222
user1 = 111111
user3 = 333333


技术分享






总结



访问 http://172.25.88.11/test.jsp,不同的主机访问时会调度到不同的 tomcat 实例上处理.


来自同一主机的请求会交给同一个 tomcat 实例处理,此时你 down 掉当前正在响应的 tomcat 实例,nginx 会自动把用户的请求调度到另一个 tomcat 实例上,同时 session 也没有丢掉,因为另一个tomcat上的memcached上存储了down机的session.


这个时候接下来的数据就存在另一个tomcat上了,直到down机修复,在此期间,用户的访问请求不受任何影响






本文出自 “12049878” 博客,谢绝转载!

以上是关于Nginx+tomcat+memcached实现session共享的主要内容,如果未能解决你的问题,请参考以下文章

Nginx+tomcat+memcached实现session共享

Nginx反向代理+Tomcat+memcached实现session server

Nginx+Tomcat+Memcached实现会话保持

Tomcat+Memcached+Nginx实现session会话共享

haproxy+nginx+tomcat+memcache实现动静分离会话同步集群

Nginx+Tomcat+memcached高可用会话保持