Tomcat Session复制集群 小节4

115 阅读2分钟

@[TOC](Tomcat Session复制集群 小节4)

Tomcat Session集群

参考:tomcat.apache.org/tomcat-8.5-…

        <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.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      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.MessageDispatchInterceptor"/>
          </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.ClusterSessionListener"/>
        </Cluster>

配置说明

  • Cluster 集群配置
  • Manager 会话管理器配置
  • Channel 信道配置
    • Membership 成员判断。使用说明多播地址、端口多少、间隔时长ms、超时时长ms。同一个多播地址和端口认为同属一个组,使用时修改这个多播地址,以防冲突。
    • Receiver 接收器,多线程接收多个其他节点的心跳、会话信息。默认会从4000到4100依次尝试可用端口。
      • address="auto", auto可能绑定到127.0.0.1上,所以一定要改为可以用的IP上去
    • Sender多线程发送器,内部使用了tcp连接池。
    • Interceptor拦截器
  • Valve
    • ReplicationValve检测哪些请求需要检测Session,Session数据是否有了变化,需要启动复制过程.
  • ClusterListener
    • ClusterSessionListener集群session侦听器

使用<c1uster className=" org.apache.catalina.ha.tcp.simpleTcpCluster" />

添加到<Engine>所有虚拟主机都可以启用Session复制

添加到<Host>,该虚拟主机可以启用Session复制

最后,在应用程序内部启用了才可以使用

前提:

  • 时间同步,确保NTP或Chrony服务正常运行。# systemctl status chronyd
  • 防火墙规则。# systemctl stop firewalld
IP主机名服务
37.13t0调度器Nginx、HTTPD
37.14t1tomcat1JDK8、Tomcat8
37.15t2tomcat2JDK8、Tomcat8

本次把多播复制的配置放到缺省虚拟主机里面,即Host之下。

特别注意修改Receiver的address属性为一个本机可对外的IP地址。

t1的server.xml中,如下

server.xml

]# vim conf/server.xml 
...
      <Host name="t1.123.com" appBase="/data/webapps" autoDeploy="true">
  其他省略
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.37.14"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>
...

]# pwd
/usr/local/tomcat
]# bin/shutdown.sh

]# bin/startup.sh

t2的server.xml中,如下

]# vim conf/server.xml 
...
      <Host name="t2.123.com" appBase="/data/webapps" autoDeploy="true">
  其他省略
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.37.15"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>
...
]# pwd
/usr/local/tomcat
]# bin/shutdown.sh

]# bin/startup.sh

#Tomcat重启后,ss命令能看到tomcat监听在4000端口上     
]# ss -ntlp|grep 4000
LISTEN     0      50        ::ffff:192.168.37.14:4000                    :::* 

nginx

~]# cat /etc/httpd/conf.d/httpd-tomcat.conf 
<VirtualHost *:80>
    ServerName          node1.123.com
    ProxyRequests       Off
    ProxyVia            On
    ProxyPreserveHost   On
    ProxyPass          / balancer://lbtomcats/
    ProxyPassReverse   / balancer://lbtomcats/
</VirtualHost>

<Proxy balancer://lbtomcats>
    BalancerMember ajp://t1.123.com:8009 loadfactor=1 route=Tomcat1
    BalancerMember ajp://t2.123.com:8009 loadfactor=2 route=Tomcat2
    #ProxySet stickysession=ROUTEID    <--
</Proxy>

]# systemctl reload httpd

尝试使用刚才配置过得负载均衡(移除Session黏性),测试发现Session还是变来变去。

t1和t2

在应用增加WEB-INF,从全局复制一个web.xml过来

]# mkdir -pv /data/webapps/ROOT/WEB-INF
]# pwd
/usr/local/tomcat

]# cp conf/web.xml /data/webapps/ROOT/WEB-INF/

]# vim /data/webapps/ROOT/WEB-INF/web.xml 
<distributable/>    <--直接在倒数第二行添加此行即可
</web-app>

    
]# bin/shutdown.sh 
]# bin/startup.sh

通过负载均衡调度到不同节点,返回的SessionID不变了。

图片.png