前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tomcat的Session复制集群

Tomcat的Session复制集群

原创
作者头像
ruochen
修改2021-11-24 13:53:49
1.2K0
修改2021-11-24 13:53:49
举报
文章被收录于专栏:若尘的技术专栏

配置说明

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

使用

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

添加到

<Engine>

所有虚拟主机都可以启用Session复制

添加到

<Host>

该虚拟主机可以启用Session复制

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

5.1 配置nginx调度器使用轮询机制

代码语言:txt
复制
[19:57:00 root@nginx ~]#vim /etc/nginx/nginx.conf
代码语言:txt
复制
...
代码语言:txt
复制
    upstream tomcat-server {
代码语言:txt
复制
    #ip_hash;                  
代码语言:txt
复制
    #hash $cookie_JSESSIONID;
代码语言:txt
复制
    server t1.tomcat.org:8080;
代码语言:txt
复制
    server t2.tomcat.org:8080;
代码语言:txt
复制
    }
代码语言:txt
复制
...  

5.2 在两台后端Tomcat主机上修改server.xml配置

复制集群的配置可以配置在Host中, 针对某个虚拟主机, 也可配置在Engine中, 针对所有的虚拟主机

Receiver的address要修改为本机可对外的ip地址

5.2.1 修改t1主机的server.xml文件

代码语言:txt
复制
     <Host name="t1.tomcat.org"  appBase="/data/webapps"
代码语言:txt
复制
            unpackWARs="true" autoDeploy="true">
代码语言:txt
复制
        <!-- SingleSignOn valve, share authentication between web applications
代码语言:txt
复制
             Documentation at: /docs/config/valve.html -->
代码语言:txt
复制
        <!--
代码语言:txt
复制
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
代码语言:txt
复制
        -->
代码语言:txt
复制
        <!-- Access log processes all example.
代码语言:txt
复制
             Documentation at: /docs/config/valve.html
代码语言:txt
复制
             Note: The pattern used is equivalent to using pattern="common" -->
代码语言:txt
复制
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
代码语言:txt
复制
               prefix="localhost_access_log" suffix=".txt"
代码语言:txt
复制
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
代码语言:txt
复制
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
代码语言:txt
复制
         channelSendOptions="8">
代码语言:txt
复制
  <Manager className="org.apache.catalina.ha.session.DeltaManager"
代码语言:txt
复制
           expireSessionsOnShutdown="false"
代码语言:txt
复制
           notifyListenersOnReplication="true"/>
代码语言:txt
复制
  <Channel className="org.apache.catalina.tribes.group.GroupChannel">
代码语言:txt
复制
    <Membership className="org.apache.catalina.tribes.membership.McastService"
代码语言:txt
复制
                address="230.100.100.8"
代码语言:txt
复制
                port="45564"                  #45564/UDP
代码语言:txt
复制
                frequency="500"
代码语言:txt
复制
                dropTime="3000"/>
代码语言:txt
复制
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
代码语言:txt
复制
              address="10.0.0.82"   #此项建议修改为当前主机的IP
代码语言:txt
复制
              port="4000"
代码语言:txt
复制
              autoBind="100"
代码语言:txt
复制
              selectorTimeout="5000"
代码语言:txt
复制
              maxThreads="6"/>
代码语言:txt
复制
    <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
代码语言:txt
复制
      <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
代码语言:txt
复制
    </Sender>
代码语言:txt
复制
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
代码语言:txt
复制
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
代码语言:txt
复制
  </Channel>
代码语言:txt
复制
  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
代码语言:txt
复制
         filter=""/>
代码语言:txt
复制
  <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
代码语言:txt
复制
  <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
代码语言:txt
复制
            tempDir="/tmp/war-temp/"
代码语言:txt
复制
            deployDir="/tmp/war-deploy/"
代码语言:txt
复制
            watchDir="/tmp/war-listen/"
代码语言:txt
复制
            watchEnabled="false"/>
代码语言:txt
复制
  <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
代码语言:txt
复制
</Cluster>
代码语言:txt
复制
      </Host>

5.2.2 修改t2主机的server.xml文件

代码语言:txt
复制
      <Host name="t2.tomcat.org"  appBase="/data/webapps"
代码语言:txt
复制
            unpackWARs="true" autoDeploy="true">
代码语言:txt
复制
        <!-- SingleSignOn valve, share authentication between web applications
代码语言:txt
复制
             Documentation at: /docs/config/valve.html -->
代码语言:txt
复制
        <!--
代码语言:txt
复制
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
代码语言:txt
复制
        -->
代码语言:txt
复制
        <!-- Access log processes all example.
代码语言:txt
复制
             Documentation at: /docs/config/valve.html
代码语言:txt
复制
             Note: The pattern used is equivalent to using pattern="common" -->
代码语言:txt
复制
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
代码语言:txt
复制
               prefix="localhost_access_log" suffix=".txt"
代码语言:txt
复制
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
代码语言:txt
复制
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
代码语言:txt
复制
         channelSendOptions="8">
