• Linux下Apache与Tomcat的完全分布式集群配置(负载均衡)


    最近公司要给客户提供一套集群方案,项目组采用了Apache和Tomcat的集群配置,用于实现负载均衡的实现。

    由于以前没有接触过Apache,因此有些手生,另外在网上搜寻了很多有关这方面的集群文章,但是没有一篇是可以从头到尾,配置可以成功的,或者是文件不全,解释不清等。

    博主本人希望借这个机会,自己总结一份,用于分享使用。

    本集群采用ajp的方式来实现,方法简单易懂。实际上对于这种集群的配置,无非就是把需要的软件等下载后,修改相应的配置文件,最后依次启动即可。

    这里我把需要的应用软件和相应的配置文件贴出,大家可以对比自己的文件是否匹配。


    事先说明下,本人做的是完全分布式集群,也就是真正的在不同的虚拟机上做的操作。并不是在同一台机器上做的,因此如果各位在同一台机器上做该操作的话,不建议采纳。

    三台机器:

    系统:CentOS 5.x

    主节点:192.168.1.101

    子节点1:192.168.1.151

    子节点2:192.168.1.152


    1. 需要用到的软件:(具体安装步骤无需描述)

     apache 2.2.25  安装在主节点上     /opt/apache2

    apache-tomcat-6.0.37 安装在子节点1和子节点2上   /opt/apache-tomcat-6.0.37


    2.配置文件

    apache安装后,需要注意三个地方需要修改:

    1)ServerName localhost:80  该localhost为本地主机名,该主机名为hosts文件所显示的名字,配置错误的话,会出现   httpd:Could not reliably determine.......错误。

    2)在文件的最后需要配置以下文本,用于控制集群的成员。

    ProxyPass /images ! 
    ProxyPass /css ! 
    ProxyPass /js !
    
    ProxyRequests Off
    ProxyPass /test balancer://mycluster/ stickysession=JSESSIONID
    
    ProxyPassReverse /test balancer://mycluster/ stickysession=JSESSIONID
    <Proxy balancer://mycluster>
         BalancerMember ajp://192.168.1.152:8009/test/ route=worker1 loadfactor=1
         BalancerMember ajp://192.168.1.151:8009/test/ route=worker2 loadfactor=1
    </Proxy>
    SetHandler balancer-manager
    


    该配置为Apache的反向代理,用于通过apache去访问tomcat项目。test为博主的项目Context,两个BalanceMember是集群中的成员,分别是worker1和worker2。该名称需要与后面的tomcat的server.xml文件中的名称相一致。8009端口是tomcat的ajp端口名。

    最后的下面balancer-manager是用于查看负载均衡运行情况的路径配置。

    该文本需要添加在

    <IfModule ssl_module>
    SSLRandomSeed startup builtin
    SSLRandomSeed connect builtin
    </IfModule>

    的上面。

    3)最后还需要在

    ProxyPass /images ! 
    ProxyPass /css ! 
    ProxyPass /js !
    

    的上面加入下面配置:

    <Location /server-status>
         SetHandler balancer-manager
         Order Deny,Allow
         Deny from all
         Allow from all
    </Location>
    
    <Location /balancer-manager>
    
         SetHandler balancer-manager
         Order Deny,Allow
         Deny from all
         Allow from all
    
    </Location>


    有的朋友在网上找到的文章,配置的都正确,但是最后发现服务都可以启动,并且可以访问,但是没有实现负载均衡的效果,只是在单个节点上运行。

    本人也是遇到了这种问题,最后找了很长时间,才发现需要引入上面配置。

    至此为止,apache的配置就完成了,下面进行tomcat的配置。


    3.Tomcat配置文件

    首先说一点,Tomcat也只是配置一个文件,就是server.xml。并且里面的端口无需改动,因为是在真正的分布式中来实现的。只需要修改一个地方,就是Engine节点。

    在之前的Engine节点上,加入一个属性jvmRoute,值是刚才我们提到的worker1或worker2,具体配置如下:

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="worker2">
    
          <!--For clustering, please take a look at documentation at:
              /docs/cluster-howto.html  (simple how to)
              /docs/config/cluster.html (reference documentation) -->
          
          <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="192.168.1.152"
                          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> 


    上面的配置是我们提到的worker2的配置,是在子节点2上配置的,如果在子节点1上,则只需要将其改成worker1,另外还要把Receiver的address修改成当前所在机器的IP地址。

    最后把所要操作的项目放到tomcat的webapp下,另外项目本身的web.xml文件中,需要引入<distributable/>元素。

    至此为止,Tomcat的配置也完成了。


    4.启动测试

    启动的顺序在网上看到五花八门,本人自己测试是需要先启动Apache,然后依次启动Tomcat子节点。

    测试的地址  http://192.168.1.101:80/test

    测试查看的负载均衡情况地址   http://192.168.1.101:80/balancer-manager


    测试方法:我们可以在项目的index.jsp文件最后加入一段打印,如:

    <%
          system.out.println("==============");
    %>


    这样的话,我们开启两个tomcat的控制台去观察,如果在通过apache访问web地址以后,两个节点的控制台是交替打印的,则说明配置成功。


    以上是个人的总结,本人也是第一次配置该集群,如有不成熟的地方,请下面留言。









  • 相关阅读:
    《数据结构第一章复习》
    《图的基本操作》
    《矩阵的一些基本操作》
    <矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置>
    《两个二维数组(矩阵)相乘》
    C#隐藏与显示系统任务栏和开始菜单栏按钮
    C#通过窗体属性缩小一定尺寸时,无法再缩小窗体尺寸问题
    C#一个窗体调用另一个窗体的方法
    C#异步线程
    C#中MessageBox.Show问题(让提示窗口不显示在任务栏中)
  • 原文地址:https://www.cnblogs.com/james1207/p/3266596.html
Copyright © 2020-2023  润新知