vlambda博客
学习文章列表

读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群

Chapter 9. Clustering in Tomcat 7

我想从一个故事开始这个话题。有两支队伍; A 和 B,在 IT 组织中,管理不同的系统。两个团队都由高素质的中间件专家组成。有一天,该组织的 CEO 召集两个团队开会,表示他们必须管理两个不同的中间件环境,一个中间件环境分别分配给团队 A 和 B。每个团队必须按照自己的方法来修复环境问题。 3个月后,每个客户都进行了流程审查,结果让上级管理层感到惊讶。团队 A 为应用程序保持了 50% 的正常运行时间,团队 B 为托管在其环境中的应用程序保持了 99% 的正常运行时间。在比较每个团队采用的方法时,发现团队 B 遵循使用集群的高可用性架构,而团队 A 遵循单服务器架构。

年中,管理层公布财务评估; A 队没有得到任何评价,相反,B 队的成员通过晋升获得了高额奖金。今天,您有机会决定是加入团队 A 还是加入团队 B。如果您想加入团队 B 并遵循高可用性架构,请仔细阅读本章。

在本章中,我们将讨论:

  • 高可用架构及其优势

  • 不同类型的高可用性架构,包括负载平衡和集群

  • IT 行业在企业设置中构建高可用性架构时使用的方法

  • 如何进行 Apache Tomcat 集群

  • 各种集群架构

  • 如何解决聚类中的常见问题

What is a cluster?

集群是一组连接在一起的服务器或计算机,它们可以在系统中执行类似的功能。这些系统通常通过高速以太网相互连接。集群系统用于需要快速处理或系统可用性的地方。高度使用集群的一些示例是金融部门、银行、安全领域等。下图展示了集群环境中的J2EE容器:

读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群

Note

集群拓扑因环境而异,具体取决于应用程序要求。

Benefits of clustering

在中间件环境中集群有很多优点。它还取决于我们使用的集群技术。我们将讨论集群的各种优点:

  • 可扩展性:它为系统架构师提供了适应应用程序和服务器未来增强功能的自由。假设 Web 应用程序当前有 100 个并发用户,并且在某个事件发生时,您期望有 500 个并发用户。您将如何确保系统按预期运行?集群是最好的解决方案之一。

  • 高可用性: 高可用性系统在需要提高 99.99% 的环境中实施,例如银行、金融部门等,其中整个交易需要记录在系统中。他们不能让他们的网站关闭一分钟。因此,他们实施了一个高可用性系统,以确保系统不会随时停机。

  • 高性能:集群的主要优点之一是它通过提高系统性能 次, n = 系统数。例如,如果您使用单个服务器运行系统并且系统支持 100 个并发用户,那么只需添加另一个服务器系统即可支持 200 个并发用户。此外,如果您想减少应用程序的响应时间,可以使用 JVM 性能调优。

  • 云计算:集群在云计算环境中也非常有用。在为云计算设置网格计算架构以提高性能时使用它。

Disadvantages of clustering

到目前为止,我们已经讨论了集群对于 Web 环境的作用。让我们讨论一下集群的缺点:

  • 成本:它在新环境的实施中起着重要作用。如果我们想设置网络集群,那么我们需要更多的服务器。这又增加了项目的成本。

  • 监控:随着服务器数量的增加,对服务器的监控也会增加,给web管理员管理服务器带来困难。

What is a cluster?


集群是一组连接在一起的服务器或计算机,它们可以在系统中执行类似的功能。这些系统通常通过高速以太网相互连接。集群系统用于需要快速处理或系统可用性的地方。高度使用集群的一些示例是金融部门、银行、安全领域等。下图展示了集群环境中的J2EE容器:

读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群

Note

集群拓扑因环境而异,具体取决于应用程序要求。

Benefits of clustering

