1. 程式人生 > >memcached-session-manager 教程實現session共享

memcached-session-manager 教程實現session共享

1簡單介紹
    1.1決定用什麼序列化策略。
    1.2配置tomcat
        1.2.1加入 memcached-session-manager jar 包到tomcat中。


        1.2.2加入序列化相關的jar到你專案(可選的)。
        1.2.3配置 memcached-session-manager 作為tomcat <Context>的管理。
        1.2.4memcached-session-manager 配置選項引數介紹。
        1.2.5系統引數配置(都是 可選的)
    1.3配置日誌

1簡單介紹

最簡單的安裝方式你須要一個tomcat(6。7。或者8) 和一個 memcached (或者其它支援memcached 協議的)。在實際的產品環境中你可能在一些不同的PC上有多個tomcat 和多個memcached。memcached-session-manager(msm) 支援兩種工作模式。sticky sessions(粘性session) 跟 no-sticky sessions(非粘性session);
以下給出一個 sticky sessions 的安裝的樣例。用到了兩個tomcat,兩個memcached;
Tomcat-1(t1) 把他的session主要儲存在 memcached-2(m2),Tomcat-2則主要儲存在 memcached-1(m1),   假設m2假設不能正常工作,t1 將session儲存在 memcached-1 (m1 ,m1是t1的 failoverNod).在這個配置下,當兩臺server中的一臺(machine1 上執行著 t1,m1)宕機的時候,session不會丟失, 以下的很美麗的ASCII展示了這個設定;

  <t1>     <t2>
        . \  / .
        .  X  .
       . /   \   .
<m1>  <m2>

所以 ,應該怎麼做呢?

...
1.1決定用什麼序列化策略.
在序列化策略章節,有幾種序列化的策略能夠選擇.預設的方式是java serialization 這樣的方式已經在memcached-session-manager jar包中提供支援.其它的方式在不同的jar包中,在本節中你將看到不同的方式須要哪些jar包.

1.2配置tomcat
配置tomcat須要做兩件事 1加入一些jar到你的 $CATALINA_HOME/lib/ 資料夾下,和WEB-/lib/ 資料夾下.2配置你的memcached-session-manager 在<Content> (一般在tomcat安裝資料夾的 conf/context.xml)
加入jar包到tomcat

1.2.1依據你選擇的序列化策略你須要加入 memcached-session-manager-${version}.jar  還有假設tomcat6 須要memcached-session-manager-tc6-${version}.jar ,tomcat7(tomcat 7 7.0.23+)須要memcached-session-manager-tc7-${version}.jar  ,tomcat8須要memcached-session-manager-tc8-${version}.jar
http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/
http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc6/
http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/
http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc8/

假設你用的是memcached 你還須要spymemcached-2.10.2.jar  http://repo1.maven.org/maven2/net/spy/spymemcached/2.10.2/spymemcached-2.10.2.jar

假設你使用 couchbase,你須要新增  couchbase-client-1.2.2.jar  jettison-1.1.jar, commons-codec-1.5.jar, httpcore-4.1.1.jar, httpcore-nio-4.1.1.jar, netty-3.5.5.Final.jar.
http://central.maven.org/maven2/com/couchbase/client/couchbase-client/1.2.2/couchbase-client-1.2.2.jar
http://repo1.maven.org/maven2/org/codehaus/jettison/jettison/1.1/jettison-1.1.jar
http://repo1.maven.org/maven2/commons-codec/commons-codec/1.5/commons-codec-1.5.jar
http://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.1.1/httpcore-4.1.1.jar
http://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore-nio/4.1.1/httpcore-nio-4.1.1.jar
http://repo1.maven.org/maven2/io/netty/netty/3.5.5.Final/netty-3.5.5.Final.jar

請下載合適的jar包放在 $CATALINA_HOME/lib/ 資料夾下.
給你的專案新增風格化的序列化方式(可選的)
假設你想使用java自建的序列化方式就什麼都不用做啦,假設想使用不同的序列化方式(能夠獲得更好一些的效能),須要往你的專案中/WEB-INF/lib 新增一些jar包.

