集群应用部署是一个很重要的应用场景,设想一下如果没有集群应用部署功能,每当我们发布应用时都要登陆每台机器对每个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集群应用部署的实现机制的更多相关文章

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

    为什么要使用集群? 为什么要使用集群?主要有两方面原因:一是对于一些核心系统要求长期不能中断服务,为了提供高可用性我们需要由多台机器组成的集群:另外一方面,随着访问量越来越大且业务逻辑越来越复杂,单台 ...

  2. FineReport关于tomcat集群部署的方案

    多台服务器集群后,配置权限.数据连接.模板.定时调度等,只能每台服务器一个个配置,不会自动同步到所有服务器. 针对上述情况,在FineReport中提供新集群部署插件,将xml配置文件.finedb/ ...

  3. Nginx+Tomcat集群部署

    为了获取更好的性能,我们常常需要将tomcat进行集群部署.下文通过nginx转发实现tomcat集群,并通过nginx-upstream-jvm-route插件保证session的粘滞. 应用场景环 ...

  4. 使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享

    一.工作中因为要使用到Tomcat集群部署,此时就涉及到了Session共享问题,主要有三种解决方案: 1.使用数据库来存储Session 2.使用Cookie来存储Session 3.使用Redis ...

  5. Docker Compose 一键部署Nginx代理Tomcat集群

    Docker Compose 一键部署Nginx代理Tomcat集群 目录结构 [root@localhost ~]# tree compose_nginx_tomcat/ compose_nginx ...

  6. Docker Compose部署 nginx代理Tomcat集群

    一.简介 使用Docker镜像部署Nginx代理的多个Tomcat集群: 使用Dockerfile构建nginx镜像 使用Dockerfile构建tomcat镜像 mysql镜像使用docker hu ...

  7. JStorm集群的部署

    JStorm是一个类似Hadoop MapReduce的系统,不同的是JStorm是一套基于流水线的消息处理机制,是阿里基于Storm优化的版本,和Storm一样是一个分布式实时计算的系统,从开发角度 ...

  8. linux+apache+mod_Jk+tomcat实现tomcat集群

    最近一段时间一直在研究实现apache + jk_mod + tomcat实现负载均衡,起初负载均衡算是配置蛮顺利的,但是到了配置tomcat集群时所有配置都没有问题,但是tomcat日志中一直提示没 ...

  9. tomcat集群实现源码级别剖析

    随着互联网快速发展,各种各样供外部访问的系统越来越多且访问量越来越大,以前Web容器可以包揽接收-逻辑处理-响应整个请求生命周期的工作,现在为了构建让更多用户访问更强大的系统,人们通过不断地业务解耦. ...

随机推荐

  1. ●BZOJ 1531 [POI2005]Bank notes

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1531 题解: 单调队列优化多重背包DP (弱弱的我今天总算是把这个坑给填了...) 令V[i ...

  2. hdu 5135(2014广州—状态dp)

    t题意:给你n条边,构造任意个三角形,一个三角形恰好只用3条边,每条边只能一次,求面积最大值 思路: 最开始想的是先排序从大到小取,但感觉并不怎么靠谱. 最多12条边,所以可以求出所有可能的三角形面积 ...

  3. poj 1367 robot(搜索)

    题意:给你一个图,求起点 到 终点的最少时间 每次有两种选择①:往前走1~3步                ②原地选择90°   费时皆是1s 图中1为障碍物,而且不能出边界.还要考虑机器人的直径 ...

  4. 笔记7 AOP练习<有疑问>

    场景描述: 核心业务:举行一场古典音乐会. 周边功能:观众入场,关闭手机.落座,觉得音乐好听时鼓掌,觉都不好听则退票.(切面) 1.编写切点(切点用于准确定位应该在什么地方应用切面的通 知)----即 ...

  5. 如何使用GitHub

    进行版本控制时,我们可以直接通过网页来进行版本控制,也可以下载git客户端.值得注意的是,git的客户端有很多种,具体的可以参考:https://git-scm.com/downloads/guis/ ...

  6. windows server 2008 R2 NPS(网络连接策略服务)设置radius,实现telent登陆交换机路由器权限分配

    windows2008NPS(网络连接策略)设置radius 实现telent登陆交换机路由器权限分配 转载请说明出处 一,安装 首先在08中添加服务器角色网络策略和访问服务(Network Poli ...

  7. vue 移动端公众号采坑经验

    自己用vue做微信公众号项目有一段时间了,遇到各种奇葩的问题,下面细数那些坑: 第一坑:微信分享导致安卓手机无法调起相册和无法调起微信充值 解决方案: setTimeout(_ => { wx. ...

  8. intellij配置hibernate自动生成hbm.xml文件

    1.首先创建一个Java web项目,这里因为已经在整个项目中配置好tomcat了,所以我是直接创建module的,其实和创建project的配置方法一样,创建的时候选择Web Application ...

  9. 利用Apach ab对nodejs进行并发负载的压力测试

    大家应该都有听过,nodejs性能优越,并发也很好之类的话,那我们用Apache ab对node这个空框架测试一下,然后再对一些网站测试一下,或或少一定的参考意义把. Apache ab测试工具是模拟 ...

  10. Docker安装tomcat和部署项目

    随着微服务的流行,Docker越来越流行,正如它的理念"Build, Ship, and Run Any App, Anywhere"一样,Docker提供的容器隔离技术使得开发人 ...