在中间件环境中集群有很多优点。它还取决于我们使用的集群技术。我们将讨论集群的各种优点:

  • 可扩展性:它为系统架构师提供了适应应用程序和服务器未来增强功能的自由。假设 Web 应用程序当前有 100 个并发用户,并且在某个事件发生时,您期望有 500 个并发用户。您将如何确保系统按预期运行?集群是最好的解决方案之一。

  • 高可用性: 高可用性系统在需要提高 99.99% 的环境中实施,例如银行、金融部门等,其中整个交易需要记录在系统中。他们不能让他们的网站关闭一分钟。因此,他们实施了一个高可用性系统,以确保系统不会随时停机。

  • 高性能:集群的主要优点之一是它通过提高系统性能 次, n = 系统数。例如,如果您使用单个服务器运行系统并且系统支持 100 个并发用户,那么只需添加另一个服务器系统即可支持 200 个并发用户。此外,如果您想减少应用程序的响应时间,可以使用 JVM 性能调优。

  • 云计算:集群在云计算环境中也非常有用。在为云计算设置网格计算架构以提高性能时使用它。

Disadvantages of clustering

到目前为止,我们已经讨论了集群对于 Web 环境的作用。让我们讨论一下集群的缺点:

  • 成本:它在新环境的实施中起着重要作用。如果我们想设置网络集群,那么我们需要更多的服务器。这又增加了项目的成本。

  • 监控:随着服务器数量的增加,对服务器的监控也会增加,给web管理员管理服务器带来困难。

Clustering architecture


在本主题中,我们将讨论 IT 行业使用的各种集群架构。根据应用程序和业务需求,这些架构可能因每个实施而异。在实时 IT 基础架构中实现的集群架构基本上有两种类型:

  • 垂直聚类

  • 水平聚类

默认情况下,Apache Tomcat 7 支持水平和垂直集群。在下一节中,我们将讨论这两种类型的集群在 Apache Tomcat 7 中的实现。在此之前,让我们讨论一下集群架构,它们可以在哪里实现,以及它们的优势。

Vertical clustering

垂直集群由一个运行多个实例的单个硬件组成,使用系统中的共享资源。这种设置主要在开发和质量系统中完成,供开发人员测试应用程序的功能。此外,在硬件资源紧张的某些情况下,可以在生产中实施垂直集群。它使用共享资源的概念,例如 CPU、RAM 等。下图是垂直聚类的图示:

读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群

每种架构都有其优点和缺点。让我们讨论一下垂直集群的一些优缺点。

Advantages of vertical clustering

以下是垂直集群的优点:

  • 没有网络带宽问题,因为实例托管在单台机器上

  • 硬件由不同的 Tomcat 实例共享

  • 不需要添加物理硬件

  • 单个JVM可以被多个实例共享

Disadvantages of vertical clustering

以下是垂直集群的缺点:

  • 在硬件问题的情况下没有故障转移

  • 更多维护问题

  • 用于实施的高端硬件

  • 成本高

Horizontal clustering

在这种集群方法中,实例在每台物理机上单独配置,并通过高速以太网连接。这是生产环境中非常流行的一种实现技术。一台机器的资源不与另一台机器共享。此外,可以在硬件故障的情况下进行故障转移。下图展示了不同 Apache Tomcat 实例使用不同物理硬件的水平集群:

读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群

让我们讨论一下水平聚类的一些优缺点:

Advantages of horizontal clustering

以下是水平聚类的优点:

  • 在硬件故障的情况下可以进行故障转移

  • 可以使用低端系统,因为每个物理或虚拟机实例运行单个实例

  • 低维护问题

Disadvantages of horizontal clustering

以下是水平聚类的缺点:

  • 网络带宽问题

  • 机器之间的网络连接问题

  • 每个实例都需要一个单独的物理硬件组件

Note

水平集群是生产环境中最优选的方法。

Vertical clustering in Apache Tomcat 7


在前面的主题中,我们已经讨论了 Apache Tomcat 7 支持的不同类型的集群架构。是时候接受实时挑战来实现集群了。让我们从垂直聚类开始。

对于垂直集群,我们必须配置至少两个 Apache Tomcat 实例,整个过程包括三个阶段。下面我们来讨论一下Tomcat 7中垂直集群的实现步骤:

  1. 1. Tomcat实例的安装。

  2. 2.集群的配置。

  3. 3. 垂直集群的 Apache HTTP Web 服务器配置。

