关于LT分发系统的设计构想
git地址
背景
对tomcat做集群,在多机多tomcat的情况下,如果要更新代码,只能手动的将代码复制,粘贴,然后下一个服务器,复制,粘贴,然后下一个服务器,复制,粘贴。
LT分发系统(因为我女朋友叫兰亭)可以做到,自动化更新代码,只要把最新的代码更新到一台服务器上,LT会自动把最新的代码分发到它所管理的多台服务器的tomcat里。
宏观的处理逻辑
系统整体分为两个模块,Mather与Son,我们把最新的代码上传到Mother的代码库里,需要更新的时候,Mather会把代码主动push给son(具体的说,不是只有mather能push代码,如上图,son_1获得代码后,它也可以把代码push到son_2)
大体流程如下图
Mather模块的逻辑结构
list<File> files 存放之前的war文件
list<Address> allSons 存放这所有son的地址 包括ip地址,端口号,tomcat的文件地址
list<Address> notGetFilesSon 初始时,与allsons一致,表示还没有获得最新文件的son的地址
list<Address> getFilesSon 初始时为空,表示已经获得最新文件的son的地址
Map<String,integer> versions 保存了所有son的ip与版本号
Son模块的逻辑结构
一个java类,用来接收文件,并且重启tomcat
list<Address> nextSons 自己还需要传递文件的son的地址集合
参考资料http://blog.knowsky.com/223533.htm
具体的处理逻辑
1 我们上传最新的代码文件(.war文件)及版本介绍信息到Mather,mather更新自己的version.txt文件,这里保存着最新的文件版本号
2 mather从配置文件里加载数据并初始化allSons,在页面上显示所有的son的信息
3 用户选择一个版本文件给部分/全部son发送文件
3.0 在versions里获得需要push代码的son的版本号,例如之前的版本是451,先把451变成-451,
3.1 将notGetFilesSon随机分为n组,再从每一组里随机挑选一个son(我们记为son_trunk),以mather为源头,向他发送war文件,同时发送的还有这个组里别的son的地址信息
参考资料
http://blog.csdn.net/yarshray/article/details/211324
http://www.blogjava.net/sterning/archive/2007/10/13/152508.html
3.2 每个组收到mather信息的son(son_trunk),如果完整的接受到所有文件与地址信息,就向mather反馈一条序列化message
3.3 每个son_trunk把自己收到的文件,按照nextSons的地址发送出去
3.4 每个son收到信息后(不管是是来自mather还是来自son_trunk),首先删除原有的war文件,并且把新的war完整的保存后,都要向mather汇报
参考资料
http://www.dedecms.com/knowledge/program/jsp-java/2012/1107/16321.html
http://blog.chinaunix.net/uid-14767524-id-3399136.html
3.5 mather收到某个son的消息后,就把它从notGetFilesSon里移除并添加到getFilesSon里,同时更新versions到最新的version.txt里面的版本号
具体的说,就是mather内部有一个hashmap,key是各个son的ip,value是对应的版本号,每次mather收到底下son的反馈消息后,就更新对应key的版本号
系统只有访问mather的hashmap就知道当前所有son的版本信息了
4 son的java类中保存完文件后,重启tomcat(tomcat的地址可xml配置,也可在java文件中写死),在重启中要删除原有的文件夹
6 mather的监控程序会一直监控自己的getFilesSon情况与version的版本号,并显示到浏览器页面上如果value 是负数,说明正在更新,是正数且小于最新的版本号,显示分发按钮,如果等于最新版本号,就显示已经是最新版本
7 对于一直没有成功获得文件的son,目前只能手动更新文件,并在浏览器页面上手动更新
这一版本的问题及解决方案
1 没有错误重传机制
错误重传机制,再议
2 son接收到消息后,确认机制不够优雅,目前等于所有的son都得"知道"mather的地址,这个设计不好
son_trunk给普通的son发消息的时候,就把mather的ip也发过去就OK了
4 每次mother重启后,就丢失了所有son的版本信息
每次mather收到son的反馈消息后,先更新hashmap,然后吧hashmap持久化的文件里,每次tomcat启动的时候,就去读那个文件,来恢复版本信息
另外,这个系统是我之前自己闭门造车的结果,贻笑大方了
各位高手如果觉得我的设计哪里有不合适的地方,请一定告诉我,大家共同进步
关于LT分发系统的设计构想的更多相关文章
- 转: 透过CAT,来看分布式实时监控系统的设计与实现
评注: 开源的分布式监控系统 转:http://www.infoq.com/cn/articles/distributed-real-time-monitoring-and-control-syste ...
- 透过CAT,来看分布式实时监控系统的设计与实现
2011年底,我加入大众点评网,出于很偶然的机会,决定开发CAT,为各个业务线打造分布式实时监控系统,CAT的核心概念源自eBay闭源系统CAL----eBay的几大法宝之一. 在当今互联网时代,业务 ...
- Java生鲜电商平台-高可用微服务系统如何设计?
Java生鲜电商平台-高可用微服务系统如何设计? 说明:Java生鲜电商平台高可用架构往往有以下的要求: 高可用.这类的系统往往需要保持一定的 SLA,7*24 时不间断运行不代表完全不挂,而是有一定 ...
- [转]【转】大型高性能ASP.NET系统架构设计
大型高性能ASP.NET系统架构设计 大型动态应用系统平台主要是针对于大流量.高并发网站建立的底层系统架构.大型网站的运行需要一个可靠.安全.可扩展.易维护的应用系统平台做为支撑,以保证网站应用的平稳 ...
- 基于B/S架构的在线考试系统的设计与实现
前言 这个是我的Web课程设计,用到的主要是JSP技术并使用了大量JSTL标签,所有代码已经上传到了我的Github仓库里,地址:https://github.com/quanbisen/online ...
- 解析大型.NET ERP系统架构设计 Framework+ Application 设计模式
我对大型系统的理解,从数量上面来讲,源代码超过百万行以上,系统有超过300个以上的功能,从质量上来讲系统应该具备良好的可扩展性和可维护性,系统中的功能紧密关联.除去业务上的复杂性,如何设计这样的一个协 ...
- 使用 expect 命令执行自动分发系统
一.命令 except 实例详解 1. 介绍 expect 使用场景 expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令.当然若是使用不带密码的密钥验证同样可以实现自动登录和自动 ...
- PetShop的系统架构设计
<解剖PetShop>系列 一.PetShop的系统架构设计 http://www.cnblogs.com/wayfarer/archive/2007/03/23/375382.html ...
- 斯坦福第十一课:机器学习系统的设计(Machine Learning System Design)
11.1 首先要做什么 11.2 误差分析 11.3 类偏斜的误差度量 11.4 查全率和查准率之间的权衡 11.5 机器学习的数据 11.1 首先要做什么 在接下来的视频中,我将谈到机器 ...
随机推荐
- hdu 5919 主席树(区间不同数的个数 + 区间第k大)
Sequence II Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- [USACO Dec06]产奶的模式
Description 农夫约翰发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个“模式”. 约翰的牛奶按质量可以被 ...
- BZOJ4727 [POI2017]Turysta
这题太神了还是去看刺儿神题解吧. http://www.cnblogs.com/neighthorn/p/6538364.html #include <cstdio> #include & ...
- 实现PC视频播放最强画质教程( Potplayer播放器+MADVR插件)【转】
转自:http://www.hangge.com/blog/cache/detail_1461.html 一.MADVR介绍 MADVR 是一款超强的视频插件,其配合高清播放软件,可以做到目前 PC ...
- 笔记8 AOP练习2
场景描述: 一张唱片有好多磁道,假设每个磁道只有一首歌,现在需要记录每首歌的播放次数,然后输出. 主要业务:歌曲播放 辅助功能:记录播放次数(切面) 1.创建唱片接口,CompactDiscs.jav ...
- python中没有字符(char)这一基本数据类型
感觉受C语言的影响太大了,一开始以为python中也会有字符这一基本数据类型,后来遇到了很多问题,这才发现python中压根没有这一数据类型( ╯□╰ ). 吐槽一下:感觉python还真是'够简单啊 ...
- 算法工程师:双非渣硕是如何获得百度、京东双SP
本人本科硕士皆双非,和牛客大佬们没得比,目前拿到的还可以的offer就是百度SP和京东SP,都是做的推荐算法,其他的不说了. 先说一下个人经历吧,学校比较水,实验室没有项目,实习经历:腾讯实习+滴滴实 ...
- 初识Redis系列之三:Redis支持的数据类型及使用
支持的数据类型有五种: string(字符串).hash(哈希).list(列表).set(集合)及zset(sorted set:有序集合): 下面分别对这几种类型进行简单的Redis存取操作 1: ...
- Python小代码_4_省市区三级菜单
menu = { "北京": { "朝阳区": { "三环到四环之间": {}, "四环到五环之间": {}, &quo ...
- DDD实战进阶第一波(八):开发一般业务的大健康行业直销系统(业务逻辑条件判断最佳实践)
这篇文章其实是大健康行业直销系统的番外篇,主要给大家讲讲如何在领域逻辑中,有效的处理业务逻辑条件判断的最佳实践问题. 大家都知道,聚合根.实体和值对象这些领域对象都自身处理自己的业务逻辑.在业务处理过 ...