0%

session共享配置

session共享配置

可以有多种做法来实现

tomcat原生集群

在server.xml中进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<!-- tomcat集群节点
channelSendOptions 可以设置为2、4、8、10
- 2 确认发送
- 4 同步发送
- 8 异步发送
- 10 异步发送,且通过加上Acknowledge来提供可用性
-->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<!-- Manager管理集群的session信息
提供了两种Manager:BackupManager和DeltaManager
- BackupManager:集群下的所有session放在一个备份节点,集群下所有节点都访问此备份节点
- DeltaManager:集群下某一节点生成、改动的session,将复制到其他节点,默认使用该种
每个节点部署的应用一样则使用DeltaManager;每个节点部署的应用不一样则使用BackupManager

expireSessionsOnShutdown 设置为true时,一个节点关闭,将导致集群下所有session失效
notifyListenersOnReplication 集群下节点间session复制、删除操作,是否通知session listeners
maxInactiveInterval 集群下Session的有效时间(单位:s),maxInactiveInterval内未活动的Session,将被Tomcat回收。默认值为1800(30min)
-->
<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>
<!-- Channel是tomcat节点间通讯所使用的通道,其内有五个组件 Membership、Receiver、 Sender、Interceptor、Transport-->
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<!-- Membership 维护集群的可用节点列表,可以检查到新增的节点,也可以检查到没有心跳的节点
address 组播地址
port 组播端口
frequency 心跳的间隔时间,单位是ms,默认500
dropTime 在dropTime时间内没有收到某个节点的心跳,则将该节点删除
-->
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="192.168.1.3" port="45564" frequency="500" dropTime="3000"/>

<!-- Receiver 接收器,负责接收消息,分为阻塞式BioReceiver和非阻塞式NioReceiver
address 接收消息的地址
port 接收消息的端口
autoBind 端口的变化区间,如果port是4000,autoBind为100,则接收器将在4000-4099间取一个端口,进行监听
selectorTimeout NioReceiver轮询的超时时间
maxThreads 线程池的最大线程数
-->
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/>

<!-- Sender 发送器,负责发送消息
Sender内嵌了Transport组件,Transport真正负责发送消息

Transport分为两种:PooledParallelSender非阻塞式和PooledMultiSender阻塞式
-->
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<!-- Interceptor 集群的拦截器
TcpFailureDetector 网络、系统比较繁忙时,Membership可能无法及时更新可用节点列表,此时TcpFailureDetector可以拦截到某个节点关闭的信息,并尝试通过TCP连接此节点,以确保此节点真正的关闭,从而更新可用节点列表
-->
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>

<!-- MessageDispatch15Interceptor 查看Cluster组件发送消息的方式channelSendOptions是否设置为8,如果为8,MessageDispatch15Interceptor先将等待发送的消息进行排队,然后将排好队的消息转给Sender -->
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>

</Channel>

<!-- Value tomcat的拦截器
ReplicationValve 在处理请求前后打日志,过滤不涉及session变化的请求
-->
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<!-- JvmRouteBinderValve Apache的mod_jk发生错误时,保证同一客户端的请求发送到集群的同一个节点 -->
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<!-- Deployer 部署
tempDir 应用部署的临时目录,与其他实例同步来的应用文件会先存放在这里
deployDir 应用的部署目录,与Host配置的appBase一致
watchDir 监控目录,当watchEnabled为true时,该目录下应用的变化会同步到集群中的各个实例
-->
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="true"/>

<!-- ClusterListener 监听器,监听Cluster组件接收的消息,使用DeltaManager时,Cluster接收的信息通过ClusterSessionListener传递给DeltaManager -->
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster>

还需要在配置engine标签中,对于每个实例增加jvmRoute值,用来区分不同的实例

1
2
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">

在每个应用的web.xml中增加<distributable/>配置

如果集群数量较多时,session复制的时间会比较长,影响响应的效率

tomcat配置redis

不使用集群方式,单单使用redis来存储session

在context.xml中配置

1
2
3
4
5
<Valve className="com.bluejeans.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.bluejeans.tomcat.redissessions.RedisSessionManager"
host="localhost"
port="6379" database="0"
maxInactiveInterval="30" />

需要额外的jar包放入tomcat的lib下

1
2
3
tomcat-redis-session-manager.jar
jedis-2.5.2.jar
commons-pool2-2.2.jar

欢迎关注我的其它发布渠道