全部產品
Search
文件中心

ApsaraDB for Memcache:緩衝 Tomcat session 變數

更新時間:Jul 06, 2024

做 Tomcat 叢集的目的是為了提供更高的負載能力,把訪問均攤到不同的伺服器上。以下圖的結構架構作為例。

阿里雲叢集一般分為兩種模式,一種是完全集中 SESSION,各個叢集點保持一致;還有一種就是基於一次會話指定某一個叢集中節點提供服務。

  1. ECS 安裝 TOMCAT 和 JDK。

    本例中用的是TOMCAT 7 以及 JDK 7。建議 TOMCAT 先下載到本地,配置好了再上傳到 ECS。

  2. TOMCAT 增加 memcached 支援的 lib 包。

    配置 memcached-session-manager,請參考該文檔

    本步驟主要下載一些 lib,下載地址在上面的文檔中有給出。把下載到的 lib 放到 Tomcat/lib 目錄裡面, 如下圖所示。(注意:每個檔案的首碼“msm-”本來是沒有的,是為了方便管理加的。)

    有了這些包之後就可以配置 TOMCAT 串連到 Memcache。

  3. TOMCAT 同步 Session 到 Memcache。

    該步驟要做 TOMCAT 具體配置了,有兩種配置模式:STICKY 和 NON-STICKY。

    • STICKY:負載平衡會根據使用者會話,每次都分配到同一個叢集節點上。使用者每次擷取會話資料都是從 TOMCAT 裡面取得,TOMCAT 會備份一個 SESSION 到 Memcache,這樣可以保持最高效地擷取 SESSION。

    • NON-STICKY:負載平衡不會管使用者會話,而是按每次串連分別分發的方式,會話都保持在 Memcache 上,每次讀寫都在 Memcache 上。由於會遠端存取資料,所以效率會低一些,但是這種卻是最符合叢集或集中緩衝預期效果的。

      在 /Tomcat/conf/context.xml 中編輯串連到 Memcache 的配置,在 <Context> 元素下增加下述的配置描述即可。下面分別是 TOMCAT 的兩種配置模式:

      STICKY 模式

      <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
        memcachedNodes="Memcache 的地址:11211"  
        username="Memcache 執行個體名" 
        password="Memcache 密碼" 
        memcachedProtocol="binary" 
        sticky="true"  
        sessionBackupAsync="true"    
        sessionBackupTimeout="1000" 
        requestUriIgnorePattern=".*\.(gif|jpg|jpeg|png|bmp|swf|js|css|html|htm|xml|json)$" 
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" ></Manager>

      NON-STICKY 模式

      <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
        memcachedNodes="Memcache 的地址:11211"  
        username="Memcache 執行個體名" 
        password="Memcache 密碼" 
        memcachedProtocol="binary" 
        sticky="false"  
        lockingMode="auto"  
        sessionBackupAsync="false"    
        sessionBackupTimeout="1000" 
        requestUriIgnorePattern=".*\.(gif|jpg|jpeg|png|bmp|swf|js|css|html|htm|xml|json)$" 
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />

      注意:必須要有memcachedProtocol="binary",因為 Tomcat memcached 外掛程式模式這個屬性值是 text,而阿里雲支援的是 binary 模式的資料。

  4. 修改 TOMCAT 的 JVM 設定以及 NIO。

    1. 在 /Tomcat/bin/ 目錄下修改 JVM 設定,增加 setenv.sh 檔案,寫定要最佳化的配置。

      CATALINA_OPTS="-server -Xms3072m -Xmx3072m -Xmn1024m -XX:PermSize=96m -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=50 -XX:+CMSPermGenSweepingEnabled"
    2. 在 /Tomcat/conf/context.xml 檔案中修改 NIO 設定。

      注釋掉原有的 Connector=8080 的定義,增加如下的配置定義,使用 NIO 方式。

       <Connector port="8080"  
               protocol="org.apache.coyote.http11.Http11NioProtocol"   
               connectionTimeout="20000"  
               URIEncoding="UTF-8"  
               useBodyEncodingForURI="true"  
               enableLookups="false"  
               redirectPort="8443" />
  5. 建立一個檢查 SESSION 的 JSP。

    建立一個 JSP 檔案到 Tomcat/webapps/ROOT 目錄下。

     <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> 
     <% 
     String path = request.getContextPath(); 
     String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
     %> 
     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
     <html> 
       <head> 
         <base href="<%=basePath%>">   
         <title>My JSP 'session.jsp' starting page</title> 
         <meta http-equiv="pragma" content="no-cache"> 
         <meta http-equiv="cache-control" content="no-cache"> 
         <meta http-equiv="expires" content="0">     
         <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
         <meta http-equiv="description" content="This is my page"> 
         <!-- 
         <link rel="stylesheet" type="text/css" href="styles.css"> 
         --> 
       </head> 
       <body> 
    
         <h1> 
         <% 
          out.println("This is (TOMCAT1), SESSION ID:" + session.getId()); 
         %> 
         </h1> 
       </body> 
     </html>
  6. 上傳配置好的 TOMCAT 到 ECS。

    上傳後啟動,就可以看見你的 TOMCAT 了:<伺服器位址>:8080/session.jsp。 如看見的是如下字樣,說明 TOMCAT 串連 Memcache 成功了。

     This is (TOMCAT1), SESSION ID:CAC189E5ABA13FFE29FCB1697F80182B-OCS

注意: 在網站負載較低情況下,能正常使用 Memcache 來緩衝 tomcat session。如果負載較高,即發現 session 頻繁失效,需要升級 Memcache 規格才能正常使用。