2

在Tomcat的上下文中,是否可以在不啓用粘性會話的情況下進行會話複製?會話複製是否可以在沒有粘性會話的情況下進行?

我瞭解粘性會話的目的是讓客戶端在整個會話過程中「堅持」到1臺服務器。通過會話複製,客戶端與服務器的交互被複制到整個羣集(許多Web服務器)中。

在上述情況下,是否可以進行會話複製?即客戶端的會話通過Web服務器傳播並且與任何一個Web服務器的每個交互都被複制,從而允許無縫交互。

回答

2

AFAIK,tomcat集羣不支持非粘性會話。從tomcat docs

請確保您的負載均衡器配置爲粘滯會話 模式。

但是有一個解決方案(我創建的,所以你知道我有偏見:-))稱爲memcached-session-manager(MSM),也支持非粘性會話。 msm使用memcached(或任何說memcached協議的後端)作爲會話備份/存儲的後端。

在非粘性模式會話只存儲在分佈式緩存,並不再在Tomcat中,與非粘性會話的會話存儲必須是外部(以避免陳舊的數據)。

它還支持會話鎖定:與非粘性會話多個並行的請求可能會碰到不同的雄貓,並可能修改會話並行,使一些會話的變化可能會被別人得到覆蓋。會話鎖定允許並行請求同步到不同的tomcats。

msm home page主要描述了粘性會話方法(因爲它僅以此開始),有關可能搜索或詢問mailing list的非粘性會話的詳細信息。

詳細信息以及關於配置的例子可以在msm wiki (SetupAndConfiguration)找到。

只給你一個想法,對於複雜:你需要的是運行一個或多個memcached服務器(或某事物類似演講的memcached)和更新的Tomcat的context.xml是這樣的:

<Context> 
    ... 
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
    memcachedNodes="n1:host1.domain.com:11211,n2:host2.domain.com:11211" 
    sticky="false" 
    sessionBackupAsync="false" 
    lockingMode="auto" 
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" 
    /> 
</Context> 

您的負載均衡器並不需要特殊配置,所以一旦你在的地方這些東西你就可以開始測試應用程序。

+0

感謝您的解決方案。我讀過了Tomcat的FAQ,但奇怪的是,我能夠執行會話複製,而無需在Tomcat mod_jk上啓用粘性會話。不知道這是不是一個異常。 – Ted 2012-02-20 18:05:34

+0

會話複製本身獨立於負載均衡器配置工作。這個問題應該是,幾個tomcats然後共享相同的會話,導致陳舊的會話數據(假設你沒有在tomcat中配置jvmRoute)。例如:如果tomcat1持有會話A的版本1(來自第一個請求),並且tomcat2持有會話A的第2版(因爲它使用請求2更改它),並且第三個請求會再次轉到tomcat 1,第二個請求會丟失(會話版本1會被看到)。 *配置了* jvmRoute,您始終有一個故障轉移的情況...... – MartinGrotzke 2012-02-21 12:13:56

+0

感謝Grotzke的洞察力,爲我提出的問題提供了更多的清晰度。 :) – Ted 2012-02-21 12:37:33

0

這個話題在這裏,一個優秀的文章:

他們提到秦始皇兵馬俑產品具有簡單的教程在這裏:

兵馬俑在Tomcat上工作,但你必須注意檢查哪些兵馬俑是免費的,哪些是商業的。幾年前,他們的多餘商店被支付了,我不記得這個解決方案是一個獨立的產品。

+0

我曾閱讀過這篇文章,但它沒有解決我的問題,即會話複製是否發生在沒有粘性會話的情況下。對於Tomcat應用程序而言,如果不首先啓用粘性會話,則無法進行會話複製。 – Ted 2012-02-20 18:04:26

0

我已經找到了與這個問題相反的結論。對於我(Tomcat7)和OOTB選項的會話複製只有在沒有粘滯會話的情況下才能正常工作。打開日誌後,我發現啓用了JVMRoutes後,會話ID從A123456789變爲A123456789.01 - 後綴爲jvmroute。該會話已成功從羣集中的節點01複製到節點02,但使用相同的ID(A123456789.01)。當我將節點01從羣集中取出時,流量開始粘在節點02上 - 現在看起來會話A123456789.02當然不存在。 .01在那裏,但基本上處於空閒狀態直到它到期。如果我把另一個服務器和會話複製,然後取下02,我甚至會發現很奇怪的行爲,因爲會話從停止的地方被拾取。

對於我來說,迄今爲止,沒有粘性會話的會話複製(只是集羣中的節點之間的常規RR)是唯一有效的。

相關問題