天天看點

使用Memcached Session Manager擴充Session管理

在請求過程中首先要解析請求中的sessionid資訊,然後将sessionid存儲到request的參數清單中。

然後再從request擷取session的時候,如果存在sessionid那麼就根據id從session池中擷取session,

如果sessionid不存在或者session失效,那麼則建立session并且将session資訊放入session池,供下次使用。

session是存在伺服器端的,多台伺服器叢集時,

session replication 政策是複制會話,即一個使用者通路了一次就把session複制到所有的伺服器或這一部分伺服器。

session sticky政策則是不複制,一個使用者通路了一次後,同一個session周期内,所有的請求都定向到這個伺服器。

所有的tomcat節點需要安裝memcached-session-manager,每一個tomcat會有自己的本地session,當一個請求執行完畢之後,如果對應的session之前不存在(也就是說這是某個使用者的第一次請求),則将該session拷貝一份副本至memcached緩存,當該session的下一個請求到達時,會使用tomcat的本地session,請求處理結束之後,session的變化會同步更新到memcached緩存中對應的session裡,進而確定本地session和緩存中的session始終保持一緻。如果目前結點失效,下一個請求會被路由給另外一個tomcat處理,這個tomcat發現請求所屬的session并不存在,于是它将查詢memcached緩存,并将查詢到的session恢複到本地,這樣就完成了容錯處理。(以上是sticky session模式為背景的解釋,memcached-session-manager也支援non-sticky session。)

由于以緩存為基礎的session管理不需要大量的資料複制,其性能表現更好,具有更好的伸縮性。

introduction

如果為了簡單使用,你隻需要安裝一個tomcat(6或者7)和memcached,在生産環境中可能會有多台tomcat伺服器以及多台可用的memcached節點,并安裝在不同的機器上,我們可以使用黏性session(sticky sessions)或者非黏性session(non-sticky sessions),memcached-session-manager (msm) 對這兩種操作模式都支援。

下面給出一個黏性session模式的設定示例,此執行個體中安裝了2個tomcat以及2個memcached。

tomcat-1(t1)的首要選擇是把session存儲在memcached-2 (m2)上(m2是t1的一個普通節點),而m2是運作在另外的一台機器上。隻有當m2不可用(當機或無法通路)時,t1才會把session存儲到memcached-1(m1,m1是t1的故障轉移節點)上。使用這種配置,即使機器1當機了session也不會丢失。具體如下圖所示:

使用Memcached Session Manager擴充Session管理

memcached-session-manager with sticky sessions

我們如何設定才能實作呢?

decide which serialization strategy to use

從1.1版開始,msm就提供了多種可選的session序列化政策,預設的政策是使用java進行序列化,這種實作已經內建在memcached-session-manager.jar包中了,其它的政策則可以通過不同的jar包來提供實作。在下面的章節中,我們可以了解到每種政策所需要的jar包具體有哪些。

configure tomcat

關于tomcat的配置主要包括兩個方面,首先需要下載下傳所需要的包,放到tomcat安裝目錄下的lib目錄下(嚴格來說應該是catalinahome/lib/)以及我們應用的web−inf/lib/目錄下,同時還需要修改catalinahome/lib/)以及我們應用的web−inf/lib/目錄下,同時還需要修改catalina_home/conf/context.xml檔案,并在<context>元素中添加memcached session管理的配置資訊。

add memcached-session-manager jars to tomcat

不管你選擇哪種序列化政策,你都需要 memcached-session-manager-version.jar,如果你使用的是tomcat6,則還需要下載下傳memcached−session−manager−tc6−version.jar,如果你使用的是tomcat6,則還需要下載下傳memcached−session−manager−tc6−{version}.jar ,如果使用的是tomcat7則下載下傳 memcached-session-manager-tc7-version.jar。同時還需要下載下傳spymemcached−2.7.3.jar.下載下傳這完這些jar包後把jar包放到version.jar。同時還需要下載下傳spymemcached−2.7.3.jar.下載下傳這完這些jar包後把jar包放到catalina_home/lib/目錄。

add custom serializers to your webapp (optional)

如果隻是使用java序列化的話,那麼需要的jar包就是以上所列出的那些了,但是如果想使用自定義的序列化政策(通常性能會更佳),我們還需要下載下傳相應的jar包并放到我們webapp下的web-inf/lib/目錄中。

