tomcat session复制及session共享技术

为什么要做session复制或共享

实现Session复制或Session共享的目的是为了在多个Tomcat实例之间实现Session的无缝转移和共享,以提供更高的可伸缩性、负载均衡和容错性。以下是一些原因:

  1. 高可用性和容错性:通过复制或共享Session,当一个Tomcat实例发生故障或停机时,其他实例可以接管并继续处理用户请求,而不会丢失Session数据。这确保了应用程序的高可用性和容错性。
  2. 负载均衡:当有多个Tomcat实例运行时,Session复制或共享可以实现负载均衡。用户的请求可以分散到不同的实例上,提高系统的整体性能和吞吐量。
  3. 无状态化应用设计:通过将Session数据从应用服务器中移出,可以使应用程序变得更加无状态化。这意味着每个请求可以独立处理,不依赖于特定的服务器状态,从而提高应用程序的可扩展性。
  4. 保持用户会话状态:通过Session复制或共享,用户的会话状态可以在多个请求之间得到保持。这对于需要跨页面或多个请求保持用户身份、购物车信息、用户首选项等状态非常重要。

1、安装JDK

上传jdk1.8到服务器。安装jdk
[root@localhost ~]# tar xvzf jdk-8u191-linux-x64.tar.gz -C /usr/local/
[root@localhost~]# cd /usr/local/
[root@localhost local]# mv jdk1.8.0_191 java
设置环境变量:
[root@localhost local]# vim /etc/profile
export PATH=/usr/local/java/bin:$PATH

[root@localhost~]# source /etc/profile
检测JDK是否安装成功:
[root@localhost local]# java -version
java version “1.8.0_211”
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

2、在一台虚拟机上部署3个tomcat实例

下载tomcat软件包或者将已下载的tomcat软包上传至服务器

创建存放tomcat实例目录

[root@localhost /]# mkdir -p data/app/

[root@localhost ~]# tar xvzf apache-tomcat-8.5.95.tar.gz -C /data/app/

[root@localhost ~]# mv /data/app/apache-tomcat-8.5.95/ /data/app/tomcat1
[root@localhost ~]# tar xvzf apache-tomcat-8.5.95.tar.gz -C /data/app/

[root@localhost ~]# mv /data/app/apache-tomcat-8.5.95/ /data/app/tomcat2

[root@localhost ~]# tar xvzf apache-tomcat-8.5.95.tar.gz -C /data/app/

[root@localhost ~]# mv /data/app/apache-tomcat-8.5.95/ /data/app/tomcat3

[root@localhost ~]# cd /data/app

3、修改tomcat2和tomcat3端口

[root@localhost app]# sed -i “s/8080/8081/g;s/8005/8006/g” tomcat2/conf/server.xml

[root@localhost app]# sed -i “s/8080/8082/g;s/8005/8007/g” tomcat3/conf/server.xml

4、添加配置(在/data/app/tomcat1/conf/server.xml、/data/app/tomcat2/conf/server.xml/data/app/tomcat3/conf/server.xml三个tomcat都添加

<!-- 在配置文件中找到Engine行,在标签内添加jvmRoute,并在下方添加内容 -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
		<!-- jvmRoute的内容是本机本地解析的主机名 -->
 <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>

5、web.xml中设置(vim /data/app/tomcat1/webapps/ROOT/WEB-INF/web.xml、vim /data/app/tomcat2/webapps/ROOT/WEB-INF/web.xmlvim /data/app/tomcat3/webapps/ROOT/WEB-INF/web.xml三个tomcat都添加

<display-name>Welcome to Tomcat</display-name> # 再此行下面添加下一行的内容
<distributable/>

6、配置测试页面(vim/data/app/tomcat1/webapps/ROOT/session.jsp、/data/app/tomcat1/webapps/ROOT/session.jsp、/data/app/tomcat1/webapps/ROOT/session.jsp)三个tomcat目录里都添加

Session ID:<%= session.getId() %><BR>
SessionPort:<%= request.getServerPort() %>
<% out.println("This tomcat server 192.168.96.252");%>

7、编写一个shell脚本方便启动(vim tomcat.sh)

#!/bin/bash
tomcat_pwd=/data/app
tomcat_first=`ls /data/app | grep -P '\d+'`
for i in $tomcat_first
do
 case $1 in
  start)
    $tomcat_pwd/$i/bin/startup.sh > /dev/null
    echo "$i启动完成"
    ;;
  stop)
    $tomcat_pwd/$i/bin/shutdown.sh > /dev/null
    echo "$i已关闭"
    ;;
  restart)
    $tomcat_pwd/$i/bin/shutdown.sh > /dev/null
    echo "$i已关闭"
    $tomcat_pwd/$i/bin/startup.sh  > /dev/null
    echo "$i启动完成"
  esac
done

8、启动tomcat并访问

官方文档: https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html
官方建议,不超过四个节点可以使用这个方法,因为他是all-to-all的模式,频繁的广播session信息会造成负载过高