用memcached-session-manager实现Tomcat集群
聲明:本篇文章是根據(jù)memcached-session-manager官方配置方法wiki頁面翻譯整理,關(guān)于memcached-session-manager的介紹,具體參見官網(wǎng):http://code.google.com/p/memcached-session-manager/,也可以參考:http://gong1208.iteye.com/blog/1596120
?
Introduction
如果為了簡單使用,你只需要安裝一個tomcat(6或者7)和memcached,在生產(chǎn)環(huán)境中可能會有多臺tomcat服務器以及多臺可用的memcached節(jié)點,并安裝在不同的機器上,我們可以使用黏性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的一個普通節(jié)點),而m2是運行在另外的一臺機器上。只有當m2不可用(宕機或無法訪問)時,t1才會把session存儲到memcached-1(m1,m1是t1的故障轉(zhuǎn)移節(jié)點)上。使用這種配置,即使機器1宕機了session也不會丟失。具體如下圖所示:
我們?nèi)绾卧O置才能實現(xiàn)呢?
?
Decide which serialization strategy to use
從1.1版開始,MSM就提供了多種可選的session序列化策略,默認的策略是使用java進行序列化,這種實現(xiàn)已經(jīng)集成在memcached-session-manager.jar包中了,其它的策略則可以通過不同的jar包來提供實現(xiàn)。在下面的章節(jié)中,我們可以了解到每種策略所需要的jar包具體有哪些。
?
Configure tomcat
關(guān)于tomcat的配置主要包括兩個方面,首先需要下載所需要的包,放到tomcat安裝目錄下的lib目錄下(嚴格來說應該是$CATALINA_HOME/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?,如果使用的是tomcat7則下載?memcached-session-manager-tc7-${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:
Xml代碼??javolution:
Xml代碼??xstream:
Xml代碼??flexjson:
Xml代碼???
如果我們不是使用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節(jié)點下的內(nèi)容,添加memcached-session-manager配置。
下面將會講解關(guān)于tomcat配置的具體的示例,主要包括使用memcached來管理黏性session和非黏性session以及使用membase來管理非黏性session。示例基于的前提是假設我們有2個memcached實例,一個運行在host1主機,另一個運行在host2主機,示例使用的序列化方式為kryo。
下面我們給出tomcat1的配置,假設tomcat1和memcached節(jié)點n1都是運行在host1主機上,其中屬性failoverNodes="n1"的作用是告訴msm最好是把session保存在memcached "n2"節(jié)點上,只有在n2節(jié)點不可用的情況下才把session保存在n1節(jié)點。這樣即使host1主機宕機,仍然可以通過host2上的tomcat2訪問存放在memcached "n2"?節(jié)點中的session。
tomcat1 configuration:
Xml代碼??以上就是tomcat1的配置信息,對于tomcat2,我們只需要修改一下failoverNodes屬性的值為"n2" ,這樣tomcat2就會優(yōu)先把session存放到memcached "n1"節(jié)點,其余配置信息都一樣。
?
下面演示一個非黏性session管理的配置示例,對于非黏性的session管理,我們不需要配置failoverNodes屬性,因為所有sessions在tomcat集群中是循環(huán)可見的,并不會綁定到某一個單獨的tomcat,對于非黏性session管理,集群中的所有tomcat都是用同一個配置,具體信息如下:
Xml代碼??如果是使用membase來對session進行管理,那么則某一個節(jié)點的配置如下:
Xml代碼??在context.xml中配置完msm之后,?我們就可以啟動我們的應用程序了,這樣所有的session將會根據(jù)系統(tǒng)配置存儲到指定的memcached節(jié)點或者membase中。
?
Overview over memcached-session-manager configuration attributes
className?(required)
類名:de.javakaffee.web.msm.MemcachedBackupSessionManager
?
memcachedNodes?(required)
memcached節(jié)點:此屬性應該包含所有運行的memcached節(jié)點或者membase bucket的uri地址,每一個memcached節(jié)點的屬性定義格式為<id>:<host>:<port>,多個節(jié)點定義直接使用空格或者逗號分隔,形如:memcachedNodes="n1:app01:11211,n2:app02:11211",如果只有單個的memcached節(jié)點,則<id>是可選項,只需配置<host>:<port>即可,形如:memcachedNodes="localhost:11211"。
如果我們配置的是membase,那么從1.6.0版本開始,我們可以配置指定一個或者多個membase bucket uris,形如:http://host1:8091/pools,http://host2:8091/pools。Bucket?名稱和密碼通過屬性username,password來定義。membase buckets連接需要遵循memcached協(xié)議,傳輸數(shù)據(jù)通過二進制流方式。
?
failoverNodes?(optional, must not be used for non-sticky sessions)
故障轉(zhuǎn)移節(jié)點:可選項,對非黏性session不可用,屬性必須包含memcached節(jié)點集群的所有ids。節(jié)點id之間用空格或者逗號分隔。
?
username?(since 1.6.0, optional)
從1.6.0版開始使用,并且是可選的。用來進行membase bucket或者SASL驗證。
?
password?(since 1.6.0, optional)
從1.6.0版開始使用,并且是可選的。用來進行membase bucket或者SASL驗證,密碼可以為空。
?
memcachedProtocol?(since 1.3, optional, default?text)
定義memcached協(xié)議,默認使用text文本
?
sticky?(since 1.4.0, optional, default?true)
定義session方式為黏性或非黏性,默認為true
?
lockingMode?(since 1.4.0, optional, for non-sticky sessions only, default?none)
只有非黏性session才使用,默認值為none
- none: 從不對session進行鎖定
- all: session將一直被鎖定,直到請求結(jié)束
- auto: 對于只讀請求,session將不會被鎖定,如果是非只讀請求,則session會被鎖定
- uriPattern:<regexp>: 通過正則表達式的方式來對請求uri以及查詢字符串進行匹配,只有匹配上的才會被鎖定。
requestUriIgnorePattern?(optional)
?
sessionBackupAsync?(optional, default?true)
?
backupThreadCount?(since 1.3, optional, default?number-of-cpu-cores)
?
sessionBackupTimeout?(optional, default?100)
?
operationTimeout?(since 1.6.0, optional, default?1000)
?
sessionAttributeFilter?(since 1.5.0, optional)
?
transcoderFactoryClass?(since 1.1, optional, default?de.javakaffee.web.msm.JavaSerializationTranscoderFactory)
序列化接口實現(xiàn):
- Java serialization:?de.javakaffee.web.msm.JavaSerializationTranscoderFactory
- Kryo?based serialization:?de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory
- Javolution based serialization:?de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory
- XStream based serialization:?de.javakaffee.web.msm.serializer.xstream.XStreamTranscoderFactory
?
copyCollectionsForSerialization?(since 1.1, optional, default?false)
?
customConverter?(since 1.2, optional)
?
enableStatistics?(since 1.2, optional, default?true)
?
enabled?(since 1.4.0, optional, default?true)
總結(jié)
以上是生活随笔為你收集整理的用memcached-session-manager实现Tomcat集群的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql explain 用法和理解
- 下一篇: SAPI(PHP常见的四种运行模式)