msm (在groupId de.javakaffee.msm)在maven倉庫中能夠獲得.你只須要增依賴管理這在你的專案中,使用maven你能夠使用 依賴定義kryo-serializer:

<dependency>
    <groupId>de.javakaffee.msm</groupId>
    <artifactId>msm-kryo-serializer</artifactId>
    <version>1.8.0</version>
    <scope>runtime</scope>
</dependency>

 javolution 的 artifactId是 msm-javolution-serializer, xstream 是msm-xstream-serializer , flexjson 是msm-flexjson-serializer.自行選擇..

 假設你沒有使用maven,不同的的序列化策略須要不同的jar包
  serializers:
    kryo-serializer: msm-kryo-serializer, kryo-serializers-0.11 (0.11 is needed, as 0.20+ is for kryo2), kryo, minlog, reflectasm, asm-3.2
    http://repo1.maven.org/maven2/com/googlecode/kryo/
    http://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/0.11/
    http://repo1.maven.org/maven2/com/googlecode/kryo/
    http://repo1.maven.org/maven2/com/googlecode/minlog/
    http://repo1.maven.org/maven2/com/googlecode/reflectasm/
    http://repo1.maven.org/maven2/asm/asm/3.2/
    javolution-serializer: msm-javolution-serializer, javolution-5.4.3.1
    http://repo1.maven.org/maven2/de/javakaffee/msm/msm-javolution-serializer/
    http://memcached-session-manager.googlecode.com/svn/maven/javolution/javolution/5.4.3.1/
    xstream-serializer: msm-xstream-serializer, xstream, xmlpull, xpp3_min
    http://repo1.maven.org/maven2/de/javakaffee/msm/msm-xstream-serializer/
    http://repo1.maven.org/maven2/com/thoughtworks/xstream/xstream/
    http://repo1.maven.org/maven2/xmlpull/xmlpull/
    http://repo1.maven.org/maven2/xpp3/xpp3_min/
    flexjson-serializer: msm-flexjson-serializer, flexjson
    http://repo1.maven.org/maven2/de/javakaffee/msm/msm-flexjson-serializer/
    http://repo1.maven.org/maven2/net/sf/flexjson/flexjson/
1.2.3配置 memcached-session-manager 作為<Context> 管理者
更新 <Context>(一般在tomcat 安裝資料夾/conf/context.xml 假設你改動過配置檔案的位置,自行改動)使Manager 包括memcached-session-manager ,以下給出例項.
以下的配置的樣例是sticky sessions ,memcached的non-sticky sessions還有membase的non-sticky sessions。
這個配置假設你有兩個memcached分別安裝在兩臺機器上。1個在host1,另一個在host2。

全部的樣例都使用 sticky sessions + kryo(序列化)。



sticky sessions + kryo 的樣例
以下是tomcat1的配置,假設這個tomcat執行在tomcat1。這臺機器同一時候還執行了 memcached "n1". 屬性 failoverNodes="n1" 告訴msm 把session主要儲存在memcached "n2",當沒有其它 memcached node(這裡主要指n2) 能夠使用的時候才儲存在"n1"(假設host1 很不幸運的掛掉了。session 將會繼續儲存在 memcached "n2" tomcat2 也將繼續服務)。第二個tomcat(在host2上)你只須要把failover node 改為“n2” ,所以他叫喜歡“n2”,其它的東西不用改。



<Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
    failoverNodes="n1"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>

non-sticky sessions + kryo 樣例

non-sticky sessions樣例的配置. 在這個樣例不須要配置 ,session將會在tomcat之間迴圈,不會只使用一個tomcat。以下是non-sticky sessions 配置 (全部的tomcat都這樣) ;
<Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
    sticky="false"
    sessionBackupAsync="false"
    lockingMode="uriPattern:/path1|/path2"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>
 non-sticky sessions with couchbase + kryo 的樣例

 假設使用的是 membase 名字叫"bucket1"配置例如以下;

<Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="http://host1.yourdomain.com:8091/pools"
    username="bucket1"
    password="topsecret"
    memcachedProtocol="binary"
    sticky="false"
    sessionBackupAsync="false"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>

