Apache+JK+Tomcat 集群- blaiu - JavaEye技术网站
apache+jk+tomcat来做web负载均衡和集群

环境:
      操作系统:CentOS-5.3-i386
      jdk1.6.0.17
      apache2.2.14
      tomcat6.0
      jk1.2.26
     
     
     
一、 jdk的安装
    安装的jdk为:jdk-6u17-linux-x64-rpm.bin(linux下64位的)
      1. 将文件上传至linux
      2. 在当前目录输入
          sh jdk-6u17-linux-x64-rpm.bin
      3.看到 安装程序在询问您是否尊守许可协议页面 ,回车,空格都可以,看完协议. 出现一行字:Do you aggree to the above license terms? [yes or no]
    安装程序在问您是否愿意遵守刚才看过的许可协议。输入"y" 或 "yes" 回车。
      4.在命令行输入:
          vi /etc/profile
          在里面添加如下内容
          export JAVA_HOME=/usr/java/jdk1.6.0_17
          export JAVA_BIN=/usr/java/jdk1.6.0_17/bin
          export PATH=$PATH:$JAVA_HOME/bin
          export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
          export JAVA_HOME JAVA_BIN PATH CLASSPATH       
      5. 在命令行输入
          java -version
          屏幕输出:
              java version "jdk1.6.0_17"
              Java(TM) 2 Runtime Environment, Standard Edition (build j dk1.6.0_17)
              Java HotSpot(TM) Client VM (build jdk1.6.0_17, mixed mode)
   安装JDK1.6完毕.
  
  
  
二、 Tomcat的安装
   安装的tomcat为:apache-tomcat-6.0.18.tar.gz
      1. #tar zxvf apach-tomcat-6.0.18.tar.gz
         #mv apach-tomcat-6.0.18/usr/local(移动tomcat的目录)
      2. 进行tomcat环境的配置(前提需要安装jdk)
         #vi /etc/profile

         export JAVA_HOME=/usr/local/jdk1.6.0_17(jdk如果已经配置过的话,这里就不用写了)
         export TOMCAT_HOME=/usr/local/apach-tomcat-6.0.18
   
         保存退出
      
          # source /etc/profile  //让当前配置立即生效
      3.启动tomcat服务器
          $ /usr/local/apach-tomcat-6.0.18/bin/startup.sh
          电脑上会出现如下内容:
          Using CATALINA_BASE:   /usr/local/apache-tomcat-6.0.18
          Using CATALINA_HOME:   /usr/local/apache-tomcat-6.0.18
          Using CATALINA_TMPDIR: /usr/local/apache-tomcat-6.0.18/temp
          Using JRE_HOME:       /usr/local/jdk1.6.0_17
          在浏览器中输入http://localhost:8080/就可以看到tomcat的log了
   tomcat的安装到此结束
  
  
  
三、 apache的安装
    安装的apache为:httpd-2.2.14.tar.gz
    1. # tar -zxvf httpd-2.2.14.tar.gz
       # cd httpd-2.2.14
       # ./configure --prefix=/usr/local/apache\   //安装路径
    2. # make  //编辑(在编译过程中出现无法编译,可能是没有安装gc编译器  在线安装gc编译器的命令是:#yum install gc )
       # make install   //安装
       # cd /usr/local/apache/bin/
       # ././apachectl      //开启httpd服务      
    安装成功后,在IE中输入apache服务器的IP地址,可以看到It works! 说明安装成功
    apache安装到此结束
   
   
   
四、 安装jk   
    安装的jk为:jakarta-tomcat-connectors-jk-1.2.6-src.tar.gz
    1. # tar -zxvf jakarta-tomcat-connectors-jk-1.2.6-src.tar.gz
       # cd /usr/local/jakarta-tomcat-connectors-jk-1.2.6-src/jk/native
       # ./configure --with-apxs=/usr/local/apache/bin/apxs --with-java-home=/usr/java/jdk1.6.0_17/
       # ./make   //编译 (在编译过程中出现无法编译,可能是缺少gcc-*  在线安装gcc的命令是:yum install gcc-*)
       # ./make install   //安装
       安装完成后 会在 /usr/local/apache/modules/ 产生mod_jk.so
    安装jk到此结束
   
   