如果你的應用使用了maven來進行jar包管理,那麼你隻需要在pom.xml中加入相應的序列化政策依賴定義就可以了,具體的maven依賴定義如下(任選一種就ok了):

kryo-serializer:

1

2

3

4

5

6

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

<code>&lt;</code><code>groupid</code><code>&gt;de.javakaffee.msm&lt;/</code><code>groupid</code><code>&gt;</code>

<code>&lt;</code><code>artifactid</code><code>&gt;msm-kryo-serializer&lt;/</code><code>artifactid</code><code>&gt;</code>

<code>&lt;</code><code>version</code><code>&gt;1.6.0&lt;/</code><code>version</code><code>&gt;</code>

<code>&lt;</code><code>scope</code><code>&gt;runtime&lt;/</code><code>scope</code><code>&gt;</code>

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

javolution:

<code>&lt;</code><code>artifactid</code><code>&gt;msm-javolution-serializer&lt;/</code><code>artifactid</code><code>&gt;</code>

xstream:

<code>&lt;</code><code>artifactid</code><code>&gt;msm-xstream-serializer&lt;/</code><code>artifactid</code><code>&gt;</code>

flexjson:

<code>&lt;</code><code>artifactid</code><code>&gt;msm-flexjson-serializer&lt;/</code><code>artifactid</code><code>&gt;</code>

如果我們不是使用maven倉庫來對依賴進行管理的話 ,我們需要針對每種政策下載下傳單獨需要的jar包,具體如下:

kryo-serializer: msm-kryo-serializer, kryo-serializers, kryo, minlog, reflectasm, asm-3.2

javolution-serializer: msm-javolution-serializer, javolution-5.4.3.1

xstream-serializer: msm-xstream-serializer, xstream, xmlpull, xpp3_min

flexjson-serializer: msm-flexjson-serializer, flexjson

configure memcached-session-manager as &lt;context&gt; manager

處理完jar包之後,我們還需要修改 $catalina_home/conf/context.xml檔案中context節點下的内容,添加memcached-session-manager配置。

下面将會講解關于tomcat配置的具體的示例,主要包括使用memcached來管理黏性session和非黏性session以及使用membase來管理非黏性session。示例基于的前提是假設我們有2個memcached執行個體,一個運作在host1主機,另一個運作在host2主機,示例使用的序列化方式為kryo。

下面我們給出tomcat1的配置,假設tomcat1和memcached節點n1都是運作在host1主機上,其中屬性failovernodes="n1"的作用是告訴msm最好是把session儲存在memcached "n2"節點上,隻有在n2節點不可用的情況下才把session儲存在n1節點。這樣即使host1主機當機,仍然可以通過host2上的tomcat2通路存放在memcached "n2" 節點中的session。

tomcat1 configuration:

7

8

9

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

<code>...</code>

<code>&lt;</code><code>manager</code> <code>classname="de.javakaffee.web.msm.memcachedbackupsessionmanager"</code>

<code>memcachednodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"</code>

<code>failovernodes="n1"</code>

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

<code>transcoderfactoryclass="de.javakaffee.web.msm.serializer.kryo.kryotranscoderfactory"</code>

<code>/&gt;</code>

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

 

以上就是tomcat1的配置資訊,對于tomcat2,我們隻需要修改一下failovernodes屬性的值為"n2" ,這樣tomcat2就會優先把session存放到memcached "n1"節點,其餘配置資訊都一樣。

下面示範一個非黏性session管理的配置示例,對于非黏性的session管理,我們不需要配置failovernodes屬性,因為所有sessions在tomcat叢集中是循環可見的,并不會綁定到某一個單獨的tomcat,對于非黏性session管理,叢集中的所有tomcat都是用同一個配置,具體資訊如下:

10

11

<code>sticky="false"</code>

<code>sessionbackupasync="false"</code>

<code>lockingmode="uripattern:/path1|/path2"</code>

如果是使用membase來對session進行管理,那麼則某一個節點的配置如下:

12

13

<code>username="bucket1"</code>

<code>password="topsecret"</code>

<code>memcachedprotocol="binary"</code>

在context.xml中配置完msm之後, 我們就可以啟動我們的應用程式了,這樣所有的session将會根據系統配置存儲到指定的memcached節點或者membase中。