为什么要做session复制或共享
实现Session复制或Session共享的目的是为了在多个Tomcat实例之间实现Session的无缝转移和共享,以提供更高的可伸缩性、负载均衡和容错性。以下是一些原因:
- 高可用性和容错性:通过复制或共享Session,当一个Tomcat实例发生故障或停机时,其他实例可以接管并继续处理用户请求,而不会丢失Session数据。这确保了应用程序的高可用性和容错性。
- 负载均衡:当有多个Tomcat实例运行时,Session复制或共享可以实现负载均衡。用户的请求可以分散到不同的实例上,提高系统的整体性能和吞吐量。
- 无状态化应用设计:通过将Session数据从应用服务器中移出,可以使应用程序变得更加无状态化。这意味着每个请求可以独立处理,不依赖于特定的服务器状态,从而提高应用程序的可扩展性。
- 保持用户会话状态:通过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.xml、vim /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信息会造成负载过高