五、 开始集群配置

    1. 修改apache配置文件
      # vim /usr/local/apache/conf/httpd.conf
          添加: Include conf/mod_jk.conf
    2. 新建mod_jk.conf
      # touch mod_jk.conf
      # vim /usr/local/apache/conf/mod_jk.conf
     
      加载 mod_jk Module: LoadModule jk_module modules/mod_jk.so
      指定 workers.properties文件路径 :JkWorkersFile conf/workers.properties
    3. 指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器
      JkMount /*.jsp controller
      JkMount /*.js controller
      JkMount /jkstatus/ stat1
      JkMount /test/* controller
    4. 新建 workers.properties 文件
      # touch workers.properties
      # vim /usr/local/apache/conf/workers.properties
        添加如下内容:
          #server列表
          worker.list = controller, stat1
         
          #=======tomcat1=======
          #ajp13端口号,在tomcat下server.xml配置, 默认为8009
          worker.tomcat_app1.port=8009
         
          #tomcat的主机地址,如不是主机,请填写ip地址
          worker.tomcat1.host=192.168.0.1
          worker.tomcat1.type=ajp13
         
          #server的加权比重,值越高,分得的请求越多
          worker.tomcat1.lbfacotr=1
         
         
          #=======tomcat2=======
          #ajp13端口号,在tomcat下server.xml配置, 默认为8009
          worker.tomcat2.port=9009
         
          #tomcat的主机地址,如不是主机,请填写ip地址
          worker.tomcat2.host=192.168.0.2
          worker.tomcat2.type=ajp13
         
          #server的加权比重,值越高,分得的请求越多
          worker.tomcat2.lbfacotr=1
         
         
          #=======controller,负载均衡控制器=======
          worker.controller.type=lb
         
          #指定分担请求的tomcat
          worker.controller.balanced_workers=tomcat1, tomcat2
         
          #sticky_session属性设为1,这样负载均衡器lb就会尽量保持一个session,也就是使用户在一次会话中跟同一个Tomcat进行交互。
          worker.stat1.type=status
    5. tomcat 配置
       1>. 修改/usr/local/tomcat1/conf/server.xml
      
          A. 将<Engine name="Catalina" defaultHost="localhost">
              修改为:<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
         
          B. 将<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
              修改为:
              <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="auto" 
                        port="4001" 
                        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"/>  

                    <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>  
                  </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>. 修改/usr/local/tomcat2/conf/server.xml
      
          A. 将<Engine name="Catalina" defaultHost="localhost">
              修改为:<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
         
          B. 将<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
              修改为:
              <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="auto" 
                        port="4001" 
                        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"/>  

                    <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>  
                  </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>



tomcat集群各节点通过建立tcp链接来完成Session的拷贝,拷贝有同步和异步两种模式。在同步模式下,对客户端的响应必须在Session拷贝到其他节点完成后进行;异步模式无需等待Session拷贝完成就可响应。异步模式xxx,但是同步模式可靠性更高。同步异步模式由channelSendOptions参数控制,默认值是8,为异步模式,4是同步模式。在异步模式下,可以通过加上拷贝确认(Acknowledge)来提高可靠性,此时channelSendOptions设为10。

Manager用来在节点间拷贝Session,默认使用DeltaManager,DeltaManager采用的一种all-to-all的工作方式,即集群中的节点会把Session数据向所有其他节点拷贝,而不管其他节点是否部署了当前应用。当集群中的节点数量很多并且部署着不同应用时,可以使用BackupManager,BackManager仅向部署了当前应用的节点拷贝Session。但是到目前为止BackupManager并未经过大规模测试,可靠性不及DeltaManager。

Channel负责对tomcat集群的IO层进行配置。Membership用于发现集群中的其他节点,这里的address用的是组播地址(Multicast address,了解更多组播地址详情请参见http://zyycaesar.javaeye.com/admin/blogs/296501),使用同一个组播地址和端口的多个节点同属一个子集群,因此通过自定义组播地址和端口就可将一个大的tomcat集群分成多个子集群。Receiver用于各个节点接收其他节点发送的数据,在默认配置下tomcat会从4000-4100间依次选取一个可用的端口进行接收,自定义配置时,如果多个tomcat点在一台物理服务器上注意要使用不同的端口。Sender用于向其他节点发送数据,具体实现通过Transport配置,PooledParallelSender是从tcp连接池中获取连接,可以实现并行发送,即集群中的多个节点可以同时向其他所有节点发送数据而互不影响。Interceptor有点类似下面将要解释的Valve,起到一个阀门的作用,在数据到达目的节点前进行检测或其他操作,如TcpFailureDetector用于检测在数据的传输过程中是否发生了tcp错误。关于Channel的编程模型,请参见http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/tribes/Channel.html。

Valve用于在节点向客户端响应前进行检测或进行某些操作,ReplicationValve就是用于用于检测当前的响应是否涉及Session数据的更新,如果是则启动Session拷贝操作,filter用于过滤请求,如客户端对图片,css,js的请求就不会涉及Session,因此不需检测,默认状态下不进行过滤,监测所有的响应。JvmRouteBinderValve会在前端的Apache mod_jk发生错误时保证同一客户端的请求发送到集群的同一个节点,tomcat官方文档并未解释如何实现这一点,而且笔者认为这一设置似乎并无多大实用性。

Deployer用于集群的farm功能,监控应用中文件的更新,以保证集群中所有节点应用的一致性,如某个用户上传文件到集群中某个节点的应用程序目录下,Deployer会监测到这一操作并把这一文件拷贝到集群中其他节点相同应用的对应目录下以保持所有应用的一致。这是一个相当强大的功能,不过很遗憾,tomcat集群目前并不能做到这一点,开发人员正在努力实现它,这里的配置只是预留了一个接口。

Listener用于跟踪集群中节点发出和收到的数据,也有点类似Valve的功能。

启动顺序 tomcat1 ---->tomcat2---->apache
郑重声明:资讯 【Apache+JK+Tomcat 集群- blaiu - JavaEye技术网站】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——