tomcat 集群及会话保持实验示例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tomcat 集群及会话保持实验示例相关的知识,希望对你有一定的参考价值。

Tomcat 集群分类:

tomcat实现session集群的几种方式:

(1) nginx + tomcat cluster

(2) httpd + tomcat cluster #基于http协议

     httpd: mod_proxy, mod_proxy_http, mod_proxy_balancer

     tomcat cluster:http connector

(3) httpd + tomcat cluster #基于ajp协议

     httpd: mod_proxy, mod_proxy_ajp, mod_proxy_balancer

     tomcat cluster:ajp connector

(4) httpd + tomcat cluster

      httpd: mod_jk  #不常用,本文不做接受

      tomcat cluster:ajp connector


实验准备:

三台主机:1台nginx或者httpd做反向调度,两台tomcat做后端服务器(tomcatA,tomcatB)

时间同步

主机名解析

tomcat主机安装:

yum install tomcat tomcat-lib tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps

1. nginx + tomcat cluster

1.1 部署nginx反向代理

vim  /etc/nginx/nginx.conf

upstream  tomsrvs {         #http段

       server 172.18.43.72:8080;

       server 172.18.43.73:8080;


       location / {                #默认http-->server段:

               proxy_pass http://tomsrvs;                                                                                                                                                  

       }

1.2 部署tomcat后端服务器

mkdir -pv /var/lib/tomcat/webapps/test/{classes,lib,WEB-INF,META-INF}

创建文件vim  /var/lib/tomcat/webapps/test/index.jsp

tomcatA测试页:

<%@ page language="java" %>

<html>

     <head><title>TomcatA</title></head>

           <body>

                 <h1><font color="red">TomcatA.magedu.com</font></h1>

                 <table align="centre" border="1">

                        <tr>

                            <td>Session ID</td>

                        <% session.setAttribute("magedu.com","magedu.com"); %>

                              <td><%= session.getId() %></td>

                        </tr>

                        <tr>

                             <td>Created on</td>

                             <td><%= session.getCreationTime() %></td>


                        </tr>

                 </table>

           </body>

</html>

tomcatB测试页:

<%@ page language="java" %>

<html>

     <head><title>TomcatB</title></head>

           <body>

                 <h1><font color="blue">TomcatB.magedu.com</font></h1>

                 <table align="centre" border="1">

                        <tr>

                            <td>Session ID</td>

                        <% session.setAttribute("magedu.com","magedu.com"); %>

                              <td><%= session.getId() %></td>

                        </tr>

                        <tr>

                             <td>Created on</td>

                             <td><%= session.getCreationTime() %></td>


                        </tr>

                 </table>

           </body>

</html>

测试结果(已完成nginx反代):

技术分享


2. httpd + tomcat cluster (http协议)

httpd服务器部署反向代理虚拟服务器vim /etc/httpd/conf.d/tom-http.conf

<proxy balancer://tcsrvs>

    BalancerMember http://172.18.43.72:8080  loadfactor=1 #定义权重

    BalancerMember http://172.18.43.73:8080  loadfactor=3

    ProxySet lbmethod=byrequests        #设定调度算法

</Proxy>

<VirtualHost *:80>

    ServerName lb.magedu.com

    ProxyVia On

    ProxyRequests Off   #关闭正向代理

    ProxyPreserveHost On

    <Proxy *>

          Require all granted

    </Proxy>

    ProxyPass / balancer://tcsrvs/   #把所有请求映射到tcsrvs

    ProxyPassReverse / balancer://tcsrvs/

    <Location />

          Require all granted

    </Location>

</VirtualHost>

测试略

附httpd反代相关设置:

http集群调度算法:
     byrequests:轮询(默认)
     bybusyness:加权轮询
     bytraffic:基于流量调度
定义后端调度主机状态status:
     D:相当于down不接受请求
     I:强行设置为健康
     H:热备,相当于backup
     E:错误
     N:不接受新请求

3. httpd + tomcat cluster (ajp协议)

httpd服务器部署反向代理虚拟服务器vim /etc/httpd/conf.d/tom-ajp.conf

<proxy balancer://tcsrvs>

    BalancerMember ajp://172.18.43.72:8009  

    BalancerMember ajp://172.18.43.73:8009  

    ProxySet lbmethod=byrequests        

</Proxy>

<VirtualHost *:80>

    ServerName lb.magedu.com

    ProxyVia On

    ProxyRequests Off  

    ProxyPreserveHost On

    <Proxy *>

          Require all granted

    </Proxy>

    ProxyPass / balancer://tcsrvs/  

    ProxyPassReverse / balancer://tcsrvs/

    <Location />

          Require all granted

    </Location>

</VirtualHost>


4. 关于httpd内置集群代理管理页面的配置

在如上设置中加入如下代码:

<Location /balancer-manager>

          SetHandler balancer-manager    #启用内建处理器

          ProxyPass !      #访问这个URL时不向后端代理

          Require all granted     #真正使用时管理页面不应都可访问

</Location>

访问URL进行访问效果如图:

技术分享

可在此页面进行管理调度算法,后端主机状态权重等。


实现Tomcat会话保持的三种方式:


1.基于http模块route标签实现会话粘性

1.1 http服务器与上面相比添加内容如下:


Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED #新

<proxy balancer://tcsrvs>

    BalancerMember ajp://172.18.43.72:8009 route=TomcatA  #新加

    BalancerMember ajp://172.18.43.73:8009 route=TomvatB #新加

    ProxySet lbmethod=byrequests

    ProxySet stickysession=ROUTEID #新加

1.2 修改两台后端tomcat主机

在Engine标签里面(在105行附近)加入jvmRoute="Tomcat*"

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">  #主机A

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">  #主机B

测试实现会话粘性

2. Tomcat 会话复制集群


2.1 httpd主机注释或删除上例中添加部分

2.2 编辑两台后端tomcat主机server.xml配置文件

确保server.xml配置文件Engine的jvmRoute属性配置正确(如上例TomcatA,TomcatB),将下列配置放置于<engine>或<host>中,注意各节点配置不同

<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.250.43"  #tomcat主机同步多播地址,适当修改

              port="45564"

              frequency="500"  #每隔多久发一次信息(毫秒)

              dropTime="3000"/>  #超时多久判定为故障

          <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

            address="172.18.43.72"   #填写本tomcat主机ip地址

            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.MessageDispatch15Interceptor"/>

          </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.JvmRouteSessionIDBinderListener"/>

          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

          </Cluster>

2.3 添加<distributable/>元素

拷贝tomcat自带模板到test的WEB-INF下面:

cp /etc/tomcat/web.xml /var/lib/tomcat/webapps/test/WEB-INF/web.xml

编辑WEB-INF/web.xml,添加<distributable/>元素

vim web.xml

在任意非注释区域添加:<distributable/>

2.4 抓包测试,可看到两台主机互相通信实现会话复制

技术分享

浏览器测试已实现会话粘性

3. session会话保持之session服务器(memcached)


3.1  memcached介绍

      Memcached 是一款高效高性能的旁挂式数据缓存系统,设计简单,程序短小。即只将数据存贮至内存中,而不写入至硬盘,成为缓存系统, memcached 存储的是 kv 类型数据.所有的缓存都是 kv 类型的数据,并且 memcached 中缓存的数据可以被修改,因为 memcached 的缓存数据存在于内存中所以,服务器宕机,数据丢失,所以只能作为缓存使用,而不能当做存储使用.

      memcached 支持互不通信的集群,作为旁挂式缓存系统。需要程序主动与 memcached 进行交互通信。并且memcached 一般用于存储 session。即作为 session 服务器使用。

采用了惰性管理,即该清理掉的数据被标记为不可用,然后在新数据到达时,进行覆盖。

3.2 实验环境

构建一台httpd反向代理,两台后端tomcat服务器(兼memcached)。操作方法见上例 [集群之 3 httpd + tomcat cluster (ajp协议)]

主体架构:Clients–>172.18.43.71(httpd)–>(tomcatA, tomcatB)–> (n1<–> n2)

技术分享

3.3.配置tomcat

memcache不支持流式数据存储,需借助memcached-session-manager转化信息。

memcached-session-manager项目地址:

http://code.google.com/p/memcached-session-manager/

https://github.com/magro/memcached-session-manager

下载如下jar文件至各tomcat节点的tomcat安装目录下的lib目录中,其中的${version}要换成你所需要的版本号,tc${6,7,8}要换成与tomcat版本相同的版本号。

实验所用包一览:

memcached-session-manager-${version}.jar
memcached-session-manager-tc${6,7,8}-${version}.jar
spymemcached-${version}.jar
msm-javolution-serializer-${version}.jar
javolution-${version}.jar

分别在两个tomcat上的某host上定义一个用于测试的context容器,并在其中创建一个会话管理器,如下所示:

<Context path="/test" docBase="test" reloadable="true">

              <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

                memcachedNodes="n1:172.18.43.72:11211,n2:172.18.43.73:11211"

                failoverNodes="n2"

                requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

                transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"

              />

             </Context>

重启tomcat,memcache服务

3.4 测试

在浏览器中访问http://172.18.43.71/test/index.jsp,不断刷新,结果如下所示,其session ID在负载均衡环境中保持不变。

技术分享

从测试结果可以看出,现在启用会话共享服务的memcache节点为n1,此时将n1节点的memcache关闭;

刷新页面:

技术分享

此时,其session ID在负载均衡环境中保持不变,只是提供memcache服务的节点转为n2;

实现了基于memcache的会话保持集群;


本文出自 “linux运维” 博客,请务必保留此出处http://arm2012.blog.51cto.com/2418467/1980459

以上是关于tomcat 集群及会话保持实验示例的主要内容,如果未能解决你的问题,请参考以下文章

apache反向代理tomcat的两个代理模式及相关的会话保持配置示例

实现基于tomcat集群会话保持

tomcat session会话保持实验-之Nginx+tomcat+memcached

基于tomcat集群会话保持

Nginx+tomcat session cluster会话保持实验

实现tomcat基于session会话保持