集群应用部署是一个很重要的应用场景,设想一下如果没有集群应用部署功能,每当我们发布应用时都要登陆每台机器对每个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. ●POJ 3348 Cows

    题链: http://poj.org/problem?id=3348 题解: 计算几何,凸包,多边形面积 好吧,就是个裸题,没什么可讲的. 代码: #include<cmath> #inc ...

  2. poj 1265 Area 面积+多边形内点数

    Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5861   Accepted: 2612 Description ...

  3. bzoj 3174: [Tjoi2013]拯救小矮人

    Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...

  4. poj 2417 && poj3243(Baby-Step Giant-Step)

    Discrete Logging Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4624   Accepted: 2113 ...

  5. 【TensorFlow 官网 可以直接访问】让中国开发者更容易地使用TensorFlow打造人工智能应用

    人工智能的神奇之处,在于它能被应用在医疗保健.交通运输和环境保护等方方面面,为复杂的社会问题探寻解决方案.如今,在人工智能的协助下,人们得以探索全新的研究领域,开发创新的产品,让数以百万计的用户从中获 ...

  6. AngularJs开发——指令与控制器间的通信

    (原文:http://www.html5jscss.com/controller-between-directive.html) 指令与控制器之间通信,跟控制器间的通信.指令间通信也类似,也是下几种方 ...

  7. linux route 路由设置小记

    情景一: 有一台ip为172.16.160.53服务器,此服务器为固定ip,由于某些特殊情况,此服务器的ip不能修改. 现在这台服务器需要与另外一个网段ip为172.16.176.150服务器进行局域 ...

  8. ConcurrentHashMap1.7和1.8的不同实现

    ConcurrentHashMap 在多线程环境下,使用HashMap进行put操作时存在丢失数据的情况,为了避免这种bug的隐患,强烈建议使用ConcurrentHashMap代替HashMap,为 ...

  9. sessionStorage 、localStorage 和 cookie

    localStorage 和 sessionStorage HTML5 提供了两种在客户端存储数据的新方法:localStorage 和 sessionStorage: 两者都是仅在客户端(即浏览器) ...

  10. Java不走弯路教程(2.Hello,Java!)

    2.Hello,Java! 欢迎来到Java的世界,在上一章,我们已经完成了DOS的基本操作学习和Java的环境搭建,在本章中我们Java来完成一个简单的DOS程序. 2.1 Hello,Java! ...