代码语言:txt
复制
  <Manager className="org.apache.catalina.ha.session.DeltaManager"
代码语言:txt
复制
           expireSessionsOnShutdown="false"
代码语言:txt
复制
           notifyListenersOnReplication="true"/>
代码语言:txt
复制
  <Channel className="org.apache.catalina.tribes.group.GroupChannel">
代码语言:txt
复制
    <Membership className="org.apache.catalina.tribes.membership.McastService"
代码语言:txt
复制
                address="230.100.100.8"
代码语言:txt
复制
                port="45564"                  #45564/UDP
代码语言:txt
复制
                frequency="500"
代码语言:txt
复制
                dropTime="3000"/>
代码语言:txt
复制
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
代码语言:txt
复制
              address="10.0.0.83"   #此项建议修改为当前主机的IP
代码语言:txt
复制
              port="4000"
代码语言:txt
复制
              autoBind="100"
代码语言:txt
复制
              selectorTimeout="5000"
代码语言:txt
复制
              maxThreads="6"/>
代码语言:txt
复制
    <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
代码语言:txt
复制
      <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
代码语言:txt
复制
    </Sender>
代码语言:txt
复制
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
代码语言:txt
复制
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
代码语言:txt
复制
  </Channel>
代码语言:txt
复制
  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
代码语言:txt
复制
         filter=""/>
代码语言:txt
复制
  <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
代码语言:txt
复制
  <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
代码语言:txt
复制
            tempDir="/tmp/war-temp/"
代码语言:txt
复制
            deployDir="/tmp/war-deploy/"
代码语言:txt
复制
            watchDir="/tmp/war-listen/"
代码语言:txt
复制
            watchEnabled="false"/>
代码语言:txt
复制
  <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
代码语言:txt
复制
</Cluster>
代码语言:txt
复制
      </Host>

5.3 修改每个虚拟主机的web.xml文件, 启用分布式

5.3.1 修改t1主机的web.xml文件

代码语言:txt
复制
[20:51:13 root@t1 ~]#cp -a /usr/local/tomcat/webapps/ROOT/WEB-INF/ /data/webapps/ROOT
代码语言:txt
复制
[20:54:55 root@t1 ~]#tree /data/webapps/ROOT/
代码语言:txt
复制
/data/webapps/ROOT/
代码语言:txt
复制
├── index.jsp
代码语言:txt
复制
└── WEB-INF
代码语言:txt
复制
    └── web.xml
代码语言:txt
复制
1 directory, 2 files
代码语言:txt
复制
  <description>
代码语言:txt
复制
     Welcome to Tomcat
代码语言:txt
复制
  </description>
代码语言:txt
复制
<distributable/>                                                                                                                                                                    
代码语言:txt
复制
</web-app>
代码语言:txt
复制
[20:56:26 root@t1 ~]#systemctl restart tomcat
代码语言:txt
复制
[20:56:26 root@t1 ~]#ss -ntl
代码语言:txt
复制
State                  Recv-Q                  Send-Q                                        Local Address:Port                                   Peer Address:Port                 
代码语言:txt
复制
LISTEN                 0                       128                                                 0.0.0.0:22                                          0.0.0.0:*                    
代码语言:txt
复制
LISTEN                 0                       128                                                    [::]:22                                             [::]:*                    
代码语言:txt
复制
LISTEN                 0                       50                                       [::ffff:10.0.0.82]:4000           # 开启4000端口                                   *:*                    
代码语言:txt
复制
LISTEN                 0                       1                                        [::ffff:127.0.0.1]:8005                                              *:*                    
代码语言:txt
复制
LISTEN                 0                       100                                                       *:8080                                              *:*  

5.3.2 修改t2主机的web.xml文件

代码语言:txt
复制
[20:51:13 root@t2 ~]#cp -a /usr/local/tomcat/webapps/ROOT/WEB-INF/ /data/webapps/ROOT
代码语言:txt
复制
[20:54:55 root@t2 ~]#tree /data/webapps/ROOT/
代码语言:txt
复制
/data/webapps/ROOT/
代码语言:txt
复制
├── index.jsp
代码语言:txt
复制
└── WEB-INF
代码语言:txt
复制
    └── web.xml
代码语言:txt
复制
1 directory, 2 files
代码语言:txt
复制
  <description>
代码语言:txt
复制
     Welcome to Tomcat
代码语言:txt
复制
  </description>
代码语言:txt
复制
<distributable/>                                                                                                                                                                    
代码语言:txt
复制
</web-app>
代码语言:txt
复制
[20:56:26 root@t2 ~]#systemctl restart tomcat
代码语言:txt
复制
[21:02:10 root@t2 ~]#ss -ntl
代码语言:txt
复制
State                  Recv-Q                  Send-Q                                        Local Address:Port                                   Peer Address:Port                 
代码语言:txt
复制
LISTEN                 0                       128                                                 0.0.0.0:22                                          0.0.0.0:*                    
代码语言:txt
复制
LISTEN                 0                       1                                        [::ffff:127.0.0.1]:8005                                              *:*                    
代码语言:txt
复制
LISTEN                 0                       100                                                       *:8080                                              *:*                    
代码语言:txt
复制
LISTEN                 0                       128                                                    [::]:22                                             [::]:*                    
代码语言:txt
复制
LISTEN                 0                       50                                       [::ffff:10.0.0.83]:4000                                              *:* 

