Tomcat8的kryo序列化方式session共享

1.软件版本说明:

1)asm-5.0.3.jar
2)kryo-3.0.3.jar
3)kryo-serializers-0.37.jar
4)memcached-session-manager-1.9.5.jar
5)memcached-session-manager-tc8-1.9.5.jar
6)minlog-1.3.0.jar
7)msm-kryo-serializer-1.9.5.jar
8)objenesis-2.1.jar
9)reflectasm-1.10.1.jar
10)spymemcached-2.12.0.jar

11)apache-tomcat-8.5.31

2.tomcat程序文件修改

vi $TOMCAT_HOME/conf/context.xml

在<Context>和</Context>之间添加

  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:{memcache/magent ip}:{port}"
    sticky="false"
    sessionBackupAsync="false"
    lockingMode="auto"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    copyCollectionsForSerialization="true"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
3.序列化tomcat配置中有关Manager各参数说明:
a)className
这个是必选项。可配置为:
de.javakaffee.web.msm.MemcachedBackupSessionManager
或者
de.javakaffee.web.msm.DummyMemcachedBackupSessionManager
其中DummyMemcachedBackupSessionManager可用于测试环境,不需要真实存在memcached
  
b)memcachedNodes
这个是必选项。memcached的节点信息(多个节点使用空格或逗号分开),格式如:
memcachedNodes="n1:app01:11211,n2:app02:11211"。
  
c)failoverNodes
这个是可选项,不能使用在non-sticky sessions模式。
故障转移配置节点,多个使用空格或逗号分开,配置某个节点为备份节点,当其他节点都不可用时才会存储到备份节点,官方建议配置为和tomcat同服务器的节点。
  
理由如下:
假如有两台服务器m1,m2,其中m1部署tomcat和memcached节点n1,m2部署memcached节点n2。
如果配置tomcat的failoverNodes值为n2或者不配置,则当服务器m1挂掉后n1和tomcat中保存的session会丢失,而n2中未保存或者只保存了部分session,这就造成
部分用户状态丢失;
如果配置tomcat的failoverNodes值为n1,则当m1挂掉后因为n2中保存了所有的session,所以重启tomcat的时候用户状态不会丢失。
为什么n2中保存了所有的session? 因为failoverNodes配置的值是n1,只有当n2节点不可用时才会把session存储到n1,所以这个时候n1中是没有保存任何session的。
 
d)lockingMode
这个是可选项,默认none,只对non-sticky有效。
当配置成node时,表示从来不加锁
当配置成all时,表示当请求时对Session锁定,直到请求结束
当配置成auto时,表示对只读的request不加锁,对非只读的request加锁
 
e)requestUriIgnorePattern
这个是可选项,制定忽略那些请求的session操作,一般制定静态资源如css,js一类的。
 
f)sessionBackupAsync
这个是可选项,默认true,是否异步的方式存储到memcached。
 
j)sessionBackupTimeout
这个是可选项,默认100毫秒,异步存储session的超时时间。即web工程对session的修改更新到memcache上的时间。
 
h)copyCollectionsForSerialization
这个是可选项,默认false。
 
i)transcoderFactoryClass
这个是可选项,默认值de.javakaffee.web.msm.JavaSerializationTranscoderFactory,制定序列化和反序列化数据到memcached的工厂类。
 
j)operationTimeout
这个是可选项,默认1000毫秒,memcached的操作超时时间。
 
k)backupThreadCount
这个是可选项,默认是cpu核心数,异步存储session的线程数。
 
l)storageKeyPrefix
这个是可选项,默认值webappVersion,存储到memcached的前缀,主要是为了区分多个webapp共享session的情况。可选值:静态字符串、host、context、webappVersion,多个使用逗号分割。 、
 
m)sessionAttributeFilter

这个是可选项,通过正则表达式确定那些session中的属性应该被存储到memcached。例子如:sessionAttributeFilter="^(userName|sessionHistory)$"。

4.stick和non-stick的工作流程:
Sticky 模式:
tomcat session为主session,memcached为备session。Request请求到来时,从memcached加载备session到tomcat (仅当tomcat jvmroute发生变化时,否则直接取tomcat session);Request请求结束时,将tomcat session更新至memcached,以达到主备同步之目的。
 
Non-Sticky模式:
tomcat session为中转session,memcached1为主session,memcached2为备session。Request请求到来时,从memcached 2加载备session到tomcat,(当容器中还是没有session则从memcached1加载主session到tomcat, 这种情况是只有一个memcached节点,或者有memcached1出错时), Request请求结束时,将tomcat session更新至主memcached1和备memcached2,并且清除tomcat session 。以达到主备同步之目的。 多台tomcat集群时 需要选择Non-Sticky模式,即sticky="false"

猜你喜欢

转载自blog.csdn.net/mario_hao/article/details/80384649