zoukankan      html  css  js  c++  java
  • Apache+Tomcat负载均衡两种session共享方式的设置

    session共享有两种方式:

    1、session共享,多个服务器session拷贝保存,一台宕机不会影响用户的登录状态;

    2、请求精确集中定位,即当前用户的请求都集中定位到一台服务器中,这样单台服务器保存了用户的session登录信息,如果宕机,则等同于单点部署,会丢失;

    apache中针对上述两个方法提供了不同的配置项:

     sessionreplication:会话复制,即上述的方法一;

     sessionsticky:会话不复制,即上述的方法二;

    -------------------------------

    选取Apache HTTP Server作为前端的负载服务器,后端选取两个Tomcat作集群。

    一、采用粘性Session

    这种方式将同一用户的请求转发到特定的Tomcat服务器上,避免了集群中Session的复制,缺点是用户只跟一种的一台服务器通信,如果此服务器down掉,那就废了。
    采用的model为mod_proxy_ajp.so,整个配置在tomcat的配置文件中都有相关的注释,只需作相应修改就OK。
    我们选取的是Apache HTTP Server2.2.4,Tomcat5.5.16。
    首先安装Apache HTTP Server,然后修改其配置文件http.conf,首先load三个model,代码如下:

    LoadModuleproxy_module modules/mod_proxy.so
    LoadModuleproxy_ajp_module modules
    /mod_proxy_ajp.so
    LoadModuleproxy_balancer_module modules
    /mod_proxy_balancer.so
    然后在此配置文件末端加入以下代码:
    ProxyPass/ balancer://tomcatcluster/ lbmethod=byrequestsstickysession=JSESSIONID nofailover=Off timeout=5maxattempts=3  
    ProxyPassReverse/balancer://tomcatcluster/   
      
    <Proxybalancer://tomcatcluster>  
    BalancerMemberajp://localhost:8009route=a  
    BalancerMemberajp://localhost:9009 route=b
    </Proxy>

    以上代码配置了Proxy的相关参数,<Proxy>模块定义了均衡负载的配置,其中两个TomcatServer都配置在同一台服务器上,端口分别为8009、9009,并配置各自的route,这样ApacheServer就能根据route将请求转发给特定的Tomcat。
    接下来修改Tomcat的server.xml文件,如下:
    <!--Define an AJP 1.3 Connector on port 8009-->
        
    <Connectorport="8009"
                   enableLookups
    ="false"redirectPort="8443"protocol="AJP/1.3"/>
    其中的port为前面<Proxy>中设定的端口,还要配置其route,代码如下:
    <!--Define the top level container in ourcontainer hierarchy-->
        
    <Enginename="Catalina"defaultHost="localhost"jvmRoute="a">
    jvmRoute也须同前面的设置一样。

    下面用JMeter对配置后的负载均衡做一测试,首先先启动两个Tomcat Server,随后启动ApacheServer,在JMeter中新建测试计划,在两个TomcatServer中的jsp-examples下新建test.jsp(此jsp自己随便写两句就成),然后进行测试,以下是部分取样器结果:
    HTTPresponse headers:
    HTTP/1.1200 OK
    Date:Wed, 11 Jul 2007 02:17:55 GMT
    Set-Cookie:JSESSIONID=AC7EF1CAA8C6B0FEB68E77D7D375E2AF.b;Path=/jsp-examples
    Content-Type:text/html;charset=ISO-8859-1
    Content-Length:3
    Keep-Alive:timeout=5, max=79
    Connection:Keep-Alive

    以上红色代码表示用户的http请求中的JSESSIONID中已经附带了route后缀,.b表示此请求将转发到route为b的TomcatServer上,你将会发现其中的一部分请求的JSESSIONID后缀为.a,也就是转发给route为a的TomcatServer上。

    二、采用Session复制

    修改apache http server配置文件http.conf,首先load三个model,代码如下:

    LoadModuleproxy_module modules/mod_proxy.so
    LoadModuleproxy_ajp_module modules
    /mod_proxy_ajp.so
    LoadModuleproxy_balancer_module modules
    /mod_proxy_balancer.so

    然后在此配置文件末端加入以下代码:

    ProxyPass/ balancer://tomcatcluster/

    ProxyPassReverse/balancer://tomcatcluster/   
      
    <Proxybalancer://tomcatcluster>  
    BalancerMemberajp://localhost:8009route=a  
    BalancerMemberajp://localhost:9009 route=b
    </Proxy>

    接下来修改Tomcat的server.xml文件,如下:
    <!--Define an AJP 1.3 Connector on port 8009-->
        
    <Connectorport="8009"
                   enableLookups
    ="false"redirectPort="8443"protocol="AJP/1.3"/>
    其中的port为前面<Proxy>中设定的端口,还要配置其route,代码如下:
    <!--Define the top level container in ourcontainer hierarchy-->
        
    <Enginename="Catalina"defaultHost="localhost"jvmRoute="a">

    jvmRoute也须同前面的设置一样。
    另外,还需要在tomcat中将以下配置打开:

     <ClusterclassName="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"/>

               <ValveclassName="org.apache.catalina.cluster.tcp.ReplicationValve"
                      filter=".*.gif;.*.js;.*.jpg;.*.png;.*.htm;.*.html;.*.css;.*.txt;"/>
                      
               <DeployerclassName="org.apache.catalina.cluster.deploy.FarmWarDeployer"
                         tempDir="/tmp/war-temp/"
                         deployDir="/tmp/war-deploy/"
                         watchDir="/tmp/war-listen/"
                         watchEnabled="false"/>
                         
               <ClusterListenerclassName="org.apache.catalina.cluster.session.ClusterSessionListener"/>
           </Cluster>
    最后,要在我们的应用程序里的web-inf下的web.xml文件<web-app>元素的最后加上:<distributable/> 。


     

  • 相关阅读:
    Element filtername is not allowed here-web.xml version="3.0"-intellij idea
    探究JavaScript闭包
    telnet的安装和使用
    Oracle数据库常用的sql语句
    centos6上安装jenkins
    idea的maven项目不知道为啥下载不下来jar包,看本地仓库只是下载了一下xml文件,没有jar包问题
    Oracle数据库使用mybatis的时候,实体类日期为Date类型,mybatis里面定义的是Date类型,插入的时候,时分秒全部是12:00:00问题
    maven打包某个分支的包
    maven打包到私服,打的是war包,好郁闷
    多线程初学习
  • 原文地址:https://www.cnblogs.com/leeeee/p/7276561.html
Copyright © 2011-2022 走看看