5.3 查看t1和t2上的复制日志

代码语言:txt
复制
# t1
代码语言:txt
复制
23-Mar-2021 21:02:08.474 INFO [Membership-MemberAdded.] org.apache.catalina.ha.tcp.SimpleTcpCluster.memberAdded Replication member added:[org.apache.catalina.tribes.membership.MemberImpl[tcp://{10, 0, 0, 83}:4000,{10, 0, 0, 83},4000, alive=1017, securePort=-1, UDP Port=-1, id={18 -28 -37 52 10 94 74 -58 -107 -83 1 65 -69 76 -102 8 }, payload={}, command={}, domain={}]]
代码语言:txt
复制
# t2
代码语言:txt
复制
talina.tribes.membership.MemberImpl[tcp://{10, 0, 0, 82}:4000,{10, 0, 0, 82},4000, alive=352758, securePort=-1, UDP Port=-1, id={113 -35 -13 18 -28 116 68 87 -66 127 -82 -58 98 -56 -114 -124 }, payload={}, command={}, domain={}]]. This operation will timeout if no session state has been received within [60] seconds.

5.4 访问测试

重启全部Tomcat, 通过负载均衡调度到不同的节点, 返回的SessionID相同, 但是后端的主机是轮询的

图片.png

图片.png

5.5 故障模拟

  1. 先访问一次, 调度到10.0.0.83, 并获取SessionID
  2. 关闭10.0.0.83上的Tomcat
代码语言:txt
复制
[21:09:46 root@t2 ~]#systemctl stop tomcat
  1. 在10.0.0187利用curl携带SessionID进行访问, 可以看到, 携带了10.0.0.83产生的SessionID后, 每次访问都是用户的固定的SessionID, 说明10.0.0.82上复制了10.0.0.83的SessionID
代码语言:txt
复制
[21:10:43 root@client ~]#curl -b 'JSESSIONID=D5FB8FDA21F1081E705C41A52E613613' www.tomcat.org/index.jsp
代码语言:txt
复制
<!DOCTYPE html>
代码语言:txt
复制
<html lang="en">
代码语言:txt
复制
<head>
代码语言:txt
复制
    <meta charset="UTF-8">
代码语言:txt
复制
    <title>tomcat test</title>
代码语言:txt
复制
</head>
代码语言:txt
复制
<body>
代码语言:txt
复制
<div>On tomcat-server</div>
代码语言:txt
复制
<div>10.0.0.82:8080</div>
代码语言:txt
复制
<div>SessionID = <span style="color:blue">D5FB8FDA21F1081E705C41A52E613613</span></div>                                                                        
代码语言:txt
复制
Tue Mar 23 21:10:48 CST 2021
代码语言:txt
复制
</body>
代码语言:txt
复制
</html>
代码语言:txt
复制
[21:10:47 root@client ~]#curl -b 'JSESSIONID=D5FB8FDA21F1081E705C41A52E613613' www.tomcat.org/index.jsp
代码语言:txt
复制
<!DOCTYPE html>
代码语言:txt
复制
<html lang="en">
代码语言:txt
复制
<head>
代码语言:txt
复制
    <meta charset="UTF-8">
代码语言:txt
复制
    <title>tomcat test</title>
代码语言:txt
复制
</head>
代码语言:txt
复制
<body>
代码语言:txt
复制
<div>On tomcat-server</div>
代码语言:txt
复制
<div>10.0.0.82:8080</div>
代码语言:txt
复制
<div>SessionID = <span style="color:blue">D5FB8FDA21F1081E705C41A52E613613</span></div>                                                                        
代码语言:txt
复制
Tue Mar 23 21:10:49 CST 2021
代码语言:txt
复制
</body>
代码语言:txt
复制
</html>

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 5.1 配置nginx调度器使用轮询机制
  • 5.2 在两台后端Tomcat主机上修改server.xml配置
    • 5.2.1 修改t1主机的server.xml文件
      • 5.2.2 修改t2主机的server.xml文件
      • 5.3 修改每个虚拟主机的web.xml文件, 启用分布式
        • 5.3.1 修改t1主机的web.xml文件
          • 5.3.2 修改t2主机的web.xml文件
          • 5.3 查看t1和t2上的复制日志
          • 5.4 访问测试
          • 5.5 故障模拟
          相关产品与服务
          轻量应用服务器
          轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、游戏服、电商应用、云盘/图床和开发测试环境,相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖云资源并提供高带宽流量包,将热门软件打包实现一键构建应用,提供极简上云体验。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档