天天看點

将tomcat的session資訊儲存在memcached中

一、簡介

   MSM(memcached-session-manager)支援tomcat6和tomcat7 ,利用Value(Tomcat 閥對Request進行跟蹤。Request請求到來時,從memcached加載session,Request請求結束時,将tomcat session更新至memcached,以達到session共享之目的,支援sticky和 non-sticky 模式。

   Sticky 模式:tomcat session為主session, memcached為備session。Request請求到來時, 從memcached加載備session到tomcat (僅當tomcat jvmroute發生變化時,否則直接取tomcat session);Request請求結束時,将tomcat session更新至memcached,以達到主備同步之目的。

   Non-Sticky模式:tomcat session為中轉session, memcached1為主session,memcached 2為備session。Request請求到來時,從memcached2加載備session到tomcat,當容器中還是沒有session 則從memcached1加載主session到tomcat,這種情況是隻有一個memcached節點,或者有memcached1出錯時,Request請求結束時,将tomcat session更新至主memcached1和備memcached2,并且清除tomcat session 。以達到主備同步之目的。

二、實作方案

   1.ip規劃

   192.168.1.201 apache

   192.168.1.202 192.168.1.203 tomcat

   192.168.1.204 memcached

   2.memcached的安裝

   3.apache+tomcat的實作

   測試結果

<a href="http://s3.51cto.com/wyfs02/M02/26/F1/wKiom1NvoAPToRl_AADHvTzCEUw777.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/26/F1/wKioL1Nvn9jS4-UwAACuxK9iKb4460.jpg" target="_blank"></a>

   4.将session存儲到memcached中

     配置第一台tomcat    

1

2

3

4

5

6

7

8

9

<code>[root@node2 local]# vi tomcat/conf/context.xml</code>

<code>&lt;Context&gt;</code>

<code>&lt;Manager className=</code><code>"de.javakaffee.web.msm.MemcachedBackupSessionManager"</code>

<code>    </code><code>memcachedNodes=</code><code>"n1:192.168.1.204:11211"</code>

<code>    </code><code>failoverNodes=</code><code>"n1"</code>

<code>    </code><code>requestUriIgnorePattern=</code><code>".*\.(ico|png|gif|jpg|css|js)$"</code>

<code>    </code><code>transcoderFactoryClass=</code><code>"de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"</code>

<code>    </code><code>/&gt;</code>

<code>&lt;/Context&gt;</code>

     配置第二台tomcat

<code>[root@node3 local]# vi tomcat/conf/context.xml</code>

<code> </code><code>&lt;Manager className=</code><code>"de.javakaffee.web.msm.MemcachedBackupSessionManager"</code>

   下載下傳專用的jar包,并将這些jar包放置在$CATALINA_HOME/lib/

<code>[root@node2 lib]# wget http:</code><code>//repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/1.8.1/memcached-session-manager-1.8.1.jar</code>

<code>[root@node2 lib]# wget http:</code><code>//repo1.maven.org/maven2/net/spy/spymemcached/2.10.2/spymemcached-2.10.2.jar</code>

<code>[root@node2 lib]# wget http:</code><code>//repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/1.8.1/memcached-session-manager-tc7-1.8.1.jar</code>

三、memcached支援的序列化參數

   1.javolution序列化tomcat配置

   conf/context.xml添加

&lt;Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

  memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311"   

   lockingMode="auto"

   sticky="false" 

   requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"    

   sessionBackupAsync= "false"   

   sessionBackupTimeout= "100"  

   copyCollectionsForSerialization="true"   

   transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"    

       /&gt;

   lib增加jar包

   msm-javolution-serializer-cglib-1.3.0.jar

   msm-javolution-serializer-jodatime-1.3.0.jar

   spymemcached-2.10.3.jar

   javolution-5.4.3.1.jar

   msm-javolution-serializer-1.7.0.jar

   memcached-session-manager-1.7.0.jar

   memcached-session-manager-tc7-1.7.0.jar

2、xstream序列化tomcat配置

   &lt;Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

   sessionBackupTimeout= "100"

   transcoderFactoryClass="de.javakaffee.web.msm.serializer.xstream.XStreamTranscoderFactory"    

   xmlpull-1.1.3.1.jar

   xpp3_min-1.1.4c.jar

   xstream-1.4.6.jar

   msm-xstream-serializer-1.7.0.jar

3、flexjson序列化tomcat配置

  memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311"     

   sessionBackupTimeout= "100"      

   transcoderFactoryClass="de.javakaffee.web.msm.serializer.json.JSONTranscoderFactory"    

   flexjson-3.1.jar

   msm-flexjson-serializer-1.7.0.jar

4、kryo序列化tomcat配置

      memcachedNodes="n1:192.168.100.208:11211 n2:192.168.100.208:11311"   

   sessionBackupTimeout= "100"    

   transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"    

   kryo-1.04.jar

   minlog-1.2.jar

   asm-3.2.jar

   reflectasm-1.01.jar

   kryo-serializers-0.11.jar

   msm-kryo-serializer-1.7.0.jar

   各種情況配置如上,據說kryo序列化效率比較快,未做測試。

   選其一中方式,部署2個tomcat端口分别是8080和8181

   啟動後,通路重新整理SessionID是否一緻。

<a href="http://127.0.0.1:8080/t.jsp" target="_blank">   http://127.0.0.1:8080/t.jsp</a>

   SessionID:37B7F153AB3567295B2FBF1831475F5F-n1

   SessionIP:127.0.0.1 

   SessionPort:8080

<a href="http://127.0.0.1:8181/t.jsp" target="_blank">   http://127.0.0.1:8181/t.jsp</a>

   SessionPort:8181  

   測試結果SessionID一緻。

   session存儲到memchached實作方案時。他主要功能是修改tomcat的session存儲機制,使之能夠把session序列化存放到memcached中。

Manager标簽屬性說明

1.className  必須

類名:de.javakaffee.web.msm.MemcachedBackupSessionManager

2.memcachedNodes  必須

memcached節點:此屬性應該包含所有運作的memcached節點或者membase bucket的uri位址,每一個memcached節點的屬性定義格式為&lt;id&gt;:&lt;host&gt;:&lt;port&gt;,多個節點定義直接使用空格或者逗号分隔,形如:memcachedNodes="n1:app01:11211,n2:app02:11211",如果隻有單個的memcached節點,則&lt;id&gt;是可選項,隻需配置&lt;host&gt;:&lt;port&gt;即可,形如:memcachedNodes="localhost:11211"。

3.failoverNodes 可選項

故障轉移節點:可選項,對非黏性session不可用,屬性必須包含memcached節點叢集的所有ids。節點id之間用空格或者逗号分隔。

4.username 可選項

從1.6.0版開始使用,并且是可選的。用來進行membase bucket或者SASL驗證,密碼可以為空。

5.password 可選項

6.memcachedProtocol    可選項

定義memcached協定,預設使用text文本,出屬性指明memcached使用的存儲協定。隻支援text或者binary。

7.sticky    可選項

定義session方式為黏性或非黏性,預設為true,多個tomcat時需使用非黏性

8.lockingMode    可選項

隻有非黏性session才使用,預設值為none

none: 從不對session進行鎖定

all: session将一直被鎖定,知道請求結束

auto: 對于隻讀請求,session将不會被鎖定,如果是非隻讀請求,則session會被鎖定

uriPattern:&lt;regexp&gt;: 通過正規表達式的方式來對請求uri以及查詢字元串進行比對,隻有比對上的才會被鎖定。

9.requestUriIgnorePattern   可選項

此屬性是那些不能改備份Session的請求的正規表達式。如果像css,javascript,圖檔等靜态檔案被同一個Tomcat和同一個應用上下文來提供,這些請求也會通過memcached-session-manager。但是這些請求在一個http會話中幾乎沒什麼改變,是以他們沒必要觸發Session備份。是以那些靜态檔案沒必要觸發Session備份,你就可以使用此屬性定義。此屬性必須符合java regex正則規範。

   如:".*\.(png|gif|jpg|css|js)$"  

10.sessionBackupAsync   可選項

指定Session是否應該被異步儲存到Memcached中。 如果被設定為true,backupThreadCount設定起作用,如果設定false,通過sessionBackupTimeout設定的過期時間起作用。

11.backupThreadCount    可選項

用來異步儲存Session的線程數,(如果sessionBackupAsync="true")。預設值為cup的核心數。

12.sessionBackupTimeout    可選項

設定備份一個Session所用的時間,如果操作超過時間那麼儲存失敗。此屬性隻在sessionBackupAsync="false"是起作用。預設100毫秒

13.operationTimeout    可選項

從1.6.0版開始使用, 預設值為1000

14.sessionAttributeFilter    可選項

此屬性是用來控制Session中的那個屬性值儲存到Memcached中的正規表達式。鄭則表達式被用來比對Session中屬性名稱。如sessionAttributeFilter="^(userName|sessionHistory)$" 指定了隻有"userName"和"sessionHistory"屬性儲存到Memcached中。依賴于選擇的序列化政策。

15.transcoderFactoryClass    可選項

此屬性值是建立序列化和反序列化儲存到Memcached中的Session的編碼轉換器的工廠類名。這個指定的類必須實作了de.javakaffee.web.msm.TranscoderFactory和提供一個無參的構造方法。例如其他的有效的實作在其他packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm-javolution-serializer.

預設為 de.javakaffee.web.msm.JavaSerializationTranscoderFactory

16.copyCollectionsForSerialization    可選項

預設值為false。

17.customConverter    可選項

自己定義特殊的類注冊到kryo自定義轉換器中,實作序列化

18.enableStatistics    可選項

用來指定是否進行統計。 預設值為true。

19.enabled   可選項

指定Session儲存到Memcached中是否可用和是否可以通過JMX進行改變。隻用于粘性Session。 預設值為true。

本文轉自wangfeng7399 51CTO部落格,原文連結:http://blog.51cto.com/wangfeng7399/1409637,如需轉載請自行聯系原作者