Apache2.2+Tomcat5.5集群和负载均衡

日期: 2008-06-30 作者:bsspirit 来源:TechTarget中国

  网上这部分的文篇很多,并且我也是看网上的文篇试出来的,不过还是试了好多遍。其实,集群并不难,难的是负载均衡。


  首先,我的环境为:


  apache_2.2.9-win32-x86-no_ssl-r2.msi,
  mod_jk-1.2.26-httpd-2.2.4.so,
  jdk1.5.0_07,
  apache-tomcat-5.5.26.zip,
  jakarta-jmeter-2.3.2.zip
Apache2.2 + Tomcat5.5 集群和负载均衡
 
  网上这部分的文篇很多,并且我也是看网上的文篇试出来的,不过还是试了好多遍。其实,集群并不难,难的是负载均衡。现在还有一些问题,不知道是怎么回事,后面慢慢解决。


  首先,我的环境为:


  apache_2.2.9-win32-x86-no_ssl-r2.msi,
  mod_jk-1.2.26-httpd-2.2.4.so,
  jdk1.5.0_07,
  apache-tomcat-5.5.26.zip,
  jakarta-jmeter-2.3.2.zip


  先配置Tomcat的集群:(这部分其实很简单,我在一台机器上做的)


  1. 解压Tomcat,再复制1份。 分别叫:tomcat5-clustor1,tomcat5-clustor2
  2. 修改tomcat5-clustor2的端口,(因为是在同一台机器上)


  修改:


  <Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”worker2″>


  修改:(把注示去掉)


  <Cluster className=”org.apache.catalina.cluster.tcp.SimpleTcpCluster”
               managerClassName=”org.apache.catalina.cluster.session.DeltaManager”
                 expireSessionsOnShutdown=”false”
                 useDirtyFlag=”true”
                 notifyListenersOnReplication=”true”>


            <Membership
                className=”org.apache.catalina.cluster.mcast.McastService”
                mcastAddr=”228.0.0.4″
                mcastPort=”45564″
                mcastFrequency=”500″
                mcastdropTime=”3000″/>


            <Receiver
                className=”org.apache.catalina.cluster.tcp.ReplicationListener”
                tcpListenAddress=”auto”
                tcpListenPort=”4001″
                tcpselectorTimeout=”100″
                tcpThreadcount=”6″/>


            <Sender
                className=”org.apache.catalina.cluster.tcp.ReplicationTransmitter”
                replicationMode=”pooled”
                ackTimeout=”15000″
                waitForAck=”true”/>


            <Valve className=”org.apache.catalina.cluster.tcp.ReplicationValve”
                   filter=”.*.gif;.*.js;.*.jpg;.*.png;.*.htm;.*.html;.*.css;.*.txt;”/>
                  
            <Deployer className=”org.apache.catalina.cluster.deploy.FarmWarDeployer”
                      tempDir=”/tmp/war-temp/”
                      deployDir=”/tmp/war-deploy/”
                      watchDir=”/tmp/war-listen/”
                      watchEnabled=”false”/>
                     
            <ClusterListener className=”org.apache.catalina.cluster.session.ClusterSessionListener”/>
        </Cluster>


  修改tomcat5-clustor1的端口,(因为是在同一台机器上)


  打开server.xml文件:


  修改:


  <Server port=”8006″ shutdown=”SHUTDOWN”>


  修改:


  <!– Define a non-SSL HTTP/1.1 Connector on port 8080 –>


  <Connector port=”8081″ maxHttpHeaderSize=”8192″
               maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
               enableLookups=”false” redirectPort=”8443″ acceptcount=”100″
               connectionTimeout=”20000″ disableUploadTimeout=”true” />


  修改:


  <!– Define an AJP 1.3 Connector on port 8009 –>
    <Connector port=”8010″
               enableLookups=”false” redirectPort=”8444″ protocol=”AJP/1.3″ />


  修改:


  <Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”worker1″>


  修改:(把注示去掉)


  <Cluster className=”org.apache.catalina.cluster.tcp.SimpleTcpCluster”
                 managerClassName=”org.apache.catalina.cluster.session.DeltaManager”
                 expireSessionsOnShutdown=”false”
                 useDirtyFlag=”true”
                 notifyListenersOnReplication=”true”>


            <Membership
                className=”org.apache.catalina.cluster.mcast.McastService”
                mcastAddr=”228.0.0.4″
                mcastPort=”45564″
                mcastFrequency=”500″
                mcastdropTime=”3000″/>


            <Receiver
                className=”org.apache.catalina.cluster.tcp.ReplicationListener”
                tcpListenAddress=”auto”
                tcpListenPort=”4002″
                tcpselectorTimeout=”100″
                tcpThreadcount=”6″/>


            <Sender
                className=”org.apache.catalina.cluster.tcp.ReplicationTransmitter”
                replicationMode=”pooled”
                ackTimeout=”15000″
                waitForAck=”true”/>


            <Valve className=”org.apache.catalina.cluster.tcp.ReplicationValve”
                   filter=”.*.gif;.*.js;.*.jpg;.*.png;.*.htm;.*.html;.*.css;.*.txt;”/>
                  
            <Deployer className=”org.apache.catalina.cluster.deploy.FarmWarDeployer”
                      tempDir=”/tmp/war-temp/”
                      deployDir=”/tmp/war-deploy/”
                      watchDir=”/tmp/war-listen/”
                      watchEnabled=”false”/>
                     
            <ClusterListener className=”org.apache.catalina.cluster.session.ClusterSessionListener”/>
        </Cluster>
 
  修改比较


  tomcat5-clustor1 tomcat5-clustor2
  <Server port> 8006
  8005
 
  <Connector port>(Http) 8081
   8080
 
  <Connector port>(AJP)  8010
   8009
 
  <Engine jvmRoute> worker1
   worker2
 
  <Receiver tcpListenPort> 4002
   4001
 
  3. 完成集群: 重起两个Tomcat,如果不报错,可以正常运行。


  4. 写一个JSP小程,测试一下集群。


  JSP文件如下:


  <%@ page language=”java” %>
  <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
  <html>
    <head>
      <title>Clustor</title>
    </head>
   <body>
   <%
       out.println(session.getId());
       String name = (String)request.getParameter(“name”);
       String tmp = (String)session.getAttribute(“name”);
       session.setAttribute(“name”,tmp+” , “+name);
    
     if(name!=null && !name.equalsIgnoreCase(“”)){
         out.println(session.getAttribute(“name”));
     }
    
     String path = request.getContextPath();
     String basePath = request.getScheme()+”://”+request.getServerName()+”:”+request.getServerPort()+path+”/”;
     out.println(“<hr/>”+basePath);
