如何在 Tomcat 集群中实现 Session 共享?
,
1 Tomcat集群中实现Session共享
session在集群中的共享是可以实现的,只是Tomcat 7.0之前的版本并没有在这方面提供多少支持,在Tomcat 7.0开始也支持了session共享,它提供了多种共享方式,下面分别介绍一下。
2 使用Memcached进行Session共享
Memcached是一个广泛使用的开源分布式内存对象缓存系统,它为Tomcat提供了一种支持Session共享的可能,按照以下步骤可以搭建一个Memcached集群来实现Session共享:
2.1 安装Memcached
在每个节点上安装Memcached服务,Memcached的客户端必须和服务端在同一个机器上,可以使用 apt-get 命令来快速安装Memcached,例如:
$sudo apt-get install memcached
2.2 配置Tomcat
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"/>
2.3 开始使用
搭建完成后可以测试Session共享功能,例如:如果有Tomcat集群的两个节点 分别叫 node01 和 node02,当用户登陆 node01 节点时,可以绑定到 Session ID 并设置一个属性:user=Tom,然后在node02节点会话上读取这个属性,可以看到结果 user=Tom,证明 Memcached 是为集群提供正常的Session共享功能的。
3 使用Redis进行Session共享
Redis 是一个开源的原生态内存存储系统,是一个高性能的分布式内存对象存储系统,可以用来存储会话数据,下面介绍一下如何使用Redis来实现Session共享:
3.1 安装Redis
在每个 Tomcat 节点上安装Redis,可以使用 apt-get 命令来快速安装Redis,例如:
$sudo apt-get install redis-server
3.2 配置Tomcat
配置 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_"/>
3.3 开始使用
搭建完成后,相关测试可以类似于Memcached部分,在不同节点上,添加和查询session相关属性来测试共享功能,例如,在 node01 节点上可以设置一个属性为user=Tom,然后去node02节点上查看,能够读取到user=Tom,从而验证 Redis 提供的 Session 共享功能是正常的。
综上所述,Tomcat集群中可以利用Memcached和Redis等分布式存储系统来支持session共享,而Tomcat7.0以上的版本就支持这样的功能。此外,有些F5/Nginx/Apache集群也有支持Session共享的方案,不过这里就不累述了。