天天看點

Tomcat叢集使用Memcached實作Session共享

當用戶端通路Tomcat叢集時,所有的請求将被Nginx攔截,由Nginx做負載均衡後轉發給背景真實Tomcat。按照這個流程就可能出現一個問題,當使用者進行頁面重新整理或跳轉時,每次請求将被轉發給不同的Tomcat處理,這樣就會造成Session的不同步。舉個簡單的栗子,例如當使用者往購物車添加商品時,興高采烈地準備買單了,當他跳轉到付款頁面卻發現購物車被清空了,這就是Session丢失的典型栗子。是以,我們需要為叢集環境做Session同步。

在伺服器叢集的環境下,共享Session的方案主要分為4類:

1.使用者端本地儲存Cookie

在這種方式下,Web應用會将使用者狀态寫到Cookie并儲存到使用者本地。但是,如果使用者使用的浏覽器不支援Cookie或者禁用Cookie,該方案将會失效。并且Cookie能儲存的資料是有大小限制的,而且資料暴露給使用者本地浏覽器,存在安全性問題。

2.采用資料庫方式儲存Session

相對本地Cookie方式,将使用者資訊儲存到服務端資料庫解決了資料安全性問題。然而,這麼做是有代價的,應用中所有對Session的通路都必須經過資料庫,加大資料庫負擔,導緻系統整體性能降低。

3.代理伺服器

通過代理伺服器實作Session共享的思路非常簡單,就是Session資料在哪台Tomcat,之後的請求都轉發到這台Tomcat。例如Nginx,具體實作隻需要修改轉發規則為<code>ip_hash</code>即可。但這時候可能存在某一時間段大量使用者始終通路某台Tomcat的負載很大,也就失去了負載均衡的意義。

4.搭建緩存伺服器

這種方案也是應用最普遍的方案,通過搭建緩存伺服器,并使用第三方工具接管Tomcat對Session的管理。

行Session管理,使用的緩存伺服器是Memcached,并使用memcached-session-manager管理Session。memcached-session-manager(以下簡稱msm)的使用方法很簡單,隻需要根據Tomcat版本和序列化方式下載下傳相應jar包,拷貝至Tomcat的lib目錄下,最後修改Tomcat配置檔案,更換Session管理子產品即可。

Nginx+Tomcat+Memcached實作tomcat叢集和session共享

過程:clients—&gt;172.16.253.11--&gt;(tomcatA,tomcatB)

負載均衡節點:172.16.253.11,192.168.159.11

tomcatA節點:172.16.253.13

tomcatB節點:172.16.253.14

memcache節點:172.16.253.12

如圖所示:

一、Tomcat配置:

Tomcat作為應用程式伺服器,主要作用是處理jsp檔案,是以需要提供一個用于測試的檔案index.jsp以及對應版本的.jar包。主要是memcached-session-manager相關的jar包,和用于将前端的使用者的cookie資訊序列化成”鍵-值”格式的工具。

①下載下傳:jar檔案至各tomcat節點的tomcat安裝目錄下的lib目錄中

        ls /usr/share/tomcat/lib/

        memcached-session-manager- 1.8.2.jar

memcached-session-manager-tc7- 1.8.2.jar

spymemcached- 2.10.2 .jar

msm-javolution-serializer- 1.8.2.jar

javolution- 5.5.1.jar

如下:

②安裝tomcat及相關的服務包

yum install java-1.7.0-openjdk-devel.x86_64   #  安裝jdk

yum install  tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp

③分别在兩個tomcat上的某host上定義一個用于測試的context容器,并在其中建立一個會話管理器,如下所示:

            vim /etc/tomcat/server.xml 

           &lt;Host name="node1.com" appBase="/data/webapps" autoDeploy="true"&gt;

           &lt;Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true"&gt;

              &lt;Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

                memcachedNodes="n1:172.16.253.12:11211"

                failoverNodes="n1"

                requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

                transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"

              /&gt;

             &lt;/Context&gt;

               &lt;/Host&gt;

④分别為兩個context提供測試頁面:

TomcatA:

mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}

vim /usr/local/tomcat/webapps/test/index.jsp

&lt;%@ page language="java" %&gt;

&lt;html&gt;

  &lt;head&gt;&lt;title&gt;TomcatA&lt;/title&gt;&lt;/head&gt;

  &lt;body&gt;

    &lt;h1&gt;&lt;font color="red"&gt;TomcatA.magedu.com&lt;/font&gt;&lt;/h1&gt;

    &lt;table align="centre" border="1"&gt;

      &lt;tr&gt;

        &lt;td&gt;Session ID&lt;/td&gt;

    &lt;% session.setAttribute("magedu.com","magedu.com"); %&gt;

        &lt;td&gt;&lt;%= session.getId() %&gt;&lt;/td&gt;

      &lt;/tr&gt;

        &lt;td&gt;Created on&lt;/td&gt;

        &lt;td&gt;&lt;%= session.getCreationTime() %&gt;&lt;/td&gt;

     &lt;/tr&gt;

    &lt;/table&gt;

  &lt;/body&gt;

&lt;/html&gt;

TomcatB:

  &lt;head&gt;&lt;title&gt;TomcatB&lt;/title&gt;&lt;/head&gt;

    &lt;h1&gt;&lt;font color="blue"&gt;TomcatB.magedu.com&lt;/font&gt;&lt;/h1&gt;

測試目錄的結構如下:

二、Nginx配置:

對于nginx來說,這本實驗中隻是起了排程的作用,即反向代理的作用,并沒有實作動靜分離,路徑重寫等操作,這裡主要是将用戶端的請求排程至後端應用程式伺服器Tomcat。集體配置如下:

vim  /etc/nginx/nginx.conf

<code>http {</code>

<code>    </code><code>upstream centos {                      </code><code># 定義伺服器叢集</code>

<code>            </code><code>server 172.16.253.13:8080;</code>

<code>            </code><code>server 172.16.253.14:8080;</code>

<code>    </code><code>}</code>

<code>    </code><code>server {</code>

<code>        </code><code>listen       80 ;</code>

<code>        </code><code>listen       [::]:80 default_server;</code>

<code>        </code><code>server_name  _;</code>

<code>        </code><code>root         </code><code>/usr/share/nginx/html</code><code>;</code>

<code>        </code><code>include </code><code>/etc/nginx/default</code><code>.d/*.conf;</code>

<code>        </code><code>location / {</code>

<code>                </code><code>proxy_pass  http://172.16.253.11;     </code><code>#  将請求代理至後端Tomcat伺服器</code>

<code>        </code><code>}</code>

<code>        </code><code>...</code>

<code>}</code>

systemctl start nginx

<code></code>

三、Memcached配置  

對于memcached伺服器的配置其實很簡單,由于memcached自身不能夠主動存儲cookie資訊,隻需要在memcached伺服器上安裝memcached服務就行,至于對資料進行序列化則是由前面的伺服器來實作的。

yum install memcached

systemctl start memcached         # 啟動服務

ss -tnl | grep 1121               # 檢查服務是否正常啟動

四、測試

http://172.16.253.11/test

我們在用戶端進行測試。在浏覽器中輸入nginx的位址:重新整理你會看到,通路的内容發生了改變,但是cookie值并沒有發生改變。

本文轉自 優果馥思 51CTO部落格,原文連結:http://blog.51cto.com/youguofusi/2053919