在請求過程中首先要解析請求中的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 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><</code><code>dependency</code><code>></code>
<code><</code><code>groupid</code><code>>de.javakaffee.msm</</code><code>groupid</code><code>></code>
<code><</code><code>artifactid</code><code>>msm-kryo-serializer</</code><code>artifactid</code><code>></code>
<code><</code><code>version</code><code>>1.6.0</</code><code>version</code><code>></code>
<code><</code><code>scope</code><code>>runtime</</code><code>scope</code><code>></code>
<code></</code><code>dependency</code><code>></code>
javolution:
<code><</code><code>artifactid</code><code>>msm-javolution-serializer</</code><code>artifactid</code><code>></code>
xstream:
<code><</code><code>artifactid</code><code>>msm-xstream-serializer</</code><code>artifactid</code><code>></code>
flexjson:
<code><</code><code>artifactid</code><code>>msm-flexjson-serializer</</code><code>artifactid</code><code>></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 <context> 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><</code><code>context</code><code>></code>
<code>...</code>
<code><</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>/></code>
<code></</code><code>context</code><code>></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中。