如何利用OCS緩存TomcatSession全局變量(轉)

轉:css

首先很是感謝 阿里雲給咱們提供了一個如此省事的平臺。 
咱們公司是一家物流公司,主要提供運輸和倉儲的服務。咱們如今正在把咱們的系統往阿里雲遷移。固然,還在遷移過程當中,因此還有不少是沒辦法如今說得太清楚。但鑑於現有估計用阿里雲的公司或我的愈來愈多,確實沒有一個在阿里雲搭建基於ECS的Tomcat集羣的教程。我這就給大夥獻醜了。這是個入門教程,同時其中也存在問題,還望你們指正。 
首先,咱們明確目標,作Tomcat集羣的目的是爲了提供更高的負載能力,把訪問均攤到不一樣的服務器上。爲此咱們準備的配置清單是: 
SLB x 1    ECS x 2    OCS x 1    RDS x 1 
 
 
 
 
咱們系統使用的軟件也是應用廠商提供,不像阿里的技術那麼牛逼,因此其內部仍是使用瞭如Session等之類的標準技術。而咱們對於集羣的定義就是能夠保持Session,確保用戶登陸後正常使用。 
在阿里雲或者是其餘方式玩集羣通常也都分爲兩種模式,一種是徹底集中SESSION,各個集羣點保持一致;還有一種就是基於一次會話指定某一個集羣中節點提供服務。這個可能沒說太明白,那麼請參考SLB的資料,SLB其中有個是否保存會話(這個就對應到咱們TOMCAT裏面的配置模式是採用STICKY or NON-STICKY模式),本分享會說到兩種模式,而且也會討論關於咱們在使用中發現的問題(這不會是我司部署的最終版本,由於咱們天天都還在不斷調整)。 
 
 
首先,ECS要安裝TOMCAT和JDK。這個很簡單,網上不少教程。 我這就不介紹了。咱們用的是TOMCAT7 以及 JDK7。建議TOMCAT先下載到本身電腦,配置好了再上傳到ECS。  
 
 
Step.1 TOMCAT增長memcached支持的lib包 
咱們須要memcached-session-manager,http://code.google.com/p/memcached-session-manager/。其中文檔說得比較明確,參考其中去配置就好。 
那麼在本步驟中,咱們主要是下載一些lib,在上面連接中的文檔中有給出。本身找下啦。把下載到的lib放到Tomcat/lib目錄裏面(注意每一個文件前綴的「msm-」這個原本是沒有的,是我爲了方便管理加的),有了這些包以後就能夠配置TOMCAT鏈接到OCS啦: 
 
 
 
 
Step.2 TOMCAT同步Session到OCS 
這個步驟就是具體配置了。前面說到有兩種模式:STICKY or NON-STICKY。 
STICKY:負載均衡會根據用戶會話,每次都分配到同一個集羣節點上。用戶每次獲取會話數據都是從TOMCAT裏面取得,TOMCAT會備份一個SESSION到OCS。 這樣能夠保持獲取SESSION的最高效。 
NON-STICKY:負載均衡不會管用戶會話,而是按每次鏈接分別分發的方式,會話都保持在OCS上,每次讀寫都在OCS上。因爲會遠程訪問數據,因此效率會低一些,可是這種倒是最符合集羣或集中緩存預期效果的。 
關於鏈接到OCS的配置,都是在/Tomcat/conf/context.xml中編輯,在<Context>元素下增長下述的配置描述便可。 
下面咱們分別說兩種的配置(只能有一種模式,千萬別寫兩個上去了): 
STICKY模式 
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
        memcachedNodes="OCS的地址:11211"  
        username="OCS實例名" 
        password="OCS密碼" 
        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" />
 
 
NON-STICKY模式 
     <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
        memcachedNodes="OCS的地址:11211"  
        username="OCS實例名" 
        password="OCS密碼" 
        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" />
 
 
其實配置是否是很簡單吶,總之裏面配置跟鏈接Memcached是同樣的,因此我對阿里的這種設計很是之讚揚。 
其中就注意一點,必定要有memcachedProtocol="binary",不然是用不了的,由於Tomcat memcached插件模式這個屬性值是text,而阿里支持的是binary模式的數據,因此務必務必要注意。 
 
 
Step.3 修改TOMCAT的JVM設置以及NIO(這個步驟跟OCS無關) 
修改JVM設置在/Tomcat/bin/目錄下,增長setenv.sh文件,寫定要優化的配置。 
我配置的以下,這個JVM參數有點問題,GC回收跟過山車同樣。還須要繼續改,因此不建議參考。若是有高人還望指點。ECS配置是雙核/4G配置,用的CentOS 6.5 x64。 
CATALINA_OPTS="-server -Xms3072m -Xmx3072m -Xmn1024m -Xss256K -XX:PermSize=128m -XX:MaxPermSize=128m -XX:SurvivorRatio=16 -XX:NewSize=1024m -XX:MaxNewSize=1024m"
 
 
修改NIO設置在/Tomcat/conf/context.xml 
註釋掉原有的Connector=8080的定義,增長以下的配置定義,使用NIO方式 
<Connector port="8080"  
               protocol="org.apache.coyote.http11.Http11NioProtocol"   
               connectionTimeout="20000"  
               URIEncoding="UTF-8"  
               useBodyEncodingForURI="true"  
               enableLookups="false"  
               redirectPort="8443" />
 
 
Step.4 建立一個檢查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>
 
 
Step.5 上傳你配置好的TOMCAT到ECS 
上傳後啓動,正常這個時候你就看見你的TOMCAT了。http://yourserver:8080/session.jsp,若是你看見的是以下字樣,說明你的TOMCAT鏈接OCS成功了。 
「 
 
This is (TOMCAT1), SESSION ID:CAC189E5ABA13FFE29FCB1697F80182B-OCS 
 
 
」 
 
 
若是你用的是SLB,兩個ECS,而且使用的NON-STICKY模式,經過負載後你會看到內部的Server在變,可是SESSION不變。 
 
 
接下來,說問題 
使用PTS壓測session.jsp,100用戶,TOMCAT配置NON-STICKY模式下。此刻使用瀏覽器訪問session.jsp會出現SESSION_ID每次看都不同的狀況。沒有執行壓測的時候就正常的,也就是在大併發狀況下OCS會出奇怪的問題麼? 
如今爲了防止這種狀況出現,咱們已經換成了STICKY模式。即經過SLB分發會話到同一個節點機器執行服務,OCS只是作一個SESSION備份,防止節點宕機,另外節點能夠從新獲取到繼續提供服務。 
就是如此了,還請OCS團隊給個答覆或者是建議。或者有高人能指點下,怎麼弄纔是最好的辦法呢? 
 
[ 此帖被Happy_Tian在2014-11-07 13:06從新編輯 ]
相關文章
相關標籤/搜索