使用Tomcat进行集群部署,需要解决集群中多个节点之间保持Session共享,大体上有两种方式:

  • 把所有Session数据放到一台服务器上或者数据库中,集群中的所有节点通过访问这台Session服务器来获取数据;
  • 在集群中的所有节点间进行Session数据的同步拷贝,任何一个节点均保存了所有的Session数据。

Tomcat集群Session同步方案有以下几种方式:

  1. 使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配置起来很简单。但这个方案的效率比较低,在大并发下表现并不好。
  2. 利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。但如果应用是某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。
  3. 利用nginx插件实现tomcat集群和session同步,nginx-upstream-jvm-route-0.1.tar.gz,是一个Nginx的扩展模块,用来实现基于Cookie的Session Sticky的功能。
  4. 利用memcached实现(MSM工具)。memcached存储session,并把多个tomcat的session集中管理,前端在利用nginx负载均衡和动静态资源分离,在兼顾系统水平扩展的同时又能保证较高的性能。
  5. 利用redis实现。使用redis不仅仅可以将缓存的session持久化,还因为它支持的单个对象比较大,而且数据类型丰富,不只是缓存 session,还可以做其他用途,可以一举几得。
  6. 利用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过期时间 (测试无效)