zoukankan      html  css  js  c++  java
  • apache tomcat 6集群负载和session复制(转)

    来源:http://jackandroid.javaeye.com/blog/627147

    无意间看到tomcat 6集群的内容,就尝试配置了一下,还是遇到很多问题,特此记录。apache服务器和tomcat的连接方法其实有三种:JK、http_proxy和ajp_proxy。本文主要介绍最为常见的JK。

    环境:PC2台:pc1(IP 192.168.88.118)安装了apache和tomcat

                         pc2(IP 192.168.88.168)安装了tomcat

             系统 win xp sp3

      1.安装tomcat、apache服务器及版本对应的JK

      这里需要注意的是JK版本必须与apache服务器版本号对应,可以直接从我参考附件下载。apache_home表示apache服务器安装目录.

      2.配置apache服务器

      2.1 httpd.conf文件

     apache_home目录下的conf/httpd.conf文件中添加

    Xml代码 
    1. LoadModule jk_module modules/mod_jk-1.2.26-httpd-2.2.4.so  
    2. JkWorkersFile conf/workers.properties  
    3. JkMount /* lbcontroller   

     具体的说明如下:

    Xml代码 
    1. LoadModule jk_module modules/mod_jk-1.2.26-httpd-2.2.4.so  

     表示载入JK模块。

    Xml代码 
    1. JkWorkersFile conf/workers.properties  

    tomcat实例配置,具体参见2.2。

    Xml代码 
    1. JkMount /* lbcontroller   

      设置apache分发器,/*表示apache将所有文件都由分发器lbcontroller 进行分发,你可以自行设置*.jsp,*.do等 

      2.2 workers.properties文件

    在apache_home下conf目录中新建workers.properties文件,输入以下内容

    Xml代码 
    1. worker.list=lbcontroller  
    2.   
    3. #Tomcat1实例配置  
    4. worker.tomcat1.host=192.168.88.118  
    5. worker.tomcat1.port=8009  
    6. worker.tomcat1.type=ajp13  
    7. #分发权重 值越大负载越大  
    8. worker.tomcat1.lbfactor = 1  
    9.   
    10. #Tomcat2实例配置  
    11. worker.tomcat2.host=192.168.88.168  
    12. worker.tomcat2.port=9009  
    13. worker.tomcat2.type=ajp13  
    14. #分发权重 值越大负载越大  
    15. worker.tomcat2.lbfactor = 1  
    16.   
    17. #负载均衡分发控制器  
    18. worker.lbcontroller.type=lb  
    19. worker.lbcontroller.balance_workers=tomcat1,tomcat2  
    20. worker.lbcontroller.sticky_session=True  

     在这里

    Xml代码 
    1. worker.list=lbcontroller  

     内容即为httpd.conf文件中的分发器名称。需要注意的内容是,tomcat实例名称

    Xml代码 
    1. worker.tomcat1.host=....  
    2. ...  
    3. worker.tomcat2.host=....  
    4. ...  

     在这里就是tomcat1和tomcat2必须与之后tomcat中的server.xml中jvmRoute值一致。

    3.tomcat集群配置

    配置每个tomcat目录下的server.xml文件,具体修改内容如下

    3.1 Engine配置

    修改前

    Xml代码 
    1. <Engine name="Catalina" defaultHost="localhost">  

    修改后

    Xml代码 
    1. <Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcat1" >  

     具体tomcat中jvmRoute的值根据在workers.properties的配置,注意IP地址、tomcat实例名称和jvmRoute值必须一一对应。

    3.2 Connector配置

    修改前

    Xml代码 
    1. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />  

    修改后

    Xml代码 
    1. <Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />  

     这里tomcat的port值必须与在workers.properties中的port值一致。

    3.3 Cluster配置

    修改前

    Xml代码 
    1. <!-- 
    2. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" > 
    3. -->  

     修改后,去掉注释并添加一些内容如下

    Xml代码 
    1. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  channelSendOptions="8">     
    2.         
    3.        <Manager className="org.apache.catalina.ha.session.DeltaManager"    
    4.                 expireSessionsOnShutdown="false"    
    5.                 notifyListenersOnReplication="true"/>     
    6.   
    7.        <Channel className="org.apache.catalina.tribes.group.GroupChannel">     
    8.          <Membership className="org.apache.catalina.tribes.membership.McastService"    
    9.                      address="228.0.0.4"    
    10.                      port="45564"    
    11.                      frequency="500"    
    12.                      dropTime="3000"/>     
    13.          <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"    
    14.                     address="auto"  
    15.                    port="4001"    
    16.                    autoBind="100"    
    17.                    selectorTimeout="5000"    
    18.                    maxThreads="6"/>     
    19.          <!-- timeout="60000"-->     
    20.          <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">     
    21.            <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />     
    22.          </Sender>     
    23.          <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>     
    24.          <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>     
    25.          <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>     
    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.        <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>     
    33.        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>     
    34.      </Cluster>  

     上述配置跟tomcat官方建议的配置,去掉了

    Xml代码 
    1. <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"  
    2.                    tempDir="/tmp/war-temp/"  
    3.                    deployDir="/tmp/war-deploy/"  
    4.                    watchDir="/tmp/war-listen/"  
    5.                    watchEnabled="false"/>  

     如果不去掉这部分,则tomcat启动会报"FarmWarDeployer can only work as host cluster subelement!."

    3.4 session复制配置

    tomcat集群中的session管理,主要有两种方式:

    1).粘性session

    表示从同一窗口发来的请求都将有集群中的同一个tomcat进行处理。配置方式是在上面workers.properties文件中

    Xml代码 
    1. worker.lbcontroller.sticky_session=True   

    粘性session的好处在不会在不同的tomcat上来回跳动处理请求,但是坏处是如果处理该session的tomcat崩溃,那么之后的请求将由其他tomcat处理,原有session失效而重新新建一个新的session,这样如果继续从session取值,会抛出nullpointer的访问异常。

    2).session复制

    session复制是指tomcat彼此之间通过组播方式将session发到各个tomcat实例上,如果其中一个访问出错,则另外tomcat仍然具有有效的session内容,从而能正常接管其session。坏处是当tomcat实例很多,或者用户在session中有大量操作时,组播发送的信息量十分惊人。session复制配置则是在发布的web应用程序中的web.xml中添加

    Xml代码 
    1. <distributable/>  

     此外,session复制所需的JDK必须是JDK 5.0及其以上版本。

    4.测试

    1) 先启动apache服务器httpd

    2) 启动名为tomcat2的服务器

     在浏览器中输入访问地址http://localhost/test/index.html

     可以看到请求被转发到了tomcat2进行处理

    3)启动tomcat 1 ,界面如下

     可以发现,tomcat1启动后搜索到了tomcat2实例,并进行了session复制。在tomcat2的控制台也可以找到如下输出

     4)关闭tomcat 2,后继续刷新url访问。tomcat1控制台中输出的session 依然与之前tomcat2中的一致,并且在session中保存的属性值仍然有效。

    5.问题

    上面的配置是在两台不同的配置上进行,tomcat负载和session复制都成功了。但是如果在同一台机子上配置,则session复制总是不能成功,搜索了很多解决方式都不正确。

  • 相关阅读:
    Nginx使用GeoIP模块来限制地区访问
    CenTOS7使用ACL控制目录权限,只给某个用户访问特定目录
    CentOS配置服务开机自启
    设置普通用户输入sudo,免密进入root账户
    Centos安装git并配置ssh
    ThreadLocal线程隔离
    Spring cloud 超时配置总结
    Hystrix超时测试
    mysql limit分页查询效率比拼
    linux CPU100%异常排查
  • 原文地址:https://www.cnblogs.com/yuanermen/p/1733957.html
Copyright © 2011-2022 走看看