Tomcat集群应用部署的实现机制

集群应用部署是一个很重要的应用场景,设想一下如果没有集群应用部署功能,每当我们发布应用时都要登陆每台机器对每个tomcat实例进行部署,这些工作量都是繁杂且重复的,而对于进步青年的程序员来说是不能容忍重复的事情发生的。于是需要一种功能可以在集群中某实例部署后,集群中的其他tomcat实例会自动完成部署。

集群部署主要分两部分内容。

  • 第一部分是关于应用传输问题,主要是关于在tomcat中如何一个web应用传输到其它tomcat实例上;
  • 第二部分是应用部署方式及应用更新方式,主要关于在tomcat中如何以集群同步方式部署一个web应用,以及集群实例在接收到新版本web应用时如何进行更新。

tomcat的集群是基于tribes网络框架的。

关于第一部分传输的问题,其主要是使用tribes进行数据传输,但它有一个地方需要考虑,常见的小数据都可以一次性直接发送,但web应用一般都是比较大,不可能一次性将其全部读到内存再直接写入到套接字中,所以需要分开多次传输。

部署的几个主要组件如图,tomcat集群中每个实例都会包含Cluster组件,它包含了专门用于集群部署的ClusterDeployer集群部署器,而且ClusterDeployer组件也是建立在tribes之上。假如将web应用部署到中间的tomcat实例上,它的ClusterDeployer组件则会读取该web应用war包文件,然后通过tribes向集群的其他两个tomcat实例发送,前面也说到不可能一次性全部读取,所以读取时使用了一个缓冲区,它默认是10k字节大小的,所以一次最多能传输10k字节数据,这些数据会被封装成FileMessage对象进行传递。集群其他tomcat实例的ClusterDeployer将所有FileMessage接收后组成一个完整的war包文件。

另外,从发送端到接收端存在多个缓冲队列并且可能还有多线程操作,所以说在发送端的应用层按顺序将文件数据一份一份发送,在接收端的应用层并不能保证按顺序接收到。为了解决乱序的问题,需要在传输的消息中引入消息编号,即对每个FileMessage进行累加编号,例如发送时每个FileMessage对象按顺序编码从1开始累加,在接收端就可以从编码为1的FileMessage对象开始处理,接着处理编码为2的FileMessage,以此类推,这样就保证了数据的顺序性了,保证了拼凑的数据最终的准确性。这样就解决了web应用传输的问题了,往下看第二部分。

集群中应用如何部署及如何更新的?如下图,每个tomcat实例的集群部署器ClusterDeployer都包含了一个WarWatcher组件,这个组件主要用于监听某个目录下是否有新的应用包或某个应用包是否被有更新,一旦监听到这些事件则把新的应用同步到集群中其他实例上。这个过程大致如下:

①集群中某实例的WarWatcher监听watchDir目录下部署了新应用xx.war包。

②将新应用xx.war包先复制到本实例的deployDir部署目录下。

③集群部署器ClusterDeployer将xx.war包传递到另外一个tomcat实例。

④另外一个tomcat实例的ClusterDeployer将xx.war包暂时存放到tempDir目录。

⑤xx.war包完整接收后重新命名到deployDir目录下。

关于那三个目录,watchDir目录属于监听目录,一旦有war包部署或更新就会被检测到;tempDir目录用于存放临时接收到的war包数据,不能直接保存到deployDir目录,异常情况下可能把原来的war包覆盖了且又没能接收完整的新war包,所以需要临时目录;deployDir目录是真正的部署目录,war包从tempDir目录转移到deployDir目录一般使用renameTo操作,它不用真正地进行文件copy操作,不管文件多大都可以在瞬间完成操作。

至此,tomcat集群如何进行集群应用部署的整个工作过程及其机制已经全部完毕,总的来说就是通过监听实例的某个目录,一旦发现新应用就同步到集群其他实例上,传输时引入缓冲机制避免文件过大,而且通过对消息编号避免消息乱序,接收时先暂存应用到某目录,避免网络异常发生文件覆盖情况。

点击订购作者《Tomcat内核设计剖析》

时间: 2024-10-21 13:29:22

Tomcat集群应用部署的实现机制的相关文章

tomcat集群机制剖析及其生产部署选型

为什么要使用集群? 为什么要使用集群?主要有两方面原因:一是对于一些核心系统要求长期不能中断服务,为了提供高可用性我们需要由多台机器组成的集群:另外一方面,随着访问量越来越大且业务逻辑越来越复杂,单台机器的处理能力已经不足以处理如此多且复杂的逻辑,于是需要增加若干台机器使整个服务处理能力得到提升. 集群难点在哪? 如果说一个web应用不涉及会话的话,那么做集群是相当简单的,因为节点都是无状态的,集群内各个节点无需互相通信,只需要将各个请求均匀分配到集群节点即可.但基本所有web应用都会使用会话机

