nginx+tomcat7+memcache集群,使用memcached-session-manager实现session共享方案


tomcat7的context.xml中(也可以在server.xml中,但是如果在server.xml中配置,据说maven部署时可能导致失败)

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
   memcachedNodes="n1:192.168.1.35:11211,n2:192.168.1.35:11212"
   sticky="false"
   lockingMode="auto"
   或者只锁定某些连接(path1和path2是你的uri中需要加锁的路径)lockingMode="uriPattern:/path1|/path2"
   requestUriIgnorePattern= ".*\.(ico|png|gif|jpg|css|js)$"
   sessionBackupAsync= "false"
   sessionBackupTimeout= "1000"
   或者异步写session(注意配置线程数那项的数值需要加引号)sessionBackupAsync= "true" backupThreadCount="1"
   copyCollectionsForSerialization="true"
   transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
   customConverter="de.javakaffee.web.msm.serializer.kryo.HibernateCollectionsSerializerFactory,com.eling.serializer.CustomKryoRegistration"
/>



注意,多台tomcat所在系统的时间必须一致!!!

注意,linux的地址解析(nameserver)需要配置。若未配置,启动tomcat看不出错误,却导致未配置网关的那台linux中的tomcat无法获取memcache存储的session信息,现象就是自动生成新jsessionid返回给浏览器。将nameserver配置到网卡文件里看,防止每次重启都需要重新设置!

注意,如使用hibernate,则de.javakaffee.web.msm.serializer.kryo.HibernateCollectionsSerializerFactory必须配置到customConverter中,多个类可通过逗号分隔!!(如样例中com.eling.serializer.CustomKryoRegistration是我自己的转换器)
该类可防止hibernate的lazy加载等机制造成序列化异常(现象是启动时可能抛异常,若有问题,请沿着Caused by找到底会发现lazy加载未初始化异常)
其他持久化工具尚未测过(如Mybatis)是否添加指定的customConverter。


注意,本方案采用kryo序列化方式(有人单独测试过kryo序列化效率,并发情况下优于其他几种序列方式),和msm一起,依赖的所有jar包括(注意版本,不要随意换大版本,可能不兼容,启动tomcat报找不到类的异常,注意观察即可发现哪些包内的方法找不到哪些包中类。如有版本更新请自行查找。):

memcached-session-manager-1.8.3.jar
memcached-session-manager-tc7-1.8.3.jar
asm-3.3.1.jar
kryo-1.05.jar
kryo-serializers-0.11.jar
minlog-1.2.jar
msm-kryo-serializer-1.8.3.jar
reflectasm-1.11.0.jar
spymemcached-2.12.0.jar

还有其他序列化方案,现截取一段msm原文介绍:

Add memcached-session-manager jars to tomcat

Independent of the chosen serialization strategy you always need the memcached-session-manager-${version}.jar and either memcached-session-manager-tc6-${version}.jar for tomcat6, memcached-session-manager-tc7-${version}.jar for tomcat7 (attention: tomcat 7.0.23+) ormemcached-session-manager-tc8-${version}.jar for tomcat8.

If you're using memcached, you also need the spymemcached-2.11.1.jar.

If you're using couchbase, you need additionally these jars: couchbase-client-1.4.0.jar, jettison-1.3.jar, commons-codec-1.5.jar, httpcore-4.3.jar,httpcore-nio-4.3.jar, netty-3.5.5.Final.jar.

Please download the appropriate jars and put them in $CATALINA_HOME/lib/.

Add custom serializers to your webapp (optional)

If you want to use java's built in serialization nothing more has to be done. If you want to use a custom serialization strategy (e.g. because ofbetter performance) this has to be deployed with your webapp so that they're available in WEB-INF/lib/.

As msm is available in maven central (under groupId de.javakaffee.msm) you can just pull it in using the dependency management of your build system. With maven you can use this dependency definition for the kryo-serializer:

de.javakaffee.msmmsm-kryo-serializer1.8.0runtime

For javolution the artifactId is msm-javolution-serializer, for xstream msm-xstream-serializer and for flexjson it's msm-flexjson-serializer.

If you're not using a dependency management based on maven repositories these are the jars you need for the different serializers:

  • kryo-serializer: msm-kryo-serializer, kryo-serializers-0.11 (0.11 is needed, as 0.20+ is for kryo2), kryo, minlog, reflectasm, asm-3.2

  • javolution-serializer: msm-javolution-serializer, javolution-5.4.3.1

  • xstream-serializer: msm-xstream-serializer, xstream, xmlpull, xpp3_min

  • flexjson-serializer: msm-flexjson-serializer, flexjson

其他配置方案网上有很多,本文作者未作测试。


包可以去这俩网站找:

https://github.com/
http://mvnrepository.com/

在$CATALINA_HOME/conf/logging.properties文件中添加de.javakaffee.web.msm.level=FINE,就可以在catalina.out的日志中看到详细的session存取情况。
(正式环境可以去掉,会产生大量日志)

nginx的负载配置,可用默认权重轮询机制或者最小连接数配置,或者ip_hash等指定上游的方案(例如特殊需要,比如担心部署项目时跳转不同的服务器导致不同版本软件的计算结果错误)。加不加cookie粘性制请自选(原理是在cookie中加标识字段,但当客户端非浏览器时,可能没有cookie)。

