Session 复制

  Tomcat 支持 Session 集群,可在各 Tomcat 服务器间复制全部 session 信息,当后端一台 Tomcat 服务器宕机后,Nginx 重新调度用户请求分配到另外一台服务器,客户端可从另一台 Tomcat 服务上获取用户的 session 信息。

  Session 集群可在 Tomcat 服务器规模(一般10台以下)不大时使用,否则会导致 Session 复制时性能代价过高。(浪费网络带宽,浪费内存资源)

(一台Nginx,两台tomcat)

1、配置各个机器的主机名
2、配置主机名与IP的映射
3、关闭防火墙和selinux

修改 Tomcat 配置文件 

[root@node1 tomcat]# vim /usr/local/tomcat/conf/server.xml

          <Engine name="Catalina" defaultHost="localhost">

将 Engine 这一行修改为:

          <Engine name="Catalina" defaultHost="localhost" jvmRoute="node1"> #tomcat2 配置为jvmRoute="node2"

          <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" />  # 去掉注释 (野路子)

( <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">

          <Manager className="org.apache.catalina.ha.session.DeltaManager"

                            expireSessionsOnShutdown="false"

                            notifyListenersOnReplication="true"/>

           <Channel className="org.apache.catalina.tribes.group.GroupChannel">

                 <Membership className="org.apache.catalina.tribes.membership.McastService"

                                              address="228.25.25.4"

                                              port="45564"

                                              frequency="500"

                                              dropTime="3000"/>

                 <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

                                               address="auto"   # 自身IP地址

                                               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.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"/>

            <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"

                                   tempDir="/tmp/war-temp/"

                                 deployDir="/tmp/war-deploy/"

                                  watchDir="/tmp/war-listen/"

                                   watchEnabled="false"/>

              <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>

             <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster>)(官方做法,在注释下添加如上代码,成功率更高)

[root@node1 ~]# tail -2 /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml

<distributable/>    #添加内容

</web-app>

重新启动 Tomcat

/usr/local/tomcat/bin/shutdown.sh && /usr/local/tomcat/bin/startup.sh

netstat -lnpt | grep -E "8080|4000"        #4000 端口是多台Tomcat相互组播通信的端口

或     grep "4000" /usr/local/tomcat/logs/catalina.out

如果服务不能启动 (网络原因)(如果用的官方做法,不用加主播地址)

添加组播地址

route add -net 224.0.0.0 netmask 240.0.0.0 dev ens32 #自身的网卡名

原文地址:https://www.cnblogs.com/2567xl/p/11582570.html