Apache httpd与tomcat集群

应用的开发

 首先,我需要开发一个web应用,来测试我的集群,于是,我创建了一个动态web项目,取名叫sessiontest. 在此项目中,只有两个jsp文件。

 第一个select.jsp. 这个文件相当于一个购物车,将用户选中的内容提交,并展示用户选中的物品。
01    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
 02    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 03    <html>
 04      <head>
 05        <title>Your selections</title>
 06      </head>
 07      <body>
 08        <% 
 09        String selections = (String)session.getAttribute("selections");
 10        selections=selections==null?"":selections;
 11        %>
 12        <form action="successful.jsp" method="post">
 13          <p>What do you prefer?</p>
 14          <p><input type="checkbox" name="car" value="car" <%
 15            if(selections.indexOf("car")>-1) out.print("checked=\"checked\""); %> />Car</p>
 16          <p><input type="checkbox" name="bike" value="bike" <% 
 17            if(selections.indexOf("bike")>-1) out.print("checked=\"checked\""); %> />Bike</p>
 18          <p><input type="checkbox" name="train" value="train" <% 
 19            if(selections.indexOf("train")>-1) out.print("checked=\"checked\""); %> />Train</p>
 20          <p><input type="checkbox" name="plane" value="plane" <% 
 21            if(selections.indexOf("plane")>-1) out.print("checked=\"checked\""); %> />Plane</p>
 22          <input type="submit" value="Submit" />
 23        </form>
 24      </body>
 25    </html>

第二个文件是successful.jsp, 它将select.jsp提交的选项包存入session中。
01    <%@ page language="java" contentType="text/html; charset=UTF-8"
 02        pageEncoding="UTF-8"%>
 03    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 04    <html>
 05    <head>
 06    <title>Successful</title>
 07    </head>
 08    <body>
 09    <%
 10      StringBuffer sb = new StringBuffer();
 11      if (null !=request.getParameter("car"))sb.append("car;");
 12      if (null !=request.getParameter("bike"))sb.append("bike;");
 13      if (null !=request.getParameter("train"))sb.append("train;");
 14      if (null !=request.getParameter("plane"))sb.append("plane;");
 15     
 16      session.setAttribute("selections", sb.toString());
 17    %>
 18    Successful, please go back to check.<br>
 19    <a href="select.jsp">Back</a>
 20    </body>
 21    </html>

将项目导出为sessiontest.war,并部署到tomcat中的用户界面为:

http://localhost:8080/sessiontest/select.jsp

 http://localhost:8080/sessiontest/successful.jsp

接下来,我会使用这个web应用来测试我的集群。
 最简单的集群

 如下图所示,最简单的集群并不是一个真正的集群,tomcat1和tomcat2只是运行了同一个应用,比如我的sessiontest.war, 它们两个之间并没有任何通信,共享。Apache只是根据访问量进行负载平衡。一旦其中一个tomcat关机,所有的request都将被转发到另一个tomcat上去。而之前工作在第一个tomcat上的用户会丢失信息,比如session,运行环境。

    首先在本机上安装两个tomcat, 也就是生成2分tomcat的copy。下面将这两个tomcat分别以tomcat1和tomcat2命名。

    维持tomcat1的port的配置,但需要向其server.xml中添加一个属性 jvmRoute="node1":
    1    <Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">

     修改tomcat2的port的配置,并向其server.xml中添加一个属性 jvmRoute="node2":
    1    <Server port="8006" shutdown="SHUTDOWN">
     2    <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
     3    <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
     4    <Engine name="Catalina" defaultHost="localhost" jvmRoute="node2">

     将之前的应用sessiontest.war分别部署到两个tomcat上。测试localhost:8080/sessiontest/select.jsp和localhost:8081/sessiontest/select.jsp。这样,集群的两个node就跑起来了。

    配置apache httpd,开启负载平衡。基于上一篇文章配好的 的网站,我将把集群挂在这个网站下面,将下面的配置加入virtualhost中。不要忘记开启proxy_balancer module。
    01    <VirtualHost *:443>
     02       ServerName 
     03       ProxyPass /sessiontest balancer://mycluster 
     04       <Proxy balancer://mycluster>
     05          BalancerMember ajp://127.0.0.1:8009/sessiontest loadfactor=1 route=node1
     06          BalancerMember ajp://127.0.0.1:8010/sessiontest loadfactor=1 route=node2
     07          ProxySet stickysession=JSESSIONID
     08          ProxySet lbmethod=byrequests
     09       </Proxy>
     10    </VirtualHost>

     stickysession的意义在于,一个用户可以根据其cookie中的jsessionid固定的访问一个tomcat,这样不会在两个tomcat之间跳来跳去而丢失运行信息和session。

 开启集群节点之间的通信

 接下来,我将开启tomcat1和tomcat2之间的通信,这样它们可以共享session和一些内存信息。一个正在tomcat1上访问的用户,因为tomcat1的关机而转移到tomcat2上,也不会丢失session信息了。

    修改原web应用,在sessiontest的web.xml中添加一段。表明此应用需要在cluster之间进行同步。然后重新部署此应用。
    1    <distributable/>

     分别修改tomcat1和tomcat2的server.xml,加入相同的一段代码。 Tomcat使用组播技术,使得各个node之间建立连接,唯一需要声明的是你的Recervier端口,在4000-4999之间任选一个。
    01            <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
     02                     channelSendOptions="8">
     03     
     04              <Manager className="org.apache.catalina.ha.session.DeltaManager"
     05                       expireSessionsOnShutdown="false"
     06                       notifyListenersOnReplication="true"/>
     07     
     08              <Channel className="org.apache.catalina.tribes.group.GroupChannel">
     09                <Membership className="org.apache.catalina.tribes.membership.McastService"
     10                            address="228.0.0.4"
     11                            port="45564"
     12                            frequency="500"
     13                            dropTime="3000"/>
     14                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
     15                          address="auto"
     16                          port="4444"
     17                          autoBind="100"
     18                          selectorTimeout="5000"
     19                          maxThreads="6"/>
     20     
     21                <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
     22                  <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
     23                </Sender>
     24                <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
     25                <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
     26              </Channel>
     27     
     28              <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
     29                     filter=""/>
     30              <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
     31     
     32              <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
     33                        tempDir="/tmp/war-temp/"
     34                        deployDir="/tmp/war-deploy/"
     35                        watchDir="/tmp/war-listen/"
     36                        watchEnabled="false"/>
     37     
     38              <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
     39            </Cluster>

     分别启动tomcat1和tomcat2.请等一个启动完再启动另一个。集群创建完毕。

    为了测验集群,我将负载平衡的stickysession关掉。请注释掉配置中的ProxySet stickysession=JSESSIONID. 重启apache. 这时候用户的request会在tomcat1和tomcat2之间跳来跳去。

    访问 你会发现即使request在两个tomcat之间跳来跳去,但购物车里的信息永远不会丢失。

转载于:https://my.oschina.net/u/1169079/blog/201798

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值