tomcat集群实际上是一种会话复制或会话共享
会话session指的是浏览器访问一个项目资源时开始到浏览器关闭结束,期间客户端向服务器发送请求时会携带服务器给的sessionID,只要浏览器不关闭或者会话相关标签页没关闭,那么会话会存在,直到会话自动被服务器销毁或手工销毁,浏览器或相关标签页没关闭的情况下同一浏览器访问同一项目资源时也属于同一个会话。
集群中的术语如下:
- 管理器:负责管理会话
- 分组:tomcat的逻辑分组
- 成员:集群参与节点
- 信道:传输集群消息的信道
- 发送器:发送复制消息
- 接收器:负责接收复制消息
- 拦截器:负责操作复制消息
- 传输:自定义插件,发送和接收的消息
- 心跳:多播节点发现,间断向其它节点发送消息来保活
注意:多播发现节点需要实现操作系统的网卡多播功能,ifconfig中如果出现MULTICAST代表支持多播功能,会话是根据主机标识的,不同的主机标识使用不同的会话
本例中的tomcat版本为tomcat.7.0.93
配置完全(ALL -- TO --ALL)复制:
在不同主机间实现集群,所有主机的实现分布web应用的web.xml需加入<distributable/>
Context需加入distributed=”true”,如下所示
Server.xml的Engine需要加入jvmRoute=”xxx”,xxx每个节点不能相同
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tc1">##jvmRoute每个节点不一样
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager" ##delta代表all-2-all
expireSessionsOnShutdown="false" # 复制
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>###多播发现成员
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="6.6.8.162" ##不同的接收者ip不一样
port="4000"##同一主机的端口不同的节点port不一样
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>##接收者信息
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
访问网页设置会话属性并断开访问的tomcat服务去访问另一台,可看到如下信息
另一种部署方法,更改为静态发现成员的server.xml主要配置
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="6.6.8.161"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor" staticOnly="true"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
<Member className="org.apache.catalina.tribes.membership.StaticMember"
port="4000"
host="6.6.8.161"
uniqueId="{6,6,8,161,0,0,0,0,0,0,0,0,0,0,0,0}"/>##唯一即可
<Member className="org.apache.catalina.tribes.membership.StaticMember"
port="4000"
host="6.6.8.162"
uniqueId="{6,6,8,162,0,0,0,0,0,0,0,0,0,0,0,0}"/>
</Interceptor>
</Channel>
另一种部署方法,配置主/备复制,不是全部复制,只是复制会话到一个备份节点上,更改内容如下
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.BackupManager"##backupManager 主备复制
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">