一、簡介
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><Context></code>
<code><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>/></code>
<code></Context></code>
配置第二台tomcat
<code>[root@node3 local]# vi tomcat/conf/context.xml</code>
<code> </code><code><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添加
<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"
/>
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配置
<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節點的屬性定義格式為<id>:<host>:<port>,多個節點定義直接使用空格或者逗号分隔,形如:memcachedNodes="n1:app01:11211,n2:app02:11211",如果隻有單個的memcached節點,則<id>是可選項,隻需配置<host>:<port>即可,形如: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:<regexp>: 通過正規表達式的方式來對請求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,如需轉載請自行聯系原作者