Memcache學習筆記三:Memcache管理Tomcat的Session,Session共享

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版本必修相同,測試使用都是6
kryo相關jar     //序列化,序列化相關還有:flexjson、xstream等
memcached-session-manager-1.9.7.jar
spymemcached-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的集羣的管理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章