Memcached Session Manager分散セッション


これはmemcachedをtomcat session managerとして使用するオープンソースプロジェクトであり、大規模なクラスタを導入する際、tomcatが持参するsession replication技術は効率に影響し、統一的なsessionストレージ戦略を使用するとクラスタ規模の拡張に有利であり、session managerを置き換える方法はプログラムコードを変更せずに実現することができ、良い.次の機能があります.
  • Tomcat 6およびTomcat 7
  • をサポート
  • はstickyまたはnon-stickyセッションの処理をサポートする
  • 単点障害なし
  • tomcatフェイルオーバ
  • の処理をサポート
  • memcachedフェイルオーバの処理をサポート
  • ダイヤル可能なプラグインを提供するSessionシリーズ化
  • は、より迅速な応答時間
  • を達成するために、非同期ストレージセッションを可能にする.
  • Sessionsは、本当に変更された場合にのみmemcached
  • に送信されます.
  • JMXによる
  • の監視と管理が可能
    1.msmおよびその依存パッケージのダウンロード
    http://code.google.com/p/memcached-session-manager/downloads/list
    http://spymemcached.googlecode.com/files/
    ダウンロード
    memcached-session-manager-1.4.1.jar
    msm-javolution-serializer-1.4.1.jar
    javolution-5.4.3.1.jar
    memcached-2.5.JAr(spymemcachedからダウンロード)
    2.パッケージを$TOMCAT_に入れるHOME/libディレクトリの下
    3.修正$TOMCAT_HOME/conf/server.xml
    追加
     
    <Context docBase="E:/projects/test_msm/WebRoot"  path= ""  reloadable= "true"  >   
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"    
        memcachedNodes="n1:localhost:11211"    
        requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"    
        sessionBackupAsync="false"    
        sessionBackupTimeout="100"    
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"    
        copyCollectionsForSerialization="false"    
        />  
    
    

     
    docBaseをあなたのWEBディレクトリに置き換えて、修正した後に2つのTOMCATを再起動すればいい、この時すでにSESSIONの共有問題を解決した.
    テストクラス
    public class Test extends HttpServlet{
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    		HttpSession sesion = request.getSession(false);
    		if (sesion == null) {
    			request.getSession();
    			System.out.println("session is null");
    		}else {
    			Object id =  sesion.getAttribute("id");
    			Object test =  sesion.getAttribute("test");
    			if (id == null) {
    				sesion.setAttribute("id", request.getRemoteAddr());
    			}
    			if (test == null) {
    				sesion.setAttribute("test", "test");
    			}
    			
    			System.out.println("test:id " + sesion.getAttribute("id"));
    			System.out.println("test:test " + sesion.getAttribute("test"));
    		}
    	}
    	
    	
    }

     
     
    いずれかのtomcatにアクセスするとセッションが作成され、別のtomcatにアクセスすると、対応するセッションが作成されないことがわかり、2つのtomcachedがmemcachedによってセッション制御されていることが証明されました
    でもmemcached
     
    memcachedはLRUアルゴリズムを使用してキャッシュを処理します.しかし、欠点は、グローバルではなくslabに基づいていることです.これにより、実行時間が経過した後、最初にアクセスしたユーザーのSESSIONが不明に失われ、前の秒に操作があったとしても発見されます.
    memcachedのメモリ割り当てアルゴリズムを見てください
      http://wenku.baidu.com/view/90a6b19851e79b89680226d4.html
     
    解決可能な解決策はmemcachedbを使用して検証することです.