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共享。
黏性Session
黏性Session:是对于用户和应用服务器之间、应用服务器和缓存的集中管理或备份服务器之间的关系。如上图的第一种架构中就 属于粘性Session,客户端和应用服务器有一定的关系。这种关系的Session就属于粘性Session。
非黏性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版本必修相同,测试使用都是6
kryo相关jar //序列化,序列化相关还有:flexjson、xstream等
memcached-session-manager-1.9.7.jar
spymemcached-2.11.1.jar
关键步骤
测试粘性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" />
非粘性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的集群的管理。