集群应用部署是一个很重要的应用场景,设想一下如果没有集群应用部署功能,每当我们发布应用时都要登陆每台机器对每个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. ●SPOJ 8222 NSUBSTR - Substrings(后缀数组)

    题链: http://www.spoj.com/problems/NSUBSTR/ 题解: 同届红太阳 --WSY给出的后缀数组解法!!! 首先用倍增算法求出 sa[i],rak[i],hei[i]然 ...

  2. ●BZOJ 2006 NOI 2010 超级钢琴

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2006 题解: RMQ + 优先队列 (+ 前缀) 记得在一两个月前,一次考试考了这个题目的简 ...

  3. 【NOIP2013】传染病控制

    题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...

  4. Linux中LCD设备驱动-framebuffer(帧缓冲)【】

    转自:https://blog.csdn.net/linux_devices_driver/article/details/7079442 1.framebuffer 帧缓冲     帧缓冲(fram ...

  5. 用HTTP状态码实现提交表单后刷新页面不重复提交

    正常情况下,表单提交后如果用户刷新页面会重复提交表单,有些情况下我们不希望表单重复提交,利用HTTP协议中的307状态码重定向页面可以实现这个目的.实例如下: 表单页面代码: <form act ...

  6. 《Java技术》第二次作业--面向对象基础

    (一)学习总结 1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么? public class Test { public static void main(String a ...

  7. linux下磁盘分区详解 图文(fdisk;mkfs)

    linux分区不同于windows,linux下硬盘设备名为(IDE硬盘为hdx(x为从a-d)因为IDE硬盘最多四个,SCSI,SATA,USB硬盘为sdx(x为a-z)),硬盘主分区最多为4个,不 ...

  8. vue+cordova 构建hybrid app

    配了一个 vue + cordova + ionicCli 的 项目 支持 ionic 的脚手架命令 支持 cordova 的 插件 安装使用 支持 webpack 的自动构建 vue 安装了 vue ...

  9. js获取当前的日期时间 格式“yyyy-MM-dd HH:MM:SS”

    function getNowFormatDate() { var date = new Date(); var seperator1 = "-"; var seperator2 ...

  10. Ubuntu 16.04LTS 安装 MATLAB 2014B

    环境:Ubuntu 16.04LTS 软件:MATLAB 2014B MATLAB 2014B 下载地址(带Crack): 链接: https://pan.baidu.com/s/1nvGtmEd 密 ...