Memcache学习笔记三:Memcache管理Tomcat的Session,Session共享

来源:互联网 发布:知乎怎么看匿名回答 编辑:程序博客网 时间:2024/06/10 15:43

Memcache学习笔记三:Memcache管理Tomcat的Session,Session共享

标签(空格分隔): Memcache Tomcat Session


一、了解黏性Session(stick Session)和非黏性Session(non-sticky Session)

    这两个概念可以在集群分布式Session架构中很好的解释和理解,出现于应用服务器的集群环境中。如下图两种架构。    在理解这两者的特点之前我们先看看这两种架构。    第一种架构:应用服务器进行集群管理,客户端访问代理服务器,代理服务器进行分配哪台应用服务器进行相应请求,Session池进行每台应用服务器的Session复制备份,防止应用服务器宕机,在这种架构中,应用服务器(Tomcat)自己也管理Session,相当于Session池的“主节点”。有请求到达产生Session,Session池对Session进行备份。代理服务器采用的是IP分治策略,也就是对访问者的【IP进行Hsah算法】%【当前可用服务器台数】得到的结果分配到对应的应用服务器上。这样做的好处是尽量将同一个请求都有同一台服务器进行处理响应。但是同时也有问题存在,例如:在一个局域网里有很多客户端,但是使用的是同一个路由进行数据的转发,这样就会出现很多请求落到了同一个应用服务器上。当出现比较极限的情况,很多局域网都落到同一台应用服务器上,就出现了负载不均的状况。这种架构能够实现自动故障转移和Session共享。    第二种架构:代理服务器用于转发请求,应用服务器只是响应请求不对Session进行管理,Session池对应用服务器的Session统一进行管理。请求到达应用服务器拿到请求的Session,到Session池中查询有没有Session,有就拿到进行响应,没有就创建,同时添加到Session池中。这种架构也能够实现自动故障转移和Session共享。

这里写图片描述

  1. 黏性Session

        黏性Session:是对于用户和应用服务器之间、应用服务器和缓存的集中管理或备份服务器之间的关系。如上图的第一种架构中就属于粘性Session,客户端和应用服务器有一定的关系。这种关系的Session就属于粘性Session。
  2. 非黏性Session

        非黏性Session:像上图的第二种架构客户端和应用服务器没有任何Session的相关的联系,客户端有请求,应用服务器就去Session池中查询,有就进行响应,没有就创建、添加到Session池中,然后进行响应。

简单来讲就是:

黏性Session:当用户发出第一个请求后,负载均衡器动态的把该用户分配到某个节点,并记录该节点的路由,以后该用户的所有请求都绑定到这个路由,用户只会与该server发生交互,这种策略被称为粘性session(sticky session)。反之则是非黏性Session。

二、进行配置

准备工作:    在window下进行配置    两台tomcat服务器    端口好设置为:8081、8082    一个简单测试应用

修改端口

//修改tom1的server.xml    <Server port="8006" shutdown="SHUTDOWN">    <Connector port="8081" protocol="HTTP/1.1"                connectionTimeout="20000"                redirectPort="8443" />    <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />  //修改tom2的server.xml    <Server port="8007" shutdown="SHUTDOWN">    <Connector port="8082" protocol="HTTP/1.1"                connectionTimeout="20000"                redirectPort="8443" />    <Connector port="8011" protocol="AJP/1.3" redirectPort="8443" />      

测试应用

//tom1的应用的三个jsp文件用于测试//add.jsp<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%    String name=request.getParameter("name");    session.setAttribute("name", name); %> //index.jsp 在body标签中表明是Tomcat1 //show.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%    String name=(String)session.getAttribute("name");    out.println("<h1>name:"+name+"</h1>");    out.println("<h1>sessionID:"+session.getId()+"</h1>"); %> //tom2的应用的三个jsp文件用于测试 index.jsp在body标签中表明是Tomcat2 //其他两个jsp与tom1相同

添加jar包

memcached-session-manager-tc6-1.9.7.jar     //与使用tomcat版本必修相同,测试使用都是6kryo相关jar     //序列化,序列化相关还有:flexjson、xstream等memcached-session-manager-1.9.7.jarspymemcached-2.11.1.jar

关键步骤

  1. 测试粘性Session
    修改tom1和tom2的context.xml,在Context标签中添加如下代码

    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"    memcachedNodes="n1:192.168.0.167:11211,n2:192.168.0.167:11212"    failoverNodes="n1"    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
  2. 非粘性Session
    修改tom1和tom2的context.xml,在Context标签中添加如下代码

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

    结果自行测试,体会两者的区别
    下一篇展示nginx代理服务器对tomcat的集群的管理。

0 0