应用服务器-关于tomcat集群配置和分布式部署

问题描述 关于tomcat集群配置和分布式部署 如题,我在阿里云上买了一个云服务器 A,8核16G 10M带宽,配置比较高了, 如果需要负载均衡.分布式部署,可不可以不重新买一台 云服务器 B 请问一下,可不可以 直接在这台 A 服务器上 安装 apache 服务器, 然后在A服务器上安装一个tomcat1服务器和一个tomcat1服务器, 修改端口,避免冲突,然后 修改各种配置 直至成功. 请问 能不能达到 集群 和 分布式的效果?简单来说,就是 分布式可不可以同时部署 在同一个机器上的不同端

tomcat集群-为什么apache+tomcat搭建的负载均衡服务器集群在部署项目访问请求获取不到数据

问题描述 为什么apache+tomcat搭建的负载均衡服务器集群在部署项目访问请求获取不到数据 为什么apache+tomcat搭建的负载均衡服务器集群在部署项目后的项目路径不对呢,请求获取不到数据我是将项目设置在tomcat的根目录访问路径,输入localhost:8080即可访问到项目的首页,显示正常.Apache弄的是IP访问嘛,通过控制分配请求给集群下的tomcat服务器来访问项目,但是直接使用IP访问请求都获取不到数据,尝试通过IP/项目名也达不到效果.这是什么原因呢. 我当时是按照

tomcat集群实现源码级别剖析

随着互联网快速发展,各种各样供外部访问的系统越来越多且访问量越来越大,以前Web容器可以包揽接收-逻辑处理-响应整个请求生命周期的工作,现在为了构建让更多用户访问更强大的系统,人们通过不断地业务解耦.架构解耦将web容器的逻辑处理抽离交由其他中间件处理,例如缓存中间件.消息队列中间件.数据存储中间件等等.Web容器负责的工作可能越来越少,但是它确实必不可少的部分,它负责接收用户请求并分别调用各个服务最后响应.可以说目前最受欢迎的web容器是用Java写的tomcat小猫,由于生产上的tomcat

通向架构师的道路(第五天)之tomcat集群-群猫乱舞

一.为何要集群 单台App Server再强劲,也有其瓶劲,先来看一下下面这个真实的场景. 当时这个工程是这样的,tomcat这一段被称为web zone,里面用spring+ws,还装了一个jboss的规则引擎Guvnor5.x,全部是ws没有service layer也没有dao layer. 然后App Zone这边是weblogic,传输用的是spring rmi,然后App Zone这块全部是service layer, dao layer和数据库打交道. 用户这边用的是.net,以w

详谈tomcat集群

一.为何要集群 单台App Server再强劲,也有其瓶劲,先来看一下下面这个真实的场景. 当时这个工程是这样的,tomcat这一段被称为web zone,里面用spring+ws,还装了一个jboss的规则引擎Guvnor5.x,全部是ws没有service layer也没有dao layer. 然后App Zone这边是weblogic,传输用的是spring rmi,然后App Zone这块全部是service layer, dao layer和数据库打交道. 用户这边用的是.net,以w

DockOne微信分享(一零三):Kubernetes 有状态集群服务部署与管理

本文讲的是DockOne微信分享(一零三):Kubernetes 有状态集群服务部署与管理[编者的话]本次分享将深入介绍Kubernetes如何满足有状态集群服务对容器编排系统提出的新需求,包括如何使用Kubernetes的动态存储请求与分配机制来实现服务状态的持久化存储,以及与高效部署和运行有状态集群服务相关的Kubernetes新特性,如Init Container.PetSet (StatefulSet)等.最后通过一个MySQL集群实例详解在Kubernetes中如何轻松部署一个高可用的

Tomcat集群Cluster实现原理剖析

在上一篇文章中简要介绍了如何通过简单的配置来实现tomcat集群,本文意在介绍对tomcat集群进行更深入详细的配置以满足特定需求.        对于WEB应用集群的技术实现而言,最大的难点就是如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.     要实现这一点,大体上有两种方式,           一种是把所有Session数据放到一台服务器上或者数据库中,集群中的所有节点通过访问这台Session服务器来获取数据:          

apache tomcat 集群! (转)

公司需要一个内部测试局域网, 要求可以支持3000并发访问!以前也没做过服务器这方面.临时抱佛脚,查看了N多文档,他人经验,布置好之后,又遇到了N多问题,功夫不负有心人.终于还是完成了要求!观他人的布置经验- 总有不全的地方,所以把自己的经历写下来.作后来使用! 接到了这个任务.首先我想到的是apache httpserver 与tomcat集群. 一.环境: win7 4cpu 8G! 二.软件:apache2.25 tomcat7 jre7u55 三.apache2.25安装.这个比较简单