首页 > 系统服务 > 详细

【电商】nginx+tomcat+memcached实现session共享集群

时间:2015-07-23 02:08:53      阅读:393      评论:0      收藏:0      [点我收藏+]

?

在分布式多tomcat web集群环境下,首先要解决的是session的共享问题,一般的实现思路有:

(1) session复制:多tomcat之间进行session的同步,集群中的tomcat存储相同的session信息

(2) 共享session存储:将session集中存储在同一个地方,如redis/memcached,甚至DB。tomcat本身的内存中并不存储session

(3) session粘性:其实session粘性并不是session共享的方案,而是多tomcat的集群方案,配合nginx/apache实现,将同一用户请求转向到相同的tomcat结点,多结点之间并不共享sesison。优点是实现简单,缺点就是结点故障时,会丢失部分session。一般会配合前两种方式使用。

?

本文记录使用memcached-session-manager组件搭建nginx+tomcat+memcached实现集群和session共享存储环境的全部过程。

nginx:1.8.0

tomcat两个:6.0.44?

memcached集群:1.4.4

?

memcached-session-manager提供了多种session数据序列化策略:

(1) java序列化:要求待存储的信息实现java.io.Serializable接口;

(2) kryo序列化

(3) javolution

(4) xstream

(5) flexjson

参见:http://code.google.com/p/memcached-session-manager/wiki/SerializationStrategies

这里的使用的序列化策略为kryo

(1) 将下面所有依赖的这些jar包放在$TOMCAT_HOME/lib中:

asm-3.2.jar ?kryo-1.04.jar ?kryo-serializers-0.11.jar ?memcached-session-manager-1.8.3.jar ?memcached-session-manager-tc6-1.8.3.jar ?minlog-1.2.jar ?msm-kryo-serializer-1.8.3.jar ?reflectasm-1.01.jar ?spymemcached-2.11.1.jar

(2) 两个tomcat分别配置conf/context.xml,增加:

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:localhost:11211,n2:localhost:11212"
    sticky="false"
    sessionBackupAsync="false"
    lockingMode="uriPattern:/path1|/path2"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />

?这里使用的策略是session非粘性,memcached使用两个结点的集群

另外,分别配置两个tomcat的HTTP监听端口为7181和7182

(3) nginx配置:

? ??

upstream cluster_memcached {
        server localhost:7181;
        server localhost:7182;
   }
   server {
       listen 7180;
       server_name localhost;
       location / {
         proxy_pass http://cluster_memcached;
       }
   }

?这里配置nginx监听端口为7190,并请所有的请求反向代理到7181和7182的tomcat集群.

?

(4) 测试代码session.jsp:

<%@ page import="java.util.Enumeration" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>session test</title>
  <%
    String key = request.getParameter("sessionKey");
    String value = request.getParameter("sessionValue");
    if(key != null && !"".equalsIgnoreCase(key.trim())) {
      session.setAttribute(key, value);
    }
  %>
</head>
<body>
<form action="session.jsp" method="post">
<input type="text" name="sessionKey" value="key1"><input type="text" name="sessionValue" value="value1">
<input type="submit" value="提交">
</form>
<h4>已经存储的session--<%=session.getServletContext().getRealPath("/")%></h4>
<table>
  <tr>
  <th>key</th>
  <th>value</th>
  </tr>
  <%
  Enumeration<String> keys = session.getAttributeNames();
    while(keys.hasMoreElements()){
      String k = keys.nextElement();
      String v = (String)session.getAttribute(k);
      %>
  <tr>
    <td><%=k%></td>
    <td><%=v%></td>
  </tr>
  <%
    }
  %>
</table>
</body>
</html>

?

?

?

分布式集群高可用session理论性文章:http://tendyming.iteye.com/blog/1815136

【电商】nginx+tomcat+memcached实现session共享集群

原文:http://dinguangx.iteye.com/blog/2229490

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!