msmベースtomcatでのセッション共有

15163 ワード

前提条件
  • システムcentos 7 1908 mini
  • を使用
  • nginx逆エージェントの実装:192.168.38.30(エージェントtomcat 1とtomcat 2)
  • tomcatサーバ1:192.168.38.60
  • を実現
  • tomcatサーバ2:192.168.38.61
  • を実現
  • memcacheサーバ1:192.168.38.78
  • を実現
  • memcacheサーバ2:192.168.38.79
  • を実装
  • redisサーバの実装:192.168.38.70
  • redisサーバの実装:192.168.38.71
  • 時間同期
  • ファイアウォールを閉じ、selinux
  • インプリメンテーション
    1.tomcatインストール関連jarパッケージ
  • 現在のプロジェクトはGithub、https://github.com/magro/memcached-session-manager
  • に管理されている.
          3 
        Tomcat Session   ,Tomcat    
            memcached-session-manager-2.3.2.jar
            memcached-session-manager-tc8-2.3.2.jar
    
        Session      、     
            kyro(    )
    
           
            memcached(spymemcached.jar)
            Redis(jedis.jar)
    
         ,    webapp WEB-INF/lib/ 
        asm-5.2.jar
        kryo-3.0.3.jar
        kryo-serializers-0.45.jar
        memcached-session-manager-2.3.2.jar
        memcached-session-manager-tc8-2.3.2.jar
        minlog-1.3.1.jar
        msm-kryo-serializer-2.3.2.jar
        objenesis-2.6.jar
        reflectasm-1.11.9.jar
        spymemcached-2.12.3.jar
    

    2.stickyモードによるセッション共有
    2.1原理
    要求が終了すると、Tomcatのセッションはmemcachedバックアップに送信されます.すなわち、Tomcatセッションはメインセッションであり、memcachedセッションはバックアップセッションであり、memcachedを使用することはセッションをバックアップすることに相当する.
    Sessionを検索するとTomcatは自分のメモリのSessionを優先的に使用し、TomcatはjvmRouteで自分のSessionではないことを発見し、memcachedからそのSessionを見つけ、本機Sessionを更新し、完了後にmemcachedの更新を要求する.
    2.2配置方式
    <t1>  <t2>
    ·   \   / ·
    ·    XX   ·
    ·   /   \ ·   
    <m1>  <m2>
    

    2.3 memcache実装
    2.3.1配置
  • tomcatサーバで$CATALINA_HOME/conf/context.xml
  • を変更
    
    # tomcat1  
    
    <Context>
    ...
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:192.168.38.78:11211,n2:192.168.38.79:11211"
    failoverNodes="n1"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
    </Context>
    
    # tomcat2  
    
    <Context>
    ...
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:192.168.38.78:11211,n2:192.168.38.79:11211"
    failoverNodes="n2"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
    </Context>
    
    # memcached    ;n1、n2    ,      。
    # failoverNodes      ,n1     ,n2      
    #    Tomcat n1  n2,     n1,     n2。
    
    

    2.3.2テスト
  • 構成が成功すればlogs/catalina.outには次の内容が表示されます
  •    [192.168.38.60-startStop-1]
    de.javakaffee.web.msm.MemcachedSessionService.startInternal --------
    - finished initialization:
    - sticky: true
    - operation timeout: 1000
    - node ids: [n2]
    - failover node ids: [n1]
    - storage key prefix: null
    - locking mode: null (expiration: 5s)
    
  • リバースエージェントにアクセスし、効果
  • を表示します.
    http://192.168.38.30
    
    On tomcats
    192.168.38.78:8080
    SessionID = 2A19B1EB6D9649C9FED3E7277FDFD470-n2.Tomcat1
    Wed Jun 26 16:32:11 CST 2019
    On tomcats
    192.168.38.79:8080
    SessionID = 2A19B1EB6D9649C9FED3E7277FDFD470-n1.Tomcat2
    Wed Jun 26 16:32:36 CST 2019
    
  • python結果
  • を表示
    import memcache # pip install python-memcached
    
    mc = memcache.Client(['192.168.38.78:11211','192.168.38.79:11211'], debug=True)
    
    stats = mc.get_stats()[0]
    print(stats)
    for k,v in stats[1].items():
        print(k, v)
    
    print('-' * 30)
    #     key
    print(mc.get_stats('items')) # stats items    items:5:number 1
    print('-' * 30)
    print(mc.get_stats('cachedump 5 0')) # stats cachedump 5 0 # 5    items      ;0    
    

    2.4 redis実装
  • tomcatサーバで$CATALINA_HOME/conf/context.xml
  • を変更
    
    # tomcat1  
    
    <Context>
    ...
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:redis://192.168.38.70:6379,n2:redis://192.168.38.71:6379"
    failoverNodes="n1"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
    </Context>
    
    # tomcat2  
    
    <Context>
    ...
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:redis://192.168.38.70:6379,n2:redis://192.168.38.71:6379"
    failoverNodes="n2"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
    </Context>
    
    

    3.non-stickyモードに基づいてセッション共有を実現
    3.1 memcache実装
  • tomcatサーバで$CATALINA_HOME/conf/context.xml
  • を変更
    
    # tomcat1  
    
    <Context>
    ...
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:192.168.38.78:11211,n2:192.168.38.79:11211"
    sticky="false"
    sessionBackupAsync="false"
    lockingMode="uriPattern:/path1|/path2"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
    </Context>
    
    # tomcat2  
    
    <Context>
    ...
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:192.168.38.78:11211,n2:192.168.38.79:11211"
    sticky="false"
    sessionBackupAsync="false"
    lockingMode="uriPattern:/path1|/path2"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
    </Context>
    
    

    3.1 redis実装
  • tomcatサーバで$CATALINA_HOME/conf/context.xml
  • を変更
    
    # tomcat1  
    
    <Context>
    ...
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:redis://192.168.38.70:6379,n2:redis://192.168.38.71:6379"
    sticky="false"
    sessionBackupAsync="false"
    lockingMode="uriPattern:/path1|/path2"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
    </Context>
    
    # tomcat2  
    
    <Context>
    ...
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:redis://192.168.38.70:6379,n2:redis://192.168.38.71:6379"
    sticky="false"
    sessionBackupAsync="false"
    lockingMode="uriPattern:/path1|/path2"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
    </Context>