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的集羣的管理。