%>
    <h1>Clustor1</h1>
    <form action=”index.jsp” method=”get”>
        <input type=”text” name=”name” value=”conan”>
        <input type=”submit” value=”Submit”>
    </form>
  </body>
</html>


  创建web.xml文件:
  <?xml version=”1.0″ encoding=”UTF-8″?>
  <web-app version=”2.5″
   
    xsi_schemaLocation=”http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”>
    <display-name>clustor</display-name>
    <distributable />
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
  </web-app>


  5. 打包,部署war工程


  6. 在浏览器进行测试,同一个浏览打开下面的网页,可以看到,两个不同的tomcat,sessionId是一样,实现集群的功能。


  http://localhost:8081/Clustor/index.jsp?name=conan1
  http://localhost:8080/Clustor/index.jsp?name=conan2


  7. Tomcat自带的负载平衡(转发功能,非标准的负载平衡)
Tomcat的发行包,自带了一个balancer工程,在tomcat5-clustor1webappsbalancer目录下面。


  我们可以在balancer工程的balancerWEB-INFconfigrules.xml中,配置转发功能。


  <?xml version=”1.0″ encoding=”UTF-8″?>
  <rules>
    <!– If the URL contains News (case-sensitive), go to CNN.com –>
    <rule   className=”org.apache.webapp.balancer.rules.URLStringMatchrule”
    targetString=”News”
    redirectUrl=”http://www.cnn.com” />


  <!– If the request contains a parameter named paramName whose value
       is paramValue, go to Yahoo.com. –>
  <rule className=”org.apache.webapp.balancer.rules.RequestParameterRule”
    paramName=”paramName”
    paramValue=”paramValue”
    redirectUrl=”http://www.yahoo.com” />


    <!– Redirect all requests to jakarta.apache.org. –>
    <rule className=”org.apache.webapp.balancer.rules.AcceptEverythingRule”
      redirectUrl=”http://jakarta.apache.org” />
  </rules>


  修改上面的文件为:


  <?xml version=”1.0″ encoding=”UTF-8″?>
  <rules>
    <!– If the URL contains News (case-sensitive), go to CNN.com –>
    <rule   className=”org.apache.webapp.balancer.rules.URLStringMatchrule”
      targetString=”clustor1″
      redirectUrl=”http://localhost:8080/Clustor/index.jsp” />


    <!– If the request contains a parameter named paramName whose value
       is paramValue, go to Yahoo.com. –>
  <rule className=”org.apache.webapp.balancer.rules.RequestParameterRule”
    paramName=”clustor”
    paramValue=”2″
    redirectUrl=”http://localhost:8081/Clustor/index.jsp” />


    <!– Redirect all requests to jakarta.apache.org. –>
    <rule   className=”org.apache.webapp.balancer.rules.AcceptEverythingRule”
      redirectUrl=”http://localhost:8081/Clustor/index.jsp />
  </rules>


  8. 测试一下:


  浏览器输入:


  http://localhost:8080/balancer/clustor1  转向到    http://localhost:8080/Clustor/index.jsp
  浏览器输入:
  http://localhost:8080/balancer/abc?clustor=2  转向到    http://localhost:8081/Clustor/index.jsp


  9. Tomcat的balancer工程测试完成。


  10. 通过apache 的 mod_jk 进行对Tomcat的负载均衡。
  11. 安装好Apache服务器,复制mod_jk到Apache2.2manual的目录下面。
  12. 修改httpd.conf文件,在Apache2.2conf的目录下面。


  打开httpd.conf文件,# Example:下面,增加下面内容
  #
  # Example:
  # LoadModule foo_module modules/mod_foo.so
  #
  LoadModule jk_module modules/mod_jk.so


  # Put this in the main section of your configuration (or desired virtual host, if using Apache virtual hosts)
  JkWorkersFile conf/workers.properties
  JkLogFile logs/mod_jk.log
  JkLogLevel info


  JkMount /* router


  13. 保存文件。
  14. 新增workers.properties文件,在Apache2.2conf的目录下面。


  worker.list=router


  # Define a “local_worker” worker using ajp13
  worker.worker1.port=8009
  worker.worker1.host=localhost
  worker.worker1.type=ajp13
  worker.worker1.lbfactor=1
  worker.worker1.local_worker=1


  # Define another “local_worker” worker using ajp13
  worker.worker2.port=8010
  worker.worker2.host=localhost
  worker.worker2.type=ajp13
  worker.worker2.lbfactor=0
  worker.worker2.local_worker=2


  # Define the LB worker
  worker.router.type=lb
  worker.router.balanced_workers=worker1,worker2
  # worker.router.local_worker_only=1


  14. 保存文件
  15. 重起Apache服务器,没有报错,说明一切正常。
  16. 访问http://localhost/Clustor/index.jsp的地址, apache服务器,会显示刚才的JSP文件的内容。这是因为,Apache和Tomcat做了转发。
  17. 修改刚才的JSP文件,测试一下。


  在index.jsp中,增加 System.out.println(new Date().toLocaleString()+” : “+basePath);的输出语句,就会把日志打到Tomcat的命令行。
  我们访问http://localhost/Clustor/index.jsp的地址,会看到,输出在两个服务器之间转换。


  这样子,我们就完成了,一个简单的Apache+Tomcat的集群,和负载平衡的实例。
 
  18. 为了让效果明显一些,我用了JMeter,进行压力测试,让他不停的访问http://localhost/Clustor/index.jsp地址10000次,你会看到两个Tomcat的输出。


  配置好以后,“启动”。 查看两个tomcat的命令日志,你会发现你的集群和负载平衡配置成功。


  原文出处:http://gocom.primeton.com/blog10777_14478.htm

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国