Installation of the Tomcat instance

Apache Tomcat 7 的安装只需三个简单的步骤:

  1. 1. 下载软件并解压到所需目录。

  2. 2. 安装JDK并设置 JAVA_HOME

  3. 3.将Apache Tomcat源码复制到两个不同的目录,例如 /opt/tomcatX (where X=实例编号) 并使用以下命令验证文件是否在两个实例上正确复制:

    [root@localhost opt]# ls -l apache-tomcat*
    
    • 以下屏幕截图显示了上一个命令的输出:

    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群

Configuration of a vertical cluster

这部分是垂直集群最关键的部分,因为所有配置都在这部分完成,一个简单的错误可能导致集群无法运行。因此,在进行配置时要小心。让我们在每个节点上进行逐步配置。

Configuration of instance 1

一审;节点1,我们可以使用 server.xml中的默认配置,如Connector、AJP或shutdown port。让我们讨论一下每个组件需要进行配置以及为什么使用它:

  1. 1.关闭端口:下面的截图显示了Tomcat实例的关闭端口的配置.在运行多个实例时,如果您有任何机会跳过了配置shutdown端口,那么Tomcat实例将无法启动它。

    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  2. 2.连接器端口:下面的截图显示了Tomcat 7的连接器端口配置。这个端口用于访问Tomcat实例,例如,通常我们使用 http://localhost:8080访问Tomcat实例,8080端口称为Connector端口。在运行多个实例时,如果您跳过配置此端口,则 Tomcat 实例将无法启动它,您将收到 Port already in use 异常。

    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  3. 3. AJP 端口: 以下截图显示了 Tomcat 7 的 AJP 端口配置。此端口用于 Apache HTTP 服务器和服务器之间的 AJP 通信Tomcat 实例。在运行多个实例时,如果您已跳过配置端口,则 Tomcat 实例将无法启动它,您将得到 Port already in use 异常。

    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  4. 4.集群属性: server.xml中启用集群属性,如下截图显示用于集群的集群类:

    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  5. 5.配置测试: configtest.sh脚本> TOMCAT_HOME/bin 检查配置。以下屏幕截图显示了以下 config.sh 命令的输出:

    [root@localhost bin]# ./configtest.sh
    
    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  6. 6.Tomcat实例启动:使用脚本 startup.sh启动实例1配置。以下屏幕截图显示了以下 startup.sh 脚本的输出:

    [root@localhost bin]# ./startup.sh
    
    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
    • 使用以下提到的命令检查 Tomcat 实例进程。以下屏幕截图显示了 ps 命令的输出:

    [root@localhost bin]# ps -ef |grep java
    
    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群

Configuration of instance 2

