读书笔记《apache-tomcat-7-essentials》Tomcat 7中的集群
我想从一个故事开始这个话题。有两支队伍; A 和 B,在 IT 组织中,管理不同的系统。两个团队都由高素质的中间件专家组成。有一天,该组织的 CEO 召集两个团队开会,表示他们必须管理两个不同的中间件环境,一个中间件环境分别分配给团队 A 和 B。每个团队必须按照自己的方法来修复环境问题。 3个月后,每个客户都进行了流程审查,结果让上级管理层感到惊讶。团队 A 为应用程序保持了 50% 的正常运行时间,团队 B 为托管在其环境中的应用程序保持了 99% 的正常运行时间。在比较每个团队采用的方法时,发现团队 B 遵循使用集群的高可用性架构,而团队 A 遵循单服务器架构。
年中,管理层公布财务评估; A 队没有得到任何评价,相反,B 队的成员通过晋升获得了高额奖金。今天,您有机会决定是加入团队 A 还是加入团队 B。如果您想加入团队 B 并遵循高可用性架构,请仔细阅读本章。
在本章中,我们将讨论:
高可用架构及其优势
不同类型的高可用性架构,包括负载平衡和集群
IT 行业在企业设置中构建高可用性架构时使用的方法
如何进行 Apache Tomcat 集群
各种集群架构
如何解决聚类中的常见问题
集群是一组连接在一起的服务器或计算机,它们可以在系统中执行类似的功能。这些系统通常通过高速以太网相互连接。集群系统用于需要快速处理或系统可用性的地方。高度使用集群的一些示例是金融部门、银行、安全领域等。下图展示了集群环境中的J2EE容器:
在中间件环境中集群有很多优点。它还取决于我们使用的集群技术。我们将讨论集群的各种优点:
可扩展性:它为系统架构师提供了适应应用程序和服务器未来增强功能的自由。假设 Web 应用程序当前有 100 个并发用户,并且在某个事件发生时,您期望有 500 个并发用户。您将如何确保系统按预期运行?集群是最好的解决方案之一。
高可用性: 高可用性系统在需要提高 99.99% 的环境中实施,例如银行、金融部门等,其中整个交易需要记录在系统中。他们不能让他们的网站关闭一分钟。因此,他们实施了一个高可用性系统,以确保系统不会随时停机。
高性能:集群的主要优点之一是它通过提高系统性能 次, n = 系统数。例如,如果您使用单个服务器运行系统并且系统支持 100 个并发用户,那么只需添加另一个服务器系统即可支持 200 个并发用户。此外,如果您想减少应用程序的响应时间,可以使用 JVM 性能调优。
集群是一组连接在一起的服务器或计算机,它们可以在系统中执行类似的功能。这些系统通常通过高速以太网相互连接。集群系统用于需要快速处理或系统可用性的地方。高度使用集群的一些示例是金融部门、银行、安全领域等。下图展示了集群环境中的J2EE容器:
在中间件环境中集群有很多优点。它还取决于我们使用的集群技术。我们将讨论集群的各种优点:
可扩展性:它为系统架构师提供了适应应用程序和服务器未来增强功能的自由。假设 Web 应用程序当前有 100 个并发用户,并且在某个事件发生时,您期望有 500 个并发用户。您将如何确保系统按预期运行?集群是最好的解决方案之一。
高可用性: 高可用性系统在需要提高 99.99% 的环境中实施,例如银行、金融部门等,其中整个交易需要记录在系统中。他们不能让他们的网站关闭一分钟。因此,他们实施了一个高可用性系统,以确保系统不会随时停机。
高性能:集群的主要优点之一是它通过提高系统性能 次, n = 系统数。例如,如果您使用单个服务器运行系统并且系统支持 100 个并发用户,那么只需添加另一个服务器系统即可支持 200 个并发用户。此外,如果您想减少应用程序的响应时间,可以使用 JVM 性能调优。
在本主题中,我们将讨论 IT 行业使用的各种集群架构。根据应用程序和业务需求,这些架构可能因每个实施而异。在实时 IT 基础架构中实现的集群架构基本上有两种类型:
垂直聚类
水平聚类
默认情况下,Apache Tomcat 7 支持水平和垂直集群。在下一节中,我们将讨论这两种类型的集群在 Apache Tomcat 7 中的实现。在此之前,让我们讨论一下集群架构,它们可以在哪里实现,以及它们的优势。
垂直集群由一个运行多个实例的单个硬件组成,使用系统中的共享资源。这种设置主要在开发和质量系统中完成,供开发人员测试应用程序的功能。此外,在硬件资源紧张的某些情况下,可以在生产中实施垂直集群。它使用共享资源的概念,例如 CPU、RAM 等。下图是垂直聚类的图示:
每种架构都有其优点和缺点。让我们讨论一下垂直集群的一些优缺点。
没有网络带宽问题,因为实例托管在单台机器上
硬件由不同的 Tomcat 实例共享
不需要添加物理硬件
单个JVM可以被多个实例共享
在前面的主题中,我们已经讨论了 Apache Tomcat 7 支持的不同类型的集群架构。是时候接受实时挑战来实现集群了。让我们从垂直聚类开始。
对于垂直集群,我们必须配置至少两个 Apache Tomcat 实例,整个过程包括三个阶段。下面我们来讨论一下Tomcat 7中垂直集群的实现步骤:
1. Tomcat实例的安装。
2.集群的配置。
3. 垂直集群的 Apache HTTP Web 服务器配置。
1. 下载软件并解压到所需目录。
2. 安装JDK并设置
JAVA_HOME
。3.将Apache Tomcat源码复制到两个不同的目录,例如
/opt/tomcatX
(whereX=
实例编号) 并使用以下命令验证文件是否在两个实例上正确复制:以下屏幕截图显示了上一个命令的输出:
这部分是垂直集群最关键的部分,因为所有配置都在这部分完成,一个简单的错误可能导致集群无法运行。因此,在进行配置时要小心。让我们在每个节点上进行逐步配置。
一审;节点1,我们可以使用 server.xml
中的默认配置,如Connector、AJP或shutdown port。让我们讨论一下每个组件需要进行配置以及为什么使用它:
1.关闭端口:下面的截图显示了Tomcat实例的
关闭
端口的配置.在运行多个实例时,如果您有任何机会跳过了配置shutdown
端口,那么Tomcat实例将无法启动它。2.连接器端口:下面的截图显示了Tomcat 7的
连接器端口
配置。这个端口用于访问Tomcat实例,例如,通常我们使用http://localhost:8080
访问Tomcat实例,8080端口称为Connector端口。在运行多个实例时,如果您跳过配置此端口,则 Tomcat 实例将无法启动它,您将收到Port already in use
异常。3. AJP 端口: 以下截图显示了 Tomcat 7 的 AJP 端口配置。此端口用于 Apache HTTP 服务器和服务器之间的 AJP 通信Tomcat 实例。在运行多个实例时,如果您已跳过配置端口,则 Tomcat 实例将无法启动它,您将得到
Port already in use
异常。4.集群属性:在
server.xml
中启用集群属性,如下截图显示用于集群的集群类:5.配置测试:从
configtest.sh
脚本> TOMCAT_HOME/bin 检查配置。以下屏幕截图显示了以下config.sh
命令的输出:6.Tomcat实例启动:使用脚本
startup.sh
启动实例1配置。以下屏幕截图显示了以下startup.sh
脚本的输出:
我们不能在节点 2 上使用默认配置。当我们在同一台物理机器上使用单个 IP 运行实例时,会出现端口冲突。让我们一步一步地配置实例 2:
1. 更改
server.xml
中实例2的shutdown
端口(加1)。以下屏幕截图显示了配置:2. 更改连接器并重定向
server.xml
中实例2 的端口(加1)。以下屏幕截图显示了配置:3. 更改 AJP 并重定向
server.xml
中实例 2 的端口(将其增加 1)。以下屏幕截图显示了配置:4. 在
server.xml
中启用集群属性。以下屏幕截图显示了配置:5. 保存
server.xml
。6. 从
TOMCAT_HOME/bin
运行configtest.sh
脚本来检查配置。以下屏幕截图显示了以下startup.sh
脚本的输出:7. 使用脚本
startup.sh
启动实例2的配置。以下屏幕截图显示了以下startup.sh
脚本的输出:8. 检查Tomcat实例进程。以下屏幕截图显示了
ps
命令的输出:9. 现在,检查两个节点的
catalina.out
。节点 1 的日志类似于以下内容:
到现在为止,我们已经完成了 Tomcat 级别的配置,在 Tomcat 实例中配置了垂直集群。是时候将 Apache Web 服务器集成到 Tomcat 7 中了。让我们通过执行以下步骤来启用集成:
1. 我们要在
的
使用以下命令:conf
目录下新建一个名为mod_jk.conf
的文件APACHE_HOME/confmod_jk
的内容包括以下几行代码:
2. 使用以下命令在
conf
中创建一个名为workers.properties
的新文件:worker.list
列出了 Tomcat 中的所有节点,Apache 通过这些节点使用 AJP 协议进行通信。在我们的示例中,它有两个节点,如以下代码行所示:为集群中的整个节点定义
worker.list
:前面的代码行定义了
tomcatnode1
属性。突出显示的代码显示了tomcatnode1
的 AJP 端口和主机名,这对于垂直集群至关重要:前面的代码行定义了
tomcatnode2
属性。突出显示的代码显示了tomcatnode2
的 AJP 端口和主机名。这对于垂直聚类至关重要。前面的代码行定义了
mod_jk
的负载平衡属性。
3.最后一步是在
httpd
的主配置文件中包含mod_jk.conf
,即httpd.conf
并重新加载 Apache 服务:
对于水平集群,我们必须在两个不同的物理或虚拟系统上配置至少两个 Apache Tomcat 实例。这些物理机可以在同一个物理网络上。它还有助于为系统提供高速带宽。
两台服务器之间的时间同步
两台服务器之间的正确网络连接
两台服务器之间的防火墙端口(如果您从不同的网络连接)
1.Tomcat实例的安装
2.集群的配置
3. 水平集群的 Apache HTTP Web 服务器配置
这部分是水平集群最关键的部分,因为所有的配置都在这部分完成,一个简单的错误就可能导致集群无法工作。因此,在进行配置之前要小心。让我们在每个节点上进行逐步配置。
对于第一种情况,我们可以使用 server.xml
中的默认配置,例如Connector、AJP或shutdown port。让我们讨论一下每个需要进行配置的组件以及使用它的原因:
1.关闭端口:下面的截图显示了Tomcat实例关闭端口的配置。在运行多个实例时,如果您跳过配置端口,则 Tomcat 实例将无法启动它。
2.连接器端口:下面的截图显示了
连接器端口
的配置。该端口用于访问Tomcat实例,例如,通常通过http://localhost:8080
访问Tomcat实例。 8080 端口称为连接器端口。在运行多个实例时,如果您跳过配置端口,则 Tomcat 实例将无法启动它,您将得到Port already in use
异常。3. AJP 端口: 以下屏幕截图显示了 Tomcat 的 AJP 端口配置。此端口用于 Apache HTTP 和 Tomcat 实例之间的 AJP 通信。在运行多个实例时,如果您跳过配置此端口,则 Tomcat 实例将无法启动,您将收到
Port already in use
异常。4.集群属性:在
server.xml
中启用集群属性。以下屏幕截图显示了用于集群的集群类:5.配置测试:从
configtest.sh
脚本> TOMCAT_HOME/bin 检查配置。以下屏幕截图显示了以下config.sh
命令的输出:6.主机入口:在主机文件中添加实例IP(
/etc/hosts
) .以下屏幕截图显示了/etc/hosts
文件的输出:7.Tomcat实例启动:使用脚本
startup.sh
启动实例1配置。以下屏幕截图显示了以下startup.sh
脚本的输出:
为了开始配置实例 2,在另一台机器上安装 Tomcat,并执行与节点 1 上相同的步骤。
检查两个节点的 catalina.out
。以下提到的日志显示了 Tomcat 实例与集群实例启动期间执行的活动。它还为我们提供了集群功能的完整可见性。
在前面提到的代码中,突出显示了四个部分。让我们简要讨论每个部分:
第一部分显示
tomcatnode1
已启动并准备好在端口 4000 上接收集群消息。第二部分显示
tomcatnode2
已加入集群,并且节点 1 正在收到通知。第三部分显示
tomcatnode2
已启动并准备在端口 4000 上接收集群消息。第四部分显示
tomcatnode1
已加入集群,节点 2 正在收到通知。
我们已经完成了 Tomcat 级别的配置,在 Tomcat 实例上配置了水平集群。是时候将 Apache Web 服务器集成到 Tomcat 7 中了。让我们通过执行以下步骤来启用集成:
1. 我们要在
的
使用以下命令:conf
目录下新建一个名为mod_jk.conf
的文件APACHE_HOME/conf下面提到的代码定义了
mod_jk.conf
的配置参数:
2. 使用以下命令在
conf
目录中创建一个名为workers.properties
的新文件:为集群中的整个节点定义
worker.list
:前面的代码行定义了
tomcatnode1
属性。突出显示的代码显示了tomcatnode1
的 IP 地址。这对于水平聚类至关重要。前面的代码行定义了
tomcatnode2
属性。突出显示的代码显示了tomcatnode2
的 IP 地址。这对于水平聚类至关重要。前面的代码行定义了
mod_jk
的负载平衡属性。3.最后一步是在
httpd
的主配置文件中包含mod_jk.conf
,即httpd.conf
并使用以下命令重新加载 Apache 服务:
为了执行集群测试,我们将带您完成一系列事件。在下面的事件中,我们只计划使用两个 Tomcat 实例——tomcatnode1
和 tomcatnode2
。我们将介绍以下事件序列:
1. 启动
tomcatnode1
。2. 启动
tomcatnode2
(等待节点1完全启动)。3. 节点 1 崩溃。
4、节点2接管节点1的用户会话到节点2。
5.启动节点1(等待节点1完全启动)。
6、节点2和节点1处于运行状态。
现在我们有了一个很好的场景,我们将介绍整个过程是如何工作的:
1.启动实例1:
tomcatnode1
使用标准启动顺序启动。创建主机对象时,会关联一个集群对象。 Tomcat 要求集群类(在本例中为SimpleTcpCluster)
为集群创建管理器,集群类将启动成员服务。2.启动实例2:当Tomcat实例2启动时,其顺序与
tomcatnode2 有一个区别。集群启动并建立连接(
tomcatnode1
,tomcatnode2
)。tomcatnode2
现在将向集群中已经存在的服务器发送请求,该服务器现在是tomcatinstance2
。3.节点1崩溃:一旦Tomcat实例崩溃,集群管理器会向所有成员发送通知,在我们的例子中是
tomcatnode2
。节点 1 的整个会话将被复制到节点 2,但用户在浏览网站时不会看到任何问题。4.节点2会接管节点1到节点2的用户会话:
tomcatnode2
会像处理任何其他请求一样处理该请求。用户请求由节点 2 处理。5.启动实例1:启动时,tomcatnode1首先加入集群,然后联系tomcatnode2获取会话中所有用户的当前状态.它开始为用户请求提供服务并为节点 2 分担负载。
6.节点2和节点1处于运行状态:现在两个实例都处于运行状态。节点 2 将继续为用户请求提供服务,一旦请求得到服务,它将终止用户会话。