tomcat集群实现session共享问题。
session是什么东西?干什么用的,当初我也想知道。后来我通过了百度了解的他的作用。简单的介绍下,不全面只是简单的说明下。大家都知道http协议是无状态的协议。什么叫做无状态,也就说如果你在1秒钟之前访问了我们的web服务器,如果你在一秒钟之后再去访问的话,我们的web服务器可能就已经不再认识你了。所以呢session这个东西可以加载在cookie里面,可以作为你的标志。也可以来帮助我们的web服务器来识别我们的身份下面简单的介绍下,在tomcat集群里面如何实现session的共享。
在开始之前,在唠叨一句,为什么实现session共享呢?有什么作用呢?好吧,最大众也最有说服力的一个例子是,加入你在淘宝买东西,此处没有打广告的嫌疑,大家没必要紧张。如果你前一秒访问的服务器,突然崩了。也就是你原来加在购物车的东西都没了。这回事一种什么样子的感受呢。大家应该明白session共享的目的了吧。下面开始了。
设计:前段时Apache用来接收web请求。后面是tomcat的集群,我用两个tomcat来进行模拟。
①编辑Apache的配置文件。
打开反向代理的模块
oadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_modulemodules/mod_proxy_connect.so
LoadModule proxy_http_modulemodules/mod_proxy_http.so
LoadModule proxy_wstunnel_modulemodules/mod_proxy_wstunnel.so
LoadModule proxy_ajp_modulemodules/mod_proxy_ajp.so
LoadModule proxy_balancer_modulemodules/mod_proxy_balancer.so
LoadModule proxy_express_modulemodules/mod_proxy_express.so
上面的这些,即打开了代理的模块。同样的负载的模块也已经被打开了。注释掉中心主机,我们利用虚拟主机来进行配置。
Iclude /etc/httpd/extra/httpd-proxy.conf
vi /etc/httpd/extra/httpd-proxy.conf
ProxyRequests off
<Proxy balancer://cluster>
BalancerMember / http://172.16.5.10:8080 loadfactor=1
BalancerMember / http://172.16.5.20:8080 loadfactor=1
ProxySet lbmethod=byrequests
</Proxy>
<VirtualHost *:80>
ProxyRequests off
ProxyVia off
ProxyPass / balancer://cluster/
proxyPassReverse / balancer://cluster/
<Proxy />
Require all granted
</Proxy>
<Location />
Require all granted
</Location>
</VirtualHost>
httpd的部分已经配置完成。下面可以重启web服务了。
②配置tomcat,在tomcat的配置过程中,包括下面的几个部分。
1、 更改配置文件
<Engine name="Catalina"defaultHost="www.xuejinliang.com" jvmRoute="TomcatA">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<ManagerclassName="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<ChannelclassName="org.apache.catalina.tribes.group.GroupChannel">
<MembershipclassName="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="172.16.5.10"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<ValveclassName="org.apache.catalina.ha.tcp.ReplicationValve"
<ValveclassName="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<DeployerclassName="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListenerclassName="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
上面的配置添加在配置文件中,可以放在engine中同时也可以放在host中。上面的作用是将tomcat服务器放到一个集群的组里面去。同时利用我们的DeltaManager这个管理器实现session的共享,IP地址自行进行配置。
<Host name="www.xuejinliang.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="web"reLoadable="true"/>
<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%{X-Forwarded-For}i %l %u %t "%r" %s%b" />
</Host>
这些都是常规的配置。根据自己的需求进行配置。集群的那部分代码是我们tomcat的官方网站找来的tomcat.apache.org,配置文件的更改已经完成。
2、 项目目录的文件更改。
我的项目目录为例:
cd /usr/locat/tomcat/webapps/web/
mkdir WEB-INF
cp /usr/locat/tomcat/conf/web.xml /usr/local/tomcat/webapps/web/WEB-INF/
vim web.xml
将<distributable/>加载到配置文件中,然后保存退出就可以了。
<web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<distributable/>
放在这里即可。
好了,在我们的项目的根目录下面可以建立一个测试的页面
vim index.jsp
<%@page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><fontcolor="red">TomcatA </font></h1>
<table align="centre"border="1">
<tr>
<td>Session ID</td>
<%session.setAttribute("abc","abc"); %>
<td><%= session.getId()%></td>
</tr>
<tr>
<td>Created on</td>
<td><%=session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
另外的一台进行同样的配置步骤,然后让我们的两台tomcat都重新的启动起来就好了。然后我们可以通过刷新web几面来查看是不是实现了我们的session共享。
今天想说的就是这些,下面的博客估计会发布些总结性的东西。概念或者原理的东西会多一些。continue…………….