我们不能在节点 2 上使用默认配置。当我们在同一台物理机器上使用单个 IP 运行实例时,会出现端口冲突。让我们一步一步地配置实例 2:

  1. 1. 更改 server.xml中实例2的 shutdown端口(加1)。以下屏幕截图显示了配置:

    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  2. 2. 更改连接器并重定向 server.xml 中实例2 的端口(加1)。以下屏幕截图显示了配置:

    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  3. 3. 更改 AJP 并重定向 server.xml 中实例 2 的端口(将其增加 1)。以下屏幕截图显示了配置:

    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  4. 4. 在 server.xml中启用集群属性。以下屏幕截图显示了配置:

    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  5. 5. 保存 server.xml

  6. 6. 从 TOMCAT_HOME/bin 运行 configtest.sh 脚本来检查配置。以下屏幕截图显示了以下 startup.sh 脚本的输出:

    [root@localhost bin]# ./configtest.sh
    
    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  7. 7. 使用脚本 startup.sh启动实例2的配置。以下屏幕截图显示了以下 startup.sh 脚本的输出:

    [root@localhost bin]# ./startup.sh
    
    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  8. 8. 检查Tomcat实例进程。以下屏幕截图显示了 ps 命令的输出:

    [root@localhost bin]# ps -ef |grep java
    
    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  9. 9. 现在,检查两个节点的 catalina.out

    节点 1 的日志类似于以下内容:

    Oct 11, 2011 5:00:24 PM org.apache.catalina.ha.tcp.SimpleTcpCluster startInternal
    INFO: Cluster is about to start
    Oct 11, 2011 5:00:24 PM org.apache.catalina.tribes.transport.ReceiverBase bind
    INFO: Receiver Server Socket bound to:/127.0.0.1:4000
    Oct 11, 2011 5:00:24 PM org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
    # Instance node 1 started on port 4000
    INFO: Setting cluster mcast soTimeout to 500
    Oct 11, 2011 5:00:24 PM
    INFO: Sleeping for 1000 milliseconds to establish cluster membership, start level:8
    Oct 11, 2011 5:00:26 PM org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
    # waiting for other member to join the cluster
    org.apache.catalina.ha.session.JvmRouteBinderValve startInternal
    INFO: JvmRouteBinderValve started
    Oct 11, 2011 5:00:37 PM org.apache.coyote.AbstractProtocolHandler start
    INFO: Starting ProtocolHandler ["http-bio-8080"]
    Oct 11, 2011 5:00:37 PM org.apache.coyote.AbstractProtocolHandler start
    INFO: Starting ProtocolHandler ["ajp-bio-8009"]
    Oct 11, 2011 5:00:37 PM org.apache.catalina.startup.Catalina start
    INFO: Server startup in 13807 ms
    Oct 11, 2011 5:23:42 PM org.apache.catalina.tribes.io.BufferPool getBufferPool
    INFO: Created a buffer pool with max size:104857600 bytes of type:org.apache.catalina.tribes.io.BufferPool15Impl
    Oct 11, 2011 5:23:43 PM org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
    INFO: Replication member added:org.apache.catalina.tribes.membership.MemberImpl [tcp://{127, 0, 0, 1}:4001,{127, 0, 0, 1},4001, alive=1043, securePort=-1, UDP Port=-1, id={33 91 -59 78 -34 -52 73 -9 -99 124 -53 34 69 21 -40 -82 }, payload={}, command={}, domain={}, ]
    #Instance 2 joined the cluster node.
    

    节点 2 的日志类似于以下内容:

    INFO: Starting Servlet Engine: Apache Tomcat/7.0.12
    Oct 11, 2011 5:23:41 PM org.apache.catalina.ha.tcp.SimpleTcpCluster startInternal
    INFO: Cluster is about to start
    Oct 11, 2011 5:23:42 PM org.apache.catalina.tribes.transport.ReceiverBase bind
    INFO: Receiver Server Socket bound to:/127.0.0.1:4001
    Oct 11, 2011 5:23:42 PM org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
    # Instance node 2 started on port 4001
    INFO: Setting cluster mcast soTimeout to 500
    Oct 11, 2011 5:23:42 PM org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
    INFO: Sleeping for 1000 milliseconds to establish cluster membership, start level:4
    Oct 11, 2011 5:23:43 PM org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
    INFO: Replication member added:org.apache.catalina.tribes.membership.MemberImpl [tcp://{127, 0, 0, 1}:4000,{127, 0, 0, 1},4000, alive=1398024, securePort=-1, UDP Port=-1, id={28 42 60 -68 -99 126 64 -35 -118 -97 7 84 26 20 90 24 }, payload={}, command={}, domain={}, ]
    # Instance 1 joined the cluster node 2.
    

Apache web server configuration for vertical clustering

到现在为止,我们已经完成了 Tomcat 级别的配置,在 Tomcat 实例中配置了垂直集群。是时候将 Apache Web 服务器集成到 Tomcat 7 中了。让我们通过执行以下步骤来启用集成:

  1. 1. 我们要在 conf目录下新建一个名为 mod_jk.conf的文件APACHE_HOME/conf 使用以下命令:

    [root@localhost apache-2.0]# cd /opt/apache-2.2.19/conf
    vi mod-jk.conf
    
    • mod_jk 的内容包括以下几行代码:

      LoadModulejk_module modules/mod_jk.so
      JkWorkersFile conf/workers.properties
      JkLogFile logs/mod_jk.log
      JkLogLevel info
      JkMount /sample/* loadbalancer
      JkMount /* loadbalancer
      
  2. 2. 使用以下命令在 conf 中创建一个名为 workers.properties 的新文件:

    [root@localhost conf]# vi workers.properties
    
    • worker.list 列出了 Tomcat 中的所有节点,Apache 通过这些节点使用 AJP 协议进行通信。在我们的示例中,它有两个节点,如以下代码行所示:

      worker.list=tomcatnode1, tomcatnode2, loadbalancer
      
    • 为集群中的整个节点定义 worker.list

      worker.tomcatnode1.port=8009
      worker.tomcatnode1.host=localhost
      worker.tomcatnode1.type=ajp13
      worker.tomcatnode1.lbfactor=1
      
    • 前面的代码行定义了 tomcatnode1 属性。突出显示的代码显示了 tomcatnode1 的 AJP 端口和主机名,这对于垂直集群至关重要:

      worker.tomcatnode2.port=8010
      worker.tomcatnode2.host=localhost
      worker.tomcatnode2.type=ajp13
      worker.tomcatnode2.lbfactor=1
      
    • 前面的代码行定义了 tomcatnode2 属性。突出显示的代码显示了 tomcatnode2 的 AJP 端口和主机名。这对于垂直聚类至关重要。

      worker.loadbalancer.type=lb
      worker.loadbalancer.balanced_workers=tomcatnode1, tomcatnode2
      worker.loadbalancer.sticky_session=1
      
    • 前面的代码行定义了 mod_jk 的负载平衡属性。

  3. 3.最后一步是在 httpd的主配置文件中包含 mod_jk.conf,即 httpd.conf 并重新加载 Apache 服务:

    [root@localhostconf]# vi httpd.conf
    

    Note

    包括 conf/mod_jk.conf

    httpd.conf 的末尾。

Horizontal clustering in Apache Tomcat 7


对于水平集群,我们必须在两个不同的物理或虚拟系统上配置至少两个 Apache Tomcat 实例。这些物理机可以在同一个物理网络上。它还有助于为系统提供高速带宽。

Note

如果要在不同的网络上配置集群,则必须为 AJP 端口和集群端口打开两个网络之间的防火墙。

配置水平集群有先决条件。以下为详细内容:

  • 两台服务器之间的时间同步

  • 两台服务器之间的正确网络连接

  • 两台服务器之间的防火墙端口(如果您从不同的网络连接)

为了配置水平集群,您必须执行以下步骤:

  1. 1.Tomcat实例的安装

  2. 2.集群的配置

  3. 3. 水平集群的 Apache HTTP Web 服务器配置

Installation of the Tomcat instance

我们在上一节中已经讨论过Tomcat的安装。这里的安装步骤将保持不变,因此我们将跳过安装。让我们进入第 2 步。

Configuration of the cluster

这部分是水平集群最关键的部分,因为所有的配置都在这部分完成,一个简单的错误就可能导致集群无法工作。因此,在进行配置之前要小心。让我们在每个节点上进行逐步配置。

Configuration of instance 1

对于第一种情况,我们可以使用 server.xml中的默认配置,例如Connector、AJP或shutdown port。让我们讨论一下每个需要进行配置的组件以及使用它的原因:

  1. 1.关闭端口:下面的截图显示了Tomcat实例关闭端口的配置。在运行多个实例时,如果您跳过配置端口,则 Tomcat 实例将无法启动它。

    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  2. 2.连接器端口:下面的截图显示了连接器端口的配置。该端口用于访问Tomcat实例,例如,通常通过 http://localhost:8080访问Tomcat实例。 8080 端口称为连接器端口。在运行多个实例时,如果您跳过配置端口,则 Tomcat 实例将无法启动它,您将得到 Port already in use 异常。

    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  3. 3. AJP 端口: 以下屏幕截图显示了 Tomcat 的 AJP 端口配置。此端口用于 Apache HTTP 和 Tomcat 实例之间的 AJP 通信。在运行多个实例时,如果您跳过配置此端口,则 Tomcat 实例将无法启动,您将收到 Port already in use 异常。

    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  4. 4.集群属性: server.xml中启用集群属性。以下屏幕截图显示了用于集群的集群类:

    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
    • 在水平集群中,每台机器都有一个单独的 IP。我们必须为实例配置广播地址和端口以相互连接并创建集群会话。将以下代码添加到 server.xml 以启用广播设置和复制:

      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6">
      <Manager className="org.apache.catalina.ha.session. BackupManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true" mapSendOptions="6"/>
      <Channel className="org.apache.catalina.tribes.group. GroupChannel">
      <Membership className= "org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="54446" frequency="500" dropTime="3500"/>
      <Receiver className= "org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="6000" selectorTimeout="100" maxThreads="6"/>
      <Sender className= "org.apache.catalina.tribes.transport. ReplicationTransmitter">
      <Transport className= "org.apache.catalina.tribes.transport.nio. PooledParallelSender"/>
      </Sender>
      </Channel>
      <Deployer className="org.apache.catalina.ha.deploy. FarmWarDeployer" tempDir="/opt/apachetomcat1/tomcat7-temp/" deployDir="/opt/apachetomcat1/tomcat7-deploy/" watchDir="/opt/apachetomcat1/tomcat7-listen/" watchEnabled="false"/>
      <ClusterListener className= "org.apache.catalina.ha.session.ClusterSessionListener"/>
      </Cluster>
      
    • 第一个突出显示的代码部分显示了多播 IP。多播为这两个实例创建了通信更改。第二个突出显示的部分显示了集群实例的部署属性。

  5. 5.配置测试: configtest.sh脚本> TOMCAT_HOME/bin 检查配置。以下屏幕截图显示了以下 config.sh 命令的输出:

    [root@localhost bin]# ./configtest.sh
    
    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  6. 6.主机入口:在主机文件中添加实例IP(/etc/hosts) .以下屏幕截图显示了 /etc/hosts 文件的输出:

    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
  7. 7.Tomcat实例启动:使用脚本 startup.sh启动实例1配置。以下屏幕截图显示了以下 startup.sh 脚本的输出:

    [root@localhost bin]# ./startup.sh
    
    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
    • 使用以下提到的命令检查 Tomcat 实例进程。以下屏幕截图显示了以下 ps 命令的输出:

    [root@localhost bin]# ps -ef |grep java
    
    读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群

Configuration of instance 2

为了开始配置实例 2,在另一台机器上安装 Tomcat,并执行与节点 1 上相同的步骤。

检查两个节点的 catalina.out。以下提到的日志显示了 Tomcat 实例与集群实例启动期间执行的活动。它还为我们提供了集群功能的完整可见性。

Oct 11, 2011 5:00:24 PM org.apache.catalina.ha.tcp.SimpleTcpCluster startInternal
INFO: Cluster is about to start
Oct 11, 2011 5:00:24 PM org.apache.catalina.tribes.transport.ReceiverBase bind
INFO: Receiver Server Socket bound to:/192.168.1.15:4000
Oct 11, 2011 5:00:24 PM org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
# Instance node 1 started on port 4000
to establish cluster membership, start level:4
Oct 11, 2011 5:00:25 PM org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Done sleeping, membership established, start level:4
Oct 11, 2011 5:00:25 PM org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Sleeping for 1000 milliseconds to establish cluster membership, start level:8
Oct 11, 2011 5:00:26 PM org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
# waiting for other member to join the cluster
INFO: Server startup in 13807 ms
Oct 11, 2011 5:23:42 PM org.apache.catalina.tribes.io.BufferPool getBufferPool
INFO: Created a buffer pool with max size:104857600 bytes of type:org.apache.catalina.tribes.io.BufferPool15Impl
Oct 11, 2011 5:23:43 PM org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
INFO: Replication member added:org.apache.catalina.tribes.membership.MemberImpl [tcp://{192.168.1.16, 0, 0, 1}:4001,{192, 168, 1, 16},4001, alive=1043, securePort=-1, UDP Port=-1, id={33 91 -59 78 -34 -52 73 -9 -99 124 -53 34 69 21 -40 -82 }, payload={}, command={}, domain={}, ]
#Instance 2 joined the cluster node

以下是节点 2 的日志:

INFO: Starting Servlet Engine: Apache Tomcat/7.0.12
Oct 11, 2011 5:23:41 PM org.apache.catalina.ha.tcp.SimpleTcpCluster startInternal
INFO: Cluster is about to start
Oct 11, 2011 5:23:42 PM org.apache.catalina.tribes.transport.ReceiverBase bind
INFO: Receiver Server Socket bound to:/192.198.1.16:4001
Oct 11, 2011 5:23:42 PM org.apache.catalina.tribes.membership.McastServiceImpl setupSocket
# Instance node 1 started on port 4001
INFO: Setting cluster mcast soTimeout to 500
Oct 11, 2011 5:23:42 PM org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Sleeping for 1000 milliseconds to establish cluster membership, start level:4
Oct 11, 2011 5:23:43 PM org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
INFO: Replication member added:org.apache.catalina.tribes.membership.MemberImpl [tcp://{192,168, 1, 15}:4000,{127, 0, 0, 1},4000, alive=1398024, securePort=-1, UDP Port=-1, id={28 42 60 -68 -99 126 64 -35 -118 - 97 7 84 26 20 90 24 }, payload={}, command={}, domain={}, ]
# Instance 1 joined the cluster node 2.

在前面提到的代码中,突出显示了四个部分。让我们简要讨论每个部分:

  • 第一部分显示 tomcatnode1 已启动并准备好在端口 4000 上接收集群消息。

    INFO: Receiver Server Socket bound to:/192.168.1.15:4000
    
  • 第二部分显示 tomcatnode2 已加入集群,并且节点 1 正在收到通知。

    added:org.apache.catalina.tribes.membership.MemberImpl[tcp://{192.168.1.16, 0, 0, 1}:4001,{192, 168, 1, 16},4001, alive=1043
    
  • 第三部分显示 tomcatnode2 已启动并准备在端口 4000 上接收集群消息。

    INFO: Receiver Server Socket bound to:/192.198.1.16:4001
    
  • 第四部分显示 tomcatnode1 已加入集群,节点 2 正在收到通知。

    added:org.apache.catalina.tribes.membership.MemberImpl[tcp://{192,168, 1, 15}:4000,{127, 0, 0, 1},4000, alive=1398024
    

Apache web server configuration for horizontal clustering

我们已经完成了 Tomcat 级别的配置,在 Tomcat 实例上配置了水平集群。是时候将 Apache Web 服务器集成到 Tomcat 7 中了。让我们通过执行以下步骤来启用集成:

  1. 1. 我们要在 conf目录下新建一个名为 mod_jk.conf的文件APACHE_HOME/conf 使用以下命令:

    [root@localhost apache-2.0]# cd /opt/apache-2.2.19/conf
    vi mod-jk.conf
    
    • 下面提到的代码定义了 mod_jk.conf 的配置参数:

      LoadModule jk_module modules/mod_jk.so
      JkWorkersFile conf/workers.properties
      JkLogFile logs/mod_jk.log
      JkLogLevel info
      JkMount /sample/* loadbalancer
      JkMount /* loadbalancer
      
  2. 2. 使用以下命令在 conf 目录中创建一个名为 workers.properties 的新文件:

    [root@localhost conf]# vi workers.properties
    worker.list=tomcatnode1, tomcatnode2, loadbalancer
    

    为集群中的整个节点定义 worker.list

    worker.tomcatnode1.port=8009
    worker.tomcatnode1.host=192.168.1.15
    worker.tomcatnode1.type=ajp13
    worker.tomcatnode1.lbfactor=1
    

    前面的代码行定义了 tomcatnode1 属性。突出显示的代码显示了 tomcatnode1 的 IP 地址。这对于水平聚类至关重要。

    worker.tomcatnode2.port=8009
    worker.tomcatnode2.host=192.168.1.16
    worker.tomcatnode2.type=ajp13
    worker.tomcatnode2.lbfactor=1
    

    前面的代码行定义了 tomcatnode2 属性。突出显示的代码显示了 tomcatnode2 的 IP 地址。这对于水平聚类至关重要。

    worker.loadbalancer.type=lb
    worker.loadbalancer.balanced_workers=tomcatnode1, tomcatnode2
    worker.loadbalancer.sticky_session=1
    

    前面的代码行定义了 mod_jk 的负载平衡属性。

    Note

    workers.properties 的 Apache 配置中水平和垂直集群的唯一区别是垂直托管。 (worker.tomcatnode2.host 被配置为 localhost,而在水平集群中 worker.tomcatnode2.host 被配置为 IP 地址不同的机器。)

  3. 3.最后一步是在 httpd的主配置文件中包含 mod_jk.conf,即 httpd.conf 并使用以下命令重新加载 Apache 服务:

    [root@localhost conf]# vi httpd.conf
    

    Note

    httpd.conf 的末尾包含 conf/mod_jk.conf

Testing of the clustered instance


为了执行集群测试,我们将带您完成一系列事件。在下面的事件中,我们只计划使用两个 Tomcat 实例——tomcatnode1 tomcatnode2。我们将介绍以下事件序列:

  1. 1. 启动 tomcatnode1

  2. 2. 启动 tomcatnode2(等待节点1完全启动)。

  3. 3. 节点 1 崩溃。

  4. 4、节点2接管节点1的用户会话到节点2。

  5. 5.启动节点1(等待节点1完全启动)。

  6. 6、节点2和节点1处于运行状态。

现在我们有了一个很好的场景,我们将介绍整个过程是如何工作的:

  1. 1.启动实例1: tomcatnode1使用标准启动顺序启动。创建主机对象时,会关联一个集群对象。 Tomcat 要求集群类(在本例中为 SimpleTcpCluster) 为集群创建管理器,集群类将启动成员服务。

    Note

    成员服务是通过集群域在集群实例中的一种机制,在集群中添加成员节点。简单来说,它是一个服务,成员可以通过它加入集群。

  2. 2.启动实例2:当Tomcat实例2启动时,其顺序与tomcatnode2 有一个区别。集群启动并建立连接(tomcatnode1,tomcatnode2)。 tomcatnode2 现在将向集群中已经存在的服务器发送请求,该服务器现在是 tomcatinstance2

    Note

    如果 Tomcat 实例在 60 秒的时间间隔内没有响应,则 Tomcat 实例 2 将更新集群,并在日志中生成条目。

  3. 3.节点1崩溃:一旦Tomcat实例崩溃,集群管理器会向所有成员发送通知,在我们的例子中是 tomcatnode2。节点 1 的整个会话将被复制到节点 2,但用户在浏览网站时不会看到任何问题。

  4. 4.节点2会接管节点1到节点2的用户会话: tomcatnode2会像处理任何其他请求一样处理该请求。用户请求由节点 2 处理。

  5. 5.启动实例1:启动时,tomcatnode1首先加入集群,然后联系tomcatnode2获取会话中所有用户的当前状态.它开始为用户请求提供服务并为节点 2 分担负载。

  6. 6.节点2和节点1处于运行状态:现在两个实例都处于运行状态。节点 2 将继续为用户请求提供服务,一旦请求得到服务,它将终止用户会话。

如果前面提到的测试工作正常,则意味着集群工作正常。

Monitoring of Tomcat clustering


一旦集群启动并工作,下一阶段是设置集群的监控。这可以通过以下方式完成:

  • 各种监控工具

  • 脚本

  • 手动的

以下是手动监控集群的步骤:

  1. 1.使用以下命令检查Tomcat进程:

    root@localhost bin]# ps -ef |grep java
    
  2. 2. 检查日志以验证集群的连通性。

  3. 3. 验证两个集群成员的 URL。

Summary


在本章中,我们讨论了 Tomcat 7 的集群及其实现技术。我们讨论了集群架构、水平和垂直集群及其好处、在 Tomcat 7 上实现水平和垂直集群,以及集群的验证。

在下一章中,我们将讨论 Tomcat 7 最期待的话题,即 Tomcat 6 升级到 Tomcat 7 以及升级过程中使用的不同技术。