如何在 Tomcat 集群中实现 Session 共享?

session在集群中的共享是可以实现的,只是Tomcat 7.0之前的版本并没有在这方面提供多少支持,在Tomcat 7.0开始也支持了session共享,它提供了多种共享方式,下面分别介绍一下。

Memcached是一个广泛使用的开源分布式内存对象缓存系统,它为Tomcat提供了一种支持Session共享的可能,按照以下步骤可以搭建一个Memcached集群来实现Session共享:

在每个节点上安装Memcached服务,Memcached的客户端必须和服务端在同一个机器上,可以使用 apt-get 命令来快速安装Memcached,例如: $sudo apt-get install memcached

Tomcat 集群需要做如下配置:

  • 添加一个Manager实现:org.apache.catalina.ha.session.DeltaManager
  • 添加一个Valve实现:org.apache.catalina.ha.session.JvmRouteBinderValve
  • 添加一个Store实现:org.apache.catalina.ha.session.BackupManager,这个可以指定Memcached的运行地址

例如可以在Tomcat的Server.xml 配置文件里添加如下内容:


<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"
               jvmRoute="node01"/>
              <Manager className="org.apache.catalina.ha.session.DeltaManager"
               notifyListenersOnReplication="true"
               ignoreMissingSessions="true"
               expireSessionsOnShutdown="false"/>
               <Store className="org.apache.catalina.ha.session.BackupManager"
               memcachedNodes="n1:<ip1>:<port1>,n2:<ip2>:<port2>,…,nN:<ipN>:<portN>"
               requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
               sessionBackupAsync="false"/>

搭建完成后可以测试Session共享功能,例如:如果有Tomcat集群的两个节点 分别叫 node01 和 node02,当用户登陆 node01 节点时,可以绑定到 Session ID 并设置一个属性:user=Tom,然后在node02节点会话上读取这个属性,可以看到结果 user=Tom,证明 Memcached 是为集群提供正常的Session共享功能的。

Redis 是一个开源的原生态内存存储系统,是一个高性能的分布式内存对象存储系统,可以用来存储会话数据,下面介绍一下如何使用Redis来实现Session共享:

在每个 Tomcat 节点上安装Redis,可以使用 apt-get 命令来快速安装Redis,例如: $sudo apt-get install redis-server

配置 Tomcat 集群需要做如下操作:

  • 添加一个Manager实现:org.apache.catalina.ha.session.DeltaManager
  • 添加一个Valve实现:org.apache.catalina.ha.session.JvmRouteBinderValve
  • 添加一个Store实现:org.apache.catalina.ha.session.RedisStore,这个可以指定Redis的运行地址

例如可以在Tomcat的Server.xml 配置文件里添加如下内容:


<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"
               jvmRoute="node01"/>
              <Manager className="org.apache.catalina.ha.session.DeltaManager"
               notifyListenersOnReplication="true"
               ignoreMissingSessions="true"
               expireSessionsOnShutdown="false"/>
               <Store className="org.apache.catalina.ha.session.RedisStore"
               host="127.0.0.1"
               port="6379"
               database="0"
               timeout="2000"
               keyprefix="appName_"/>

搭建完成后,相关测试可以类似于Memcached部分,在不同节点上,添加和查询session相关属性来测试共享功能,例如,在 node01 节点上可以设置一个属性为user=Tom,然后去node02节点上查看,能够读取到user=Tom,从而验证 Redis 提供的 Session 共享功能是正常的。

综上所述,Tomcat集群中可以利用Memcached和Redis等分布式存储系统来支持session共享,而Tomcat7.0以上的版本就支持这样的功能。此外,有些F5/Nginx/Apache集群也有支持Session共享的方案,不过这里就不累述了。

随机文章