将以下配置放置与nginx.conf的http{}内或者外联配置文件中(本例暂不包括超时设置,主从机设置等):

upstream tomcatsvr{
least_conn; #最小连接数,跳转到激活连接数最少的服务器上,也可以使用默认轮询方案,或者ip_hash等指定上游的连接方案,cookie粘性方案。届时按使用场景配置。
#ip_hash;
server 192.168.1.233:8080; #可加权重 weight=1,默认1。权重与ip_hash等定向方案冲突
server 192.168.1.232:8080;
}
server{
listen 80;
server_name 192.168.1.35;
     location /{
             index index.html ;
             proxy_pass http://tomcatsvr/;
             # proxy_pass http://tomcatsvr/testSession/;
             # proxy_cookie_path /testSession/ /; #若cookie出现问题,可用此配置,二级项目的cookie解决方法。
             # proxy_cookie_path /testSession /; #若cookie出现问题,可用此配置,二级项目的cookie解决方法。
             proxy_set_header   Host   $host;
             proxy_set_header   Referer $http_referer;
             proxy_set_header   Cookie $http_cookie;
             proxy_set_header   X-Real-IP  $remote_addr;
             proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
             client_max_body_size  100m;
      }
}



------------------------分---------割---------线------------------------
Manager标签属性说明

1.className  必须
类名:de.javakaffee.web.msm.MemcachedBackupSessionManager


2.memcachedNodes  必须
memcached节点:此属性应该包含所有运行的memcached节点或者membase bucket的uri地址,每一个memcached节点的属性定义格式为<id>:<host>:<port>,多个节点定义直接使用空格或者逗号分隔,形如:memcachedNodes="n1:app01:11211,n2:app02:11211",如果只有单个的memcached节点,则<id>是可选项,只需配置<host>:<port>即可,形如:memcachedNodes="localhost:11211"。

如果我们配置的是membase,那么从1.6.0版本开始,我们可以配置指定一个或者多个membase bucket uris,形如:http://host1:8091/pools,http://host2:8091/pools。Bucket 名称和密码通过属性username,password来定义。membase buckets连接需要遵循memcached协议,传输数据通过二进制流方式。


3.failoverNodes 可选项
故障转移节点:可选项,对非黏性session不可用,属性必须包含memcached节点集群的所有ids。节点id之间用空格或者逗号分隔。


4.username 可选项
从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证,密码可以为空。


5.password 可选项
从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证,密码可以为空。


6.memcachedProtocol    可选项
定义memcached协议,默认使用text文本,出属性指明memcached使用的存储协议。只支持text或者binary。


7.sticky    可选项
定义session方式为黏性或非黏性,默认为true,多个tomcat时需使用非黏性


8.lockingMode    可选项
只有非黏性session才使用,默认值为none
none: 从不对session进行锁定
all: session将一直被锁定,知道请求结束
auto: 对于只读请求,session将不会被锁定,如果是非只读请求,则session会被锁定
uriPattern:<regexp>: 通过正则表达式的方式来对请求uri以及查询字符串进行匹配,只有匹配上的才会被锁定。


9.requestUriIgnorePattern   可选项
此属性是那些不能改备份Session的请求的正则表达式。如果像css,javascript,图片等静态文件被同一个Tomcat和同一个应用上下文来提供,这些请求也会通过memcached-session-manager。但是这些请求在一个http会话中几乎没什么改变,所以他们没必要触发Session备份。所以那些静态文件没必要触发Session备份,你就可以使用此属性定义。此属性必须符合java regex正则规范。
   如:".*\.(png|gif|jpg|css|js)$"  


10.sessionBackupAsync   可选项
指定Session是否应该被异步保存到Memcached中。 如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout设置的过期时间起作用。


11.backupThreadCount    可选项
用来异步保存Session的线程数,(如果sessionBackupAsync="true")。默认值为cup的内核数。


12.sessionBackupTimeout    可选项
设置备份一个Session所用的时间,如果操作超过时间那么保存失败。此属性只在sessionBackupAsync="false"是起作用。默认100毫秒


13.operationTimeout    可选项
从1.6.0版开始使用, 默认值为1000


14.sessionAttributeFilter    可选项
此属性是用来控制Session中的那个属性值保存到Memcached中的正则表达式。郑则表达式被用来匹配Session中属性名称。如sessionAttributeFilter="^(userName|sessionHistory)$" 指定了只有"userName"和"sessionHistory"属性保存到Memcached中。依赖于选择的序列化策略。


15.transcoderFactoryClass    可选项
此属性值是创建序列化和反序列化保存到Memcached中的Session的编码转换器的工厂类名。这个指定的类必须实现了de.javakaffee.web.msm.TranscoderFactory和提供一个无参的构造方法。例如其他的有效的实现在其他packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm-javolution-serializer.
默认为 de.javakaffee.web.msm.JavaSerializationTranscoderFactory


16.copyCollectionsForSerialization    可选项
默认值为false。详细解释参见官网解释。


17.customConverter    可选项
自己定义特殊的类注册到kryo自定义转换器中,实现序列化


18.enableStatistics    可选项
用来指定是否进行统计。 默认值为true。


19.enabled   可选项
指定Session保存到Memcached中是否可用和是否可以通过JMX进行改变。只用于粘性Session。 默认值为true。


更多msm内容,参考官网(googlecode中,需要fq)

你可能感兴趣的:(nginx,memcache,tomcat集群)