使用Tomcat进行集群部署,需要解决集群中多个节点之间保持Session共享,大体上有两种方式:
- 把所有Session数据放到一台服务器上或者数据库中,集群中的所有节点通过访问这台Session服务器来获取数据;
- 在集群中的所有节点间进行Session数据的同步拷贝,任何一个节点均保存了所有的Session数据。
Tomcat集群Session同步方案有以下几种方式:
- 使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配置起来很简单。但这个方案的效率比较低,在大并发下表现并不好。
- 利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。但如果应用是某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。
- 利用nginx插件实现tomcat集群和session同步,nginx-upstream-jvm-route-0.1.tar.gz,是一个Nginx的扩展模块,用来实现基于Cookie的Session Sticky的功能。
- 利用memcached实现(MSM工具)。memcached存储session,并把多个tomcat的session集中管理,前端在利用nginx负载均衡和动静态资源分离,在兼顾系统水平扩展的同时又能保证较高的性能。
- 利用redis实现。使用redis不仅仅可以将缓存的session持久化,还因为它支持的单个对象比较大,而且数据类型丰富,不只是缓存 session,还可以做其他用途,可以一举几得。
- 利用filter方法实现。这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于tomcat ,而且实现的原理比较简单容易控制。
本文使用Redis实现Tomcat集群的Session共享。
部署环境
Tomcat7+jdk7
将以下jar包复制到tomcat lib目录下
commons-pool2-2.4.2.jar
jedis-2.9.0.jar
tomcat-redis-session-manager-2.0.0.jar
下载地址https://pan.baidu.com/s/10nBKXqcSvnC74NxGj_-uag
提取码: n6rp
修改context.xml 增加配置
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Valve className="com.bluejeans.tomcat.redissessions.RedisSessionHandlerValve"/>
<Manager className="com.bluejeans.tomcat.redissessions.RedisSessionManager"
host="localhost"
port="6379"
password="123456"
database="0"
maxInactiveInterval="60"
/>
</Context>
参数描述:
host: redis数据库ip
port: redis数据库端口
password: redis数据库密码
database:数据库下标(redis默认从0到15 16个分区)
maxInactiveInterval:session过期时间 (测试无效)