`
toplchx
  • 浏览: 342008 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Tomcat7 Cluster 集群(Linux系统)

    博客分类:
  • web
阅读更多

一、概述

参考Tomcat7的官方文档:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

 

Tomcat7 自带的集群功能是通过session复制完成的,现有两个复制方式:

  • DeltaManager:

    将session复制到所有tomcat节点中,不管是否有相应的应用(it will replicate to all nodes, even nodes that don't have the application deployed.)。缺点是如果集群节点很多,此种方式的系统消耗太大。具体节点多少算多,官方没有给出数量级。

  • BackupManager:

    将session复制到一个备份节点中,并且只复制到有相应应用的节点。(This manager only replicates the session data to one backup node, and only to nodes that have the application deployed.)缺点是这种方式没有像DeltaManager一样经过大规模的应用测试。

 

一个简单的Tomcat集群结构,本篇文档只介绍蓝色部分的配置:

              DNS Round Robin

                          |

                 Load Balancer 

                 /                      \

        Cluster1               Cluster2

         /         \                   /             \

Tomcat1  Tomcat2  Tomcat3  Tomcat4

 关于Load Balancer可以参见我另两篇文章:

Apache HTTP和Nginx Web服务器Linux系统安装  

Tomcat与Web服务器连接和集群配置

 

Tomcat7中运行session复制,需要完成以下步骤(先有个印象,再看下面的实例):

  • session中所有的属性(attributes)必须实现java.io.Serializable
  • 去掉配置文件server.xml中cluster元素的注释
  • 如果要自定义cluster valves,确认在Cluster元素里定义ReplicationValve。
  • 如果Tomcat节点运行在同一台服务器上,确保tcpListenPort属性值唯一。在大多数情况下,Tomcat可以自动检测4000-4100范围内的端口
  • 确保应用中web.xml文件有<distributable/>元素
  • 如果使用mod_jk,确保设置jvmRoute属性<Engine name="Catalina" jvmRoute="node01">,并且这个属性要和workers.properties相同
  • 确保所有节点都有相同的时间。
  • 确保loadbalancer被设置为粘性session模式(sticky session)
注意:浏览器会在某些情况下创建新的Session。
jdk1.5以上支持集群。
 
二、配置
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
         channelSendOptions="8">
    <!--
    <Manager className="org.apache.catalina.ha.session.BackupManager"
             expireSessionsOnShutdown="false"
             notifyListenersOnReplication="true"
             mapSendOptions="6"/>
    -->
    <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="5000"
                  selectorTimeout="100"
                  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=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>

    <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.ClusterSessionListener"/>
</Cluster>
下面详细说明一下:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
         channelSendOptions="6">
Cluster元素可以是<Engine>或者<Host>的子元素,如果使用farm war deploy功能,则必须是<Host>的子元素。SimpleTcpCluster是官方提供的唯一一个Cluster。channaelSendOptions是设置SimpleTcpCluster.send方法发送消息的方式,默认值是8。参考:http://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/tribes/Channel.html
<!--
<Manager className="org.apache.catalina.ha.session.BackupManager"
         expireSessionsOnShutdown="false"
         notifyListenersOnReplication="true"
         mapSendOptions="6"/>
-->
<Manager className="org.apache.catalina.ha.session.DeltaManager"
         expireSessionsOnShutdown="false"
         notifyListenersOnReplication="true"/>
默认的manager。在Tomcat5.x以后每个webapp都可以配自己的manager,但是每个节点上相同的webapp要配置相同的manager。如果<Context>中没有manager的配置则使用上面的配置。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-manager.html
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
Channel元素是Tribes,该元素封装所有沟通和成员逻辑。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-channel.html
<Membership className="org.apache.catalina.tribes.membership.McastService"
            address="228.0.0.4"
            port="45564"
            frequency="500"
            dropTime="3000"/>
通过组播方式建立成员,通过address和port设置一个组播,在相同组播下为同一个集群。Tribes也支持静态成员,通过使用StaticMembershipInterceptor。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-membership.html
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
          address="auto"
          port="5000"
          selectorTimeout="100"
          maxThreads="6"/>
在Tribes中,发送(sender)和接收(receiver)是分开的两个组件。每个节点的address和port是不同的(如果节点有不同的IP地址,可以使用"auto",如果节点在同一个IP上,则port必须不同)。这个组件中有一个线程池,可以配置相关信息。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-receiver.html
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
    <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
发送(sender)组件,这个就这么配,没什么贴别特别说明的。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-sender.html
    <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>
Tribes用堆栈发送信息,在堆栈中的每个元素都要通过interceptor。
TcpFailureDetector - 通过TCP验证成员是否正常。
MessageDispatch15Interceptor - 调度消息到线程(线程池),异步发送消息。
ThroughputInterceptor - 打印出消息流量的简单统计
注意interceptor的配置顺序。
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
       filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>
过滤一些不会修改session的request。更多信息参考:http://tomcat.apache.org/tomcat-7.0-doc/config/cluster-valve.html
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
          tempDir="/tmp/war-temp/"
          deployDir="/tmp/war-deploy/"
          watchDir="/tmp/war-listen/"
          watchEnabled="false"/>
默认的tomcat集群支持Farm部署,通过一个节点,可以部署和卸载应用到其他节点。集群中只设置一个主节点,将watchEnabled设为true,主节点将监听watchDir的变化,先更新本节点的deployDir,之后更新其他节点的deployDir。集群中其他节点的watchEnabled设为false。如果要执行此功能,Cluster必须是Host的子元素。
    <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
当使用DeltaManager时,通过ClusterSessionListener接收和传播信息。
 
三、测试
到现在为止我们配置了一个Tomcat,复制这个Tomcat,修改应该修改的部分(如果是同一台机器则需要修改一些端口和jvmRoute,如果不是同一台机器只需修改jvmRoute)。
之后建立一个简单的webapp,记得web.xml中添加<distributable/>元素。如下:
    ......    
    <description>
      Servlet and JSP Examples.
    </description>
    <display-name>Servlet and JSP Examples</display-name>

    <distributable/>

    <!-- Define example filters -->
    <filter>
        <filter-name>Timing filter</filter-name>
        <filter-class>filters.ExampleFilter</filter-class>
        <init-param>
            <param-name>attribute</param-name>
            <param-value>filters.ExampleFilter</param-value>
        </init-param>
    </filter>
    ......
在项目中添加一个广泛使用的测试jsp:
<%@ page contentType="text/html; charset=UTF-8" %>  
<%@ page import="java.util.*" %>  
<html><head><title>Cluster Test</title></head>  
<body>  
<%  
  //HttpSession session = request.getSession(true);  
  System.out.println(session.getId());  
  out.println("<br> SESSION ID:" + session.getId()+"<br>");    
  // 如果有新的请求,则添加session属性  
  String name = request.getParameter("name");  
  if (name != null && name.length() > 0) {  
     String value = request.getParameter("value");  
     session.setAttribute(name, value);  
  }    
    out.print("<b>Session List:</b>");    
    Enumeration<String> names = session.getAttributeNames();  
    while (names.hasMoreElements()) {  
        String sname = names.nextElement();   
        String value = session.getAttribute(sname).toString();  
        out.println( sname + " = " + value+"<br>");  
        System.out.println( sname + " = " + value);  
   }  
%>  
  <form action="testCluster.jsp" method="post">  
    名称:<input type=text size=20 name="name">  
     <br>  
    值:<input type=text size=20 name="value">  
     <br>  
    <input type=submit value="提交">  
   </form>  
</body>  
</html>  
启动两个Tomcat,用浏览器访问一个Tomcat,设置一些属性到Session中,用相同浏览器代开另一个窗口,访问另一个Tomcat,看到页面中的Session含有之前设置的属性就说明Session复制成功。
 
四、JMX远程管理
1、修改服务器的jre环境,设置远程连接的用户密码。
复制jre目录中lib/management/jmxremote.password.template文件,在相同目录下,命名为jmxremote.password文件(去掉.template)。
去掉下面两行的注释:
monitorRole  QED
controlRole   R&D
前面为角色和用户名,后面是密码。修改密码。
角色权限在jmxremote.access文件中定义,默认为以上两个用户,monitorRole是只读用户,controlRole是全功能用户。可以修改。
2、设置服务器tomcat的启动参数
在$CATALINA_HOME/bin目录下,创建一个名为setenv.sh的文件,文件中添加如下内容: 
export CATALINA_OPTS="-Dcom.sun.management.jmxremote \
  -Dcom.sun.management.jmxremote.port=9797 \
  -Dcom.sun.management.jmxremote.ssl=false \
  -Dcom.sun.management.jmxremote.password.file=/usr/java/jdk1.7.0_25/jre/lib/management/jmxremote.password"
 
修改port为需要的端口,password.file为jre目录中lib/management/jmxremote.password的目录。
3、远程调用
在客户端,运行$JAVA_HOME/bin/jconsole.exe

选择远程进程。
填写远程连接:service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi
hostName是服务器地址,portNum是jmx端口。
用户名/密码是服务器中jre/lib/management/jmxremote.password的配置 
点击连接按钮,可能会有连接不是SSL的提示,点击忽略。如果看到如下页面就说明连接成功了。
  • 大小: 30.1 KB
  • 大小: 110 KB
分享到:
评论
2 楼 Aceslup 2015-09-09  
JAVA的元素有点烦呢。不过还好,已经正常实现了。千呼万唤使出来啊
1 楼 muqingren 2014-07-09  

相关推荐

    Linux系统-Linux中安装JDK/TOMCAT/MYSQL/linux中项目部署/集群搭建

    【Linux系统-Linux中安装JDK/TOMCAT/MYSQL/Linux中项目部署/集群搭建】 在Linux环境下进行Java应用开发和部署,通常需要安装Java开发工具包(JDK)、Web服务器(TOMCAT)以及数据库管理系统(MYSQL)。以下是针对这些组件...

    轻松配置linux Tomcat集群 PDF

    本篇内容将详细探讨如何在Linux环境中配置Tomcat集群,以提高系统的可用性和性能。 一、Linux基础 在开始配置之前,需要对Linux操作系统有一定的了解。熟悉基本的命令行操作,如文件管理、用户权限、网络设置等,这...

    基于Xen虚拟机实现Apache tomcat 集群搭建

    在Linux系统上安装JDK是实现Tomcat集群的前提。实验中使用的JDK版本为jdk-7u75-linux-x64。安装过程包括下载、解压、配置环境变量等步骤。 5. Apache服务器的安装和配置:Apache HTTP Server是世界上最流行的Web...

    tomcat apache cluster 脚本

    ### Tomcat Apache Cluster 脚本知识点解析 #### 一、Tomcat与Apache集群配置概述 在企业级应用环境中,为了提升系统的可用性、可扩展性和性能,常常需要对服务器进行集群部署。其中,Apache与Tomcat的组合是一种...

    linux下apache+tomcat实现集群

    在Linux环境下,构建Apache与Tomcat的集群是提高Web服务可扩展性和高可用性的重要手段。这个集群配置通常涉及到负载均衡、故障转移以及资源优化。本文将深入探讨如何在Red Hat 5操作系统上实现这样的集群配置。 ...

    Linux下通过Apache搭建Tomcat集群

    在Linux下,Apache和Tomcat组合可以创建一个高效且可扩展的Java应用服务器集群。 1. **安装Apache和Tomcat** - 安装Apache HTTP服务器,通常使用`apt-get`或`yum`命令,具体取决于你的Linux发行版。 - 安装多个...

    Liunx 下 nginx+tomcat 集群建设

    总结来说,Linux环境下通过Nginx+Tomcat集群建设,可以构建出一个高效、可扩展的Web服务架构,同时利用Nginx的反向代理功能和负载均衡策略,确保系统的稳定性和性能。在实际操作中,还需要根据具体业务需求进行定制...

    tomcat+linux负载均衡集群配置

    - 集群名: `balancer://tomcatcluster` - IP 地址: - IP_1: 192.168.1.31 - IP_2: 192.168.1.32 - IP_3: 192.168.1.33 - 测试应用程序位置: `/usr/local/tomcat6/webapps/test` - 操作系统: CentOS 4.5_x86 ...

    tomcat 的安装与 集群的设定

    4. **启用集群模式**:在`server.xml`文件中配置`Cluster`节点,并为每个Tomcat实例设置一个唯一的节点ID。 5. **配置通信协议**:选择合适的通信协议,如NIO或APR,以提高性能。 通过上述步骤,可以搭建起一个...

    Linux下Apache+Tomcat集群指南

    ### Linux下Apache+Tomcat集群指南 #### 一、系统集群环境安装指南 **1.1 文档说明** 本文档旨在详细介绍如何在Linux环境下搭建Apache+Tomcat集群,并实现负载均衡及Session复制等功能。该文档适合希望提高Web...

    tomcat 集群搭建

    本文档将详细讲解如何在Windows和Linux系统上搭建Tomcat集群。 ### 一、Windows系统Tomcat集群搭建 1. **安装Tomcat**:首先,你需要在多台Windows服务器上分别安装相同版本的Tomcat。确保所有服务器上的Tomcat...

    Linux企业集群.英文版[The Linux Enterprise Cluster]

    7. **文件系统一致性**:全局命名空间(Global Namespace)和分布式文件系统(如GFS2或OCFS2)使得集群中的所有节点都能访问相同的数据,同时保持文件系统的一致性。 8. **网络配置**:集群通常需要专有的网络拓扑...

    轻松配置linux Tomcat集群

    ### 知识点详解:轻松配置 Linux 下的 Tomcat 集群 #### 1. 综述 本文旨在指导用户如何在 Linux 环境下配置一个具有高可用性、可扩展性以及具备负载均衡与错误恢复能力的 Tomcat 集群。 #### 1.1 目标 配置的最终...

    Linux下安装与配置基于nginx的tomcat负载均衡和集群(通过cookie分发请求)

    在Linux环境下,构建基于nginx的Tomcat负载均衡和集群是一项重要的任务,这有助于提升Web应用的可用性和性能。本文将详细介绍如何实现这一目标,特别是通过cookie来分发请求。 首先,我们要理解负载均衡的基本概念...

    linux下配置tomcat集群的负载均衡.zip

    本教程将详细阐述如何在Linux系统中设置Tomcat集群,并通过负载均衡技术确保服务的高效稳定运行。 首先,理解负载均衡的基本概念至关重要。负载均衡是一种分布式系统架构,通过将工作负载分布到多个计算资源(如...

    linux下tomcat集群的负载均衡

    ### Linux 下 Tomcat 集群的负载均衡详解 #### 一、集群基本概念 集群是一种集合了多个服务实体的工作模式,旨在提供比单一服务实体更强大、更可靠的平台。对于用户而言,集群表现为单一的服务实体,但实际上它是...

    Tomcat集群与负载均衡

    集群(Cluster)是指多台独立的计算机组成一个松散耦合的多处理器系统,这些计算机通过网络通信,共同对外提供服务。负载均衡(Load Balance)则是集群的核心组成部分,它通过特定算法将请求分发到集群内的各个...

Global site tag (gtag.js) - Google Analytics