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集群应用部署的实现机制的更多相关文章
- tomcat集群机制剖析及其生产部署选型
为什么要使用集群? 为什么要使用集群?主要有两方面原因:一是对于一些核心系统要求长期不能中断服务,为了提供高可用性我们需要由多台机器组成的集群:另外一方面,随着访问量越来越大且业务逻辑越来越复杂,单台 ...
- FineReport关于tomcat集群部署的方案
多台服务器集群后,配置权限.数据连接.模板.定时调度等,只能每台服务器一个个配置,不会自动同步到所有服务器. 针对上述情况,在FineReport中提供新集群部署插件,将xml配置文件.finedb/ ...
- Nginx+Tomcat集群部署
为了获取更好的性能,我们常常需要将tomcat进行集群部署.下文通过nginx转发实现tomcat集群,并通过nginx-upstream-jvm-route插件保证session的粘滞. 应用场景环 ...
- 使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享
一.工作中因为要使用到Tomcat集群部署,此时就涉及到了Session共享问题,主要有三种解决方案: 1.使用数据库来存储Session 2.使用Cookie来存储Session 3.使用Redis ...
- Docker Compose 一键部署Nginx代理Tomcat集群
Docker Compose 一键部署Nginx代理Tomcat集群 目录结构 [root@localhost ~]# tree compose_nginx_tomcat/ compose_nginx ...
- Docker Compose部署 nginx代理Tomcat集群
一.简介 使用Docker镜像部署Nginx代理的多个Tomcat集群: 使用Dockerfile构建nginx镜像 使用Dockerfile构建tomcat镜像 mysql镜像使用docker hu ...
- JStorm集群的部署
JStorm是一个类似Hadoop MapReduce的系统,不同的是JStorm是一套基于流水线的消息处理机制,是阿里基于Storm优化的版本,和Storm一样是一个分布式实时计算的系统,从开发角度 ...
- linux+apache+mod_Jk+tomcat实现tomcat集群
最近一段时间一直在研究实现apache + jk_mod + tomcat实现负载均衡,起初负载均衡算是配置蛮顺利的,但是到了配置tomcat集群时所有配置都没有问题,但是tomcat日志中一直提示没 ...
- tomcat集群实现源码级别剖析
随着互联网快速发展,各种各样供外部访问的系统越来越多且访问量越来越大,以前Web容器可以包揽接收-逻辑处理-响应整个请求生命周期的工作,现在为了构建让更多用户访问更强大的系统,人们通过不断地业务解耦. ...
随机推荐
- [BZOJ]1093 最大半连通子图(ZJOI2007)
挺有意思的一道图论. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:∀u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v ...
- [3.19FJ四校联考]
来自FallDream的博客.未经允许,请勿转载,谢谢. ---------------------------------------------------- A.积分,不会 以后补 B.给定一 ...
- Python的IO编程
原文传送门:请点击 原文传送门:请点击
- c# 判断datatable中是否存在某列
if (datatable.columns.contains("要找的列名"))
- 整理spring定时器corn表达式
1.结构 corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份 2.各字段的含义 字段 允许值 允许的特殊字符 秒 0~59 - * / 分 0~59 - * / ...
- ubuntu 英文系统下安装中文输入法
环境:ubuntu15.10 64位 英文版 软件:fcitx输入法框架,及多种拼音输入法 linux的英文系统会比中文少很多麻烦,特别是在命令行输入路径的时候,如果路径是中文将是一件很头疼的问题.但 ...
- Spring-cloud(六) Hystrix入门
前提 一个可用的Eureka注册中心(文中以之前博客中双节点注册中心,不重要) 一个连接到这个注册中心的服务提供者 快速入门 项目搭建 搭建一个新maven项目,artifactid为Ribbon-c ...
- @RequestBody注解用法
做Java已经有8个多月了,但是基本没有学习过Java语言,因此在项目中写代码基本靠的是其他语言的基础来写Java代码,写出来的很多代码虽然能用,但是感觉很不地道,虽然从来没有同事说过,但是我自己觉得 ...
- /usr,/usr/local/ 还是 /opt ?
Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的(好吧处女座表示完全不能接受不正确的路径选择,看着会不舒服的……) /usr:系统级的目录,可以理解为C:/Windows/, ...
- leetcode之Find All Numbers Disappeared in an Array
问题来源:Find All Numbers Disappeared in an Array 很久没有刷题了,感觉大脑开始迟钝,所以决定重拾刷题的乐趣.一开始不要太难,选一些通过率高的题目做,然后就看到 ...