• Tomcat Cluster


    此处仅讨论Tomcat 的LB集群,因为考虑到要实现会话保持,而实现会话保持的方法大体有三类:

      A.Session Sticky

        实现:nginx,httpd,haproxy,lvs等

      B.Session Cluster

        实现:tomcat session cluster + tomcat delta manager等

      C.Session Server

        实现:memcached,varnish等

    接下来将以LAMT来实践演示Tomcat的LB集群。

      A.基于Session Sticky的实现:

        环境:

          OS:Linux CentOS 6.8

          Tomcat:6.0

            IpAddr:192.168.1.101(srv_A),192.168.1.102(srv_B)

          Httpd:2.2.15

            IpAddr:192.168.1.104

        方式一:

          apache:mod_proxy,mod_proxy_http,mod_proxy_balancer  

            tomcat:http connector

        配置过程:

          Tomcat端主机配置不再赘述

          Httpd端主机配置:

    /*会话绑定方法*/
    Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e;path=/" env=BALANCER_ROUTE_CHANGED
    
    <Proxy balancer://testsrvs>
      BalancerMember http://192.168.1.101:8080/test route=srv_A loadfactor=1
      BalancerMember http://192.168.1.102:8080/test route=srv_B loadfactor=2
      ProxySet lbmethod=byrequests
      ProxySet stickysession=ROUTEID
    </Proxy>
    
    NameVirtualHost 192.168.1.104:80
    
    <VirtualHost 192.168.1.104:80>
      ServerName www.b.com
      ProxyRequests Off
      ProxyVia On
      ProxyPreserveHost On
      /*状态页,要放在ProxyPass之前*/
      <Location /balancer-manager>
        SetHandler balancer-manager
        ProxyPass !
        Allow from all
      </Location>
      ProxyPass / balancer://testsrvs/
      ProxyPassReverse / balancer://testsrvs/
      <Location />
            Allow from all
      </Location>
    </VirtualHost>

        配置参数详解:

    ProxyPreserveHost {On|Off}  //如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。
    ProxyVia {On|Off|Full|Block} //用于控制在http首部是否使用Via:主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。
    ProxyRequests {On|Off} //是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off。想要使用反向代理必须关闭正向代理
    ProxyPass [path] !|url [key=value key=value ...]] //将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。
    lbmethod //apache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载进行调度。
    maxattempts //放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数。
    nofailover //取值为On或Off,设置为On时表示后端服务器故障时,用户的session将损坏;因此,在后端服务器不支持session复制时可将其设置为On。
    stickysession //调度器的stickysession的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID。

        方式二:

          apache:mod_proxy,mod_proxy_ajp,mod_proxy_balancer

          tomcat:ajp connector

        配置与第一种方式大体一致,仅需修改协议和端口即可。

    Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e;path=/" env=BALANCER_ROUTE_CHANGED
    
    <Proxy balancer://testsrvs>
      BalancerMember ajp://192.168.1.101:8009/test route=srv_A loadfactor=1
      BalancerMember ajp://192.168.1.102:8009/test route=srv_B loadfactor=2
      ProxySet lbmethod=byrequests
      ProxySet stickysession=ROUTEID
    </Proxy>
    
    NameVirtualHost 192.168.1.104:80
    
    <VirtualHost 192.168.1.104:80>
      ServerName www.b.com
      ProxyRequests Off
      ProxyVia On
      ProxyPreserveHost On
      <Location /balancer-manager>
        SetHandler balancer-manager
        ProxyPass !
        Allow from all
      </Location>
      ProxyPass / balancer://testsrvs/
      ProxyPassReverse / balancer://testsrvs/
      <Location />
            Allow from all
      </Location>
    </VirtualHost>

        方式三:

          apache:mod_jk

          tomcat:ajp connector 

        配置过程:

        Tomcat端配置使用之前的配置,无需修改

        Httpd端配置

          ①/etc/httpd/conf.d/mod_jk.conf

    LoadModule jk_module modules/mod_jk.so
    
    JkWorkersFile /etc/httpd/conf.d/workers.properies
    JkLogFile logs/mod_jk.log
    JkLogLevel notice
    JkMount /* testsrvs
    JkMount /jk_status Status

          ②/etc/httpd/conf.d/workers.properies

    /*此配置文件中的各节点必须显式定义在work.list中*/
    worker.list=testsrvs,Status,srv_A,srv_B
    worker.srv_A.host=192.168.1.102
    worker.srv_A.port=8009
    worker.srv_A.lbfactor=1
    worker.srv_A.type=ajp13
    worker.srv_B.host=192.168.1.103
    worker.srv_B.port=8009
    worker.srv_B.lbfactor=2
    worker.srv_B.type=ajp13
    worker.testsrvs.type=lb
    worker.testsrvs.balance_workers=srv_A,srv_B
    worker.testsrvs.sticky_session=0  //{0|1}关闭/开启session sticky
    worker.Status.type=status

      B.基于Session Cluster的实现:

        配置过程:

        (1)配置集群,使用之前演示的集群,稍微改一下配置文件即可满足需求

        在Tomcat的主配置文件的Engine或者Host中加入以下配置:

     <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.101.0.4"
                            port="45564"
                            frequency="500"
                            dropTime="3000"/>
                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                          address="192.168.1.103"
                          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>

        (2)配置应用程序的web.xml,使其能够被tomcat delta manager管理

          # vim web.xml

          在<web-app></web-app>的范围内加入<distributable/>标签即可

        注意:前端调度器的配置中不能开启session sticky功能


      C.基于Session Server的实现:  

        最简单的安装方式你需要一个tomcat(6,7,或者8) 和一个 memcached (或者其他支持memcached 协议的),在实际的产品环境中你可能在一些不同的PC上有多个tomcat 和多个memcached。memcached-session-manager(msm) 支持两种工作

    模式。sticky sessions(粘性session) 跟 no-sticky sessions(非粘性session);

        下面给出一个 sticky sessions 的安装的例子。用到了两个tomcat,两个memcached;

    Tomcat-1(t1) 把他的session主要存储在 memcached-2(m2),Tomcat-2则主要存储在 memcached-1(m1),   如果m2如果不能正常工作,t1 将session存储在 memcached-1 (m1 ,m1是t1的 failoverNod).在这个配置下,当两台服务器中的一台(machine1上运行

    着 t1,m1)宕机的时候,session不会丢失, 下面的非常漂亮的ASCII展示了这个设置;

      <t1>     <t2>
            .   / .
            .  X  .
           . /     .
    <m1>  <m2>

        而且支持不同的序列化,大体有:

        javolution序列化tomcat配置

          依赖:

            msm-javolution-serializer-cglib-1.3.0.jar
            msm-javolution-serializer-jodatime-1.3.0.jar
            spymemcached-2.10.3.jar
            javolution-5.4.3.1.jar
            msm-javolution-serializer-1.7.0.jar
            memcached-session-manager-1.7.0.jar
            memcached-session-manager-tc7-1.7.0.jar

        xstream序列化tomcat配置

          依赖:

            xmlpull-1.1.3.1.jar
            xpp3_min-1.1.4c.jar
            xstream-1.4.6.jar
            msm-xstream-serializer-1.7.0.jar
            spymemcached-2.10.3.jar
            memcached-session-manager-1.7.0.jar
            memcached-session-manager-tc7-1.7.0.jar

        flexjson序列化tomcat配置

          依赖:

            flexjson-3.1.jar
            msm-flexjson-serializer-1.7.0.jar
            spymemcached-2.10.3.jar
            memcached-session-manager-1.7.0.jar
            memcached-session-manager-tc7-1.7.0.jar

        kryo序列化tomcat配置

        不同的序列化依赖不同的.jar包

          依赖:

            kryo-1.04.jar
            minlog-1.2.jar
            asm-3.2.jar
            reflectasm-1.01.jar
            kryo-serializers-0.11.jar
            msm-kryo-serializer-1.7.0.jar
            spymemcached-2.10.3.jar
            memcached-session-manager-1.7.0.jar
            memcached-session-manager-tc7-1.7.0.jar

        根据实际情况选择一种序列化方法,准备好.jar包放在tomcat的lib目录下再进行配置即可,接下来将以javolution序列化为例进行演示:

        在Tomcat目录下的conf/目录中找到context.xml,在<Context></Context>之间加入以下配置

    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:192.168.1.104:11211 n2:192.168.1.103:11211"   
    requestUriIgnorePattern= ".*.(png|gif|jpg|css|js)$" 
    failoverNodes="n1"   
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"    
    />

        当然,Manager有很多额外选项,其相关解释说明如下:      

        1.className  必须
        类名:de.javakaffee.web.msm.MemcachedBackupSessionManager

        2.memcachedNodes  必须
        memcached节点:此属性应该包含所有运行的 memcached节点或者membase bucket的uri地址,每一个memcached节点的属性定义格式为<id>:<host>:<port>, 多个节点定义直接使用空格或者逗号分隔,形如:memcachedNodes="n1:app01:11211,n2:app02:11211",如果只 有单个的memcached节点,则<id>是可选项,只需配置<host>:<port>即可,形 如:memcachedNodes="localhost:11211"。
    如果我们配置的是membase,那么从1.6.0版本开始,我们可以配置指定一个或者多个membase bucket uris,形如:http://host1:8091/pools,http://host2:8091/pools。Bucket 名称和密码通过属性username,password来定义。membase buckets连接需要遵循memcached协议,传输数据通过二进制流方式。

        3.failoverNodes 可选项
        故障转移节点:可选项,对非黏性session不可用,属性必须包含memcached节点集群的所有ids。节点id之间用空格或者逗号分隔。

        4.username 可选项
        从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证,密码可以为空。

        5.password 可选项
        从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证,密码可以为空。

        6.memcachedProtocol    可选项
        定义memcached协议,默认使用text文本,出属性指明memcached使用的存储协议。只支持text或者binary。

        7.sticky    可选项
        定义session方式为黏性或非黏性,默认为true,多个tomcat时需使用非黏性

        8.lockingMode    可选项
        只有非黏性session才使用,默认值为none
          none: 从不对session进行锁定
          all: session将一直被锁定,知道请求结束
          auto: 对于只读请求,session将不会被锁定,如果是非只读请求,则session会被锁定
          uriPattern:<regexp>: 通过正则表达式的方式来对请求uri以及查询字符串进行匹配,只有匹配上的才会被锁定。
        9.requestUriIgnorePattern   可选项

        此属性是那些不能改备份Session的请求的正则表达式。如果像css,javascript,图片等静态文件被同一个Tomcat和同一个应用 上下文来提供,这些请求也会通过memcached-session-manager。但是这些请求在一个http会话中几乎没什么改变,所以他们没必要 触发Session备份。所以那些静态文件没必要触发Session备份,你就可以使用此属性定义。此属性必须符合java regex正则规范。
            如:".*.(png|gif|jpg|css|js)$"  

        10.sessionBackupAsync   可选项
        指定Session是否应该被异步保存到Memcached中。 如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout设置的过期时间起作用。

        11.backupThreadCount    可选项
         用来异步保存Session的线程数,(如果sessionBackupAsync="true")。默认值为cup的内核数。

        12.sessionBackupTimeout    可选项
         设置备份一个Session所用的时间,如果操作超过时间那么保存失败。此属性只在sessionBackupAsync="false"是起作用。默认100毫秒

        13.operationTimeout    可选项
        从1.6.0版开始使用, 默认值为1000

        14.sessionAttributeFilter    可选项
         此属性是用来控制Session 中的那个属性值保存到Memcached中的正则表达式。郑则表达式被用来匹配Session中属性名称。如 sessionAttributeFilter="^(userName|sessionHistory)$" 指定了只有"userName"和"sessionHistory"属性保存到Memcached中。依赖于选择的序列化策略。

        15.transcoderFactoryClass    可选项
         此属性值是创建序列化和反序列化 保存到Memcached中的Session的编码转换器的工厂类名。这个指定的类必须实现了 de.javakaffee.web.msm.TranscoderFactory和提供一个无参的构造方法。例如其他的有效的实现在其他 packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm- javolution-serializer.
        默认为 de.javakaffee.web.msm.JavaSerializationTranscoderFactory

        16.copyCollectionsForSerialization    可选项
        默认值为false。

        17.customConverter    可选项
        自己定义特殊的类注册到kryo自定义转换器中,实现序列化

        18.enableStatistics    可选项
        
     用来指定是否进行统计。 默认值为true。

        19.enabled   可选项
         指定Session保存到Memcached中是否可用和是否可以通过JMX进行改变。只用于粘性Session。 默认值为true。

        

  • 相关阅读:
    [leetCode]剑指 Offer 43. 1~n整数中1出现的次数
    [leetCode]剑指 Offer 42. 连续子数组的最大和
    HDU
    HDU
    HDU
    HDU
    HDU
    HDU
    POJ
    POJ
  • 原文地址:https://www.cnblogs.com/trymybesttoimp/p/6290640.html
Copyright © 2020-2023  润新知