基于msm实现tomcat下session共享

前提

  • 系统使用centos7 1908 mini

  • 实现nginx反向代理: 192.168.38.30 (代理tomcat1与tomcat2)

  • 实现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模式实现session共享

2.1 原理

当请求结束时Tomcat的session会送给memcached备份。即Tomcat session为主session,memcached session为备session,使用memcached相当于备份了一份Session

查询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模式实现session共享

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>

你可能感兴趣的:(Linux,DataBase)