多個contexts共享session的 執行多個webapps/contexts 共享session (比如 已經設定 sessionCookiePath="/" -or emptySessionPath="true" in tomcat6),當你使用memcached儲存session,你必須告訴 memcached session manager 加入一個session字首,這是你能夠使用 storageKeyPrefix屬性來設定(具體的設定例如以下):
假設你

<Context sessionCookiePath="/">
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
    failoverNodes="n1"
    storageKeyPrefix="context"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>

以下的章節是更加具體的配置。



當我們在 Context/Manager 屬性中配置了msm ,我們程式的session將會儲存在memcached或者membase中。如今你能夠做一些測試,關掉tomcat中的一個或者幾個,或者重新啟動當中的一個 memcached etc, have fun :-) !

1.2.4memcached-session-manager 配置屬性概覽。
className (必須的)
    這個設定是讓 de.javakaffee.web.msm.MemcachedBackupSessionManager 去管理memcached中session的儲存。

然而。在1.3.6 版本號以後在開發的過程中另一個de.javakaffee.web.msm.DummyMemcachedBackupSessionManager 能夠使用:他不過簡單的把session序列化在記憶體Map中。

當下一次請求到達的時候在反序列化這些資料,不過檢視反序列化的作用。

這樣的情況下我們的程式還是使用的session,memcached-session-manager(或者 DummyMemcachedBackupSessionManager)將不會有作用。session 的序列化個反序列化將會是同步的。這時的memcachedNodes和failoverNode不會建立一個memcached 端。所以序列化的資料不會儲存在memcached,這個時候Memcaches 也不是必須的。



memcachedNodes (必須的)

    這個屬性必須包括全部的 memcached nodes或者membase bucket uri(s) ,全部的tomcat都必須配置好。

每個節點用","切割比如對於一個節點來說<id>是可選的(e.g. memcachedNodes="n1:app01:11211,n2:app02:11211"),所以還能夠使用<host>:<port>來定義 (e.g. memcachedNodes="localhost:11211"),這樣sessionId就不會改變(沒有加入node id),這個選項在配置 membase+moxi是很實用的,全部的tomcat只認識一個"memcached"(實際上是moxi)
    memcached nodes:每個memcached node 定義方式為<id>:<host>:<port>.
 
    membase bucket uris (since 1.6.0): 使用membase 必須配置一個或者多個membase bucket uris, 比如 http://host1:8091/pools,http://host2:8091/pools. Bucketusername與password必須通過 username跟password 配置(以下還會講到)。 連線到 membase 須要一些支援memcached 協議的jar包. 須要把 jettison.jar 跟 netty.jar 放到 CATALINA_HOME/lib/.

failoverNodes (可選的, 在 non-sticky sessions 是不可用的)

    當有其它能夠使用的memcache 節點的時候使用。因此你應該列出那些跟你的tomcat在同一臺機器上的memcached node比如,host1上安裝了tomcat1(t1) memcached1(m1)。host2上安裝了tomcat1(t2) memcached1(m2)。你應該設定n1作為tomcat1的failover node.因此當memcached2(tomcat2 failoverNodes 設定為 n2)不能使用的時候tomcat1 的session 只儲存在memcached1. 這樣的設定當host1宕機的時候tomcat1的session 還是能夠繼續工作的。

    對於非粘性會話的會話是不依賴於一個單一的tomcat failoverNodes不得指定。

對於membase buckets 這個屬效能夠省略。



    多個memcached node 必須用空格“  ”或者逗號“,”分隔。

username (1.6.0以後, 可選的)

    membase bucket或者SASL 使用的username,假設memcachedNodes 包括一個(或多個)membase bucket uri,這就是bucket的名稱。

假設memcachedNodes 使用了username 給SASL授權。還須要一個memcached 協議的包。



password (1.6.0以後, 可選的)

    membase bucket 或者 SASL 授權密碼(假設沒有密碼默覺得空就好)。



memcachedProtocol (1.3以後, 可選的, 預設值 text)

    使用的memcached的協議, text或者binary.

sticky (1.4.0以後, 可選的, 預設值 true)

    設定 sticky Session 或者 non-sticky Session.

其它可選的配置選項。自己去查吧。

原文https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration

假設發現錯誤能夠聯絡我 [email protected]