Java 应用运维
作者:http://blogread.cn/it/article/4918?f=wb
出处:http://blogread.cn/it/article/4918?f=wb
Java应用运维
对于互联网产品或长期运行的产品而言,运维工作非常重要,尤其是在产品复杂了以后,在这篇blog中就来说下Java应用的运维工作(ps:虽然看起来各种语言做的系统的运维工作都差不多,但细节上还是会有很多不同,so本文还是只讲Java的)。
苦逼的码农按照需求开发好了一个全新的Java Web应用,该发布上线给用户用了,要把一个Java Web应用发布上线,首先需要搭建运行的环境,运行的环境需要有JDK、APPServer,在已经装好了os的机器上装上JDK和APPServer,开发好的Java Web应用可以用maven直接打成war或ear,将这个打好的包scp或其他方式到目标机器上,准备妥当,就差启动了。
通常APPServer都带有启动脚本,在做好了上述准备后,直接运行启动脚本,通常就OK了(maybe需要修改appserver的一些配置文件,例如修改监听端口等)。
应用启动后,有一个问题需要解决,就是如何确认应用启动后成功与否,对于Java web应用通常可以放一个jsp文件,在这个文件里做一些必要的检查,以确保应用启动是正常的,例如通常Java web应用会基于spring之类的框架来写,为了确保spring的BeanFactory初始成功,可以在jsp文件里去获取下spring里的bean调用下。
应用完成了启动后,这个阶段的工作就算完成了,这个阶段完成后积累了一个应用启动的脚本,用来启动应用服务器以及在启动完毕了后检验应用是否启动成功。
只要不是一个一次性的应用,就必然会涉及修改的问题,修改完了后就得重新发布,对于Java Web应用,在修改完了后重新打应用的包,然后scp覆盖到目标机器上,重启,就可完成修改,但显然,每次修改完代码后都这么操作实在是痛苦不堪,于是喜欢“偷懒”的同学会专门搞台发布用的机器(或者就是运行应用的那台机器),然后写个脚本,每次需要发布时就通过脚本自动的将发布需要做的所有事情自动做好,:),这下以后发布爽多了。
相应的这个时候通常还要支持回滚,即应用发布失败后自动的回滚到前一版本的功能,也可以折腾到脚本里。
但如果只是为了修改个页面,就得这么折腾,显然还是麻烦了点(主要是经常重启,用户受不了),于是需要支持仅更新页面的发布方式,为了支持这种方式,通常就要求打出的war/ear是解开了的,这样才比较方便直接覆盖页面,继续“偷懒”的本性,写些脚本,支持将需要发布的页面文件从svn或git下载,然后打成一个tgz或其他压缩包,scp到目标服务器,解包覆盖完成页面的更新(当然,对于编译jsp的运行方式这种发布方法就没法玩了)。
经过这个阶段的折腾,就积累了两个脚本,一个用来发布应用包,一个用来发布页面。
每次发布应用包的时候都会有短暂的不可用,这样总折腾下去用户受不了(如果哪天这唯一的一台服务器挂掉的话,就更糟糕了),于是就把应用的机器数从一台变成两台,通常这里对应用是有些技术要求的,这篇blog中只谈运维,通常情况下从部署在一台变成两台后,要做这些事:
1、可能会增加一台机器用来部署nginx/apache来做负载均衡,这个规模的情况下应该很少有会采用lb设备或lvs的(某些国企除外…),于是就得折腾下这台机器的环境等了;
2、增加了一台应用的机器后,就得又来搭建一次应用的运行环境了,通常这个时候“偷懒”的本性会发作,干脆折腾个脚本吧,来支持从另外一台运行的应用机器clone运行环境,做的更好点的话,就会把应用的运行环境记录在某个地方、然后把应用运行需要的软件也放在某个地方(例如yum),这样,当要搭建应用的运行环境时,就可通过记录的信息以及yum源等直接完成运行环境的搭建。
3、但这样还没完,为了避免发布的时候应用完全不能用,除了技术上要做的那点事外,在发布应用时就会多加一步,就是要先发一台,再发另外一台,由于之前有发布脚本,通常这也不是问题,:)。
经过这个阶段,就又积累了两个脚本,一个用来管理负载均衡的那台机器,另一个脚本用来搭建应用的运行环境。
随着应用越来越受欢迎,通常应用的机器就得继续加了,这个时候对运维工作又会带来新的挑战,主要还是在发布上,这个时候应用部署在了一堆的机器上了,每次发布的时候手工输入一堆的机器地址来发布显然很麻烦,于是需要有个地方来记录应用有哪些机器(还记得我们之前搞了个地方来记录应用的运行环境信息吧,可以放一起),除了要解决这个问题外,还需要解决的一个问题是这个时候通常对应用的发布方式会有了多种要求,例如分批发布(先发5台,再发10台,再全部发,或一半一半发等),更高级的话会有beta发布、灰度发布等要求,这个具体可以见facebook的大牛@魏小亮
写的《代码和产品发布的几种方式》,这个时候显然,之前写的那个简单的发布脚本就无法支持了,于是得搞个更为复杂的脚本来支持这多种的发布方式(有些还需要应用架构上做配合改造才能实现),做的更好的就是提供一个web版本的发布系统,来更为方便的进行发布以及发布过程的管理。
经过这个阶段后,通常可以折腾出一个web版的应用运维系统了,包括应用信息的登记(依赖的运行环境、运行的机器地址)、应用的发布、页面的发布、增加应用的机器、下线应用的机器。
通常继续发展下去,会出现一些新的状况,主要是会开始多元化,有了很多个应用,这个时候原来的web版应用运维系统就要支持多应用了,这里主要会带来的问题是为了降低运维的复杂性,需要做一些通用性的工作,例如通用的启动脚本等,这个时候会产生一些要求,例如统一的应用名等,另外会带来的问题就是开发、运维的人多了,这个时候权限上就需要有些控制了,例如某些账号可以操作某些应用等,这个时候通常需要增加一套权限系统,集成到之前的运维系统。
应用多了后,还会带来的问题是应用部署的规范性(同时也是为了降低运维的复杂性),因为每个应用可能都会有一些特殊的配置,这个时候最好是能够通过搭建运行环境以及权限控制来保证一个应用部署后的目录控制。
经过上面的一些发展过程后,Java应用的运维工作基本就可以比较自动的去完成了,但通常其实应用运维除了上面的工作外,还有一件更重要的事,就是保障应用的稳定,应用运维人员需要能够排查大部分的应用故障问题,而不是交由后面的开发人员来解决,通常这个时候需要一套自动的故障处理系统,感兴趣的同学可以参与下facebook的FBAR。
发展到更大后,还可能会碰到例如一个负载设备无法支撑整个网络的请求,需要划分vlan,这个时候在做应用机器的扩容时就需要考虑vlan因素了,还有可能会碰到机器利用率不够高,需要引入虚拟机,更高级的就是引入弹性计算,这些对运维体系都会产生较大的冲击,:)。
Java 应用运维的更多相关文章
- [原创]上海好买基金招高级Java技术经理/运维主管/高级无线客户端开发等职位(内推)
[原创]上海好买基金招高级Java技术经理/运维主管/高级无线客户端开发等职位(内推) 内部推荐职位 高级JAVA技术经理: 岗位职责: 负责项目管理(技术方向),按照产品开发流 ,带领研发团队,制定 ...
- java运维: 一次线上问题排查所引发的思考
本文转载自 crossoverJie 的b博客 https://www.cnblogs.com/crossoverJie/p/9282065.html 前言 之前或多或少分享过一些内存模型.对象创建之 ...
- Jenkins日常运维笔记-重启数据覆盖问题、迁移、基于java代码发版(maven构建)
之前在公司机房部署了一套jenkins环境,现需要迁移至IDC机房服务器上,迁移过程中记录了一些细节:1)jenkins默认的主目录放在当前用户家目录路径下的.jenkins目录中.如jenkins使 ...
- Linux系统运维笔记(五),CentOS 6.4安装java程序
Linux系统运维笔记(五),CentOS 6.4安装java程序 用eclipse编译通的java程序,现需要实施到服务器.实施步骤: 一,导出程序成jar包. 1,在主类编辑界面点右健,选 ru ...
- JAVA运维总结篇
写这篇文章主要目的是完成自己多年来运维JAVA应用的一个总结,相当于个人知识库,以后工作中遇到问题便于临时查阅并不断完善自己的知识体系. 上图,就知道Tomcat在JAVA容器界是多么重要. ...
- 想买保时捷的运维李先生学Java性能之 运行时数据区域
前言 不知道自己不知道,不知道自己知道,知道自己不知道,知道自己知道,目前处于知道自己不知道这个阶段,很痛苦啊,干了4年了运维,是一个坎.越来越发觉想要走得远,还是得扎根底. 一.运行时数据区域 ...
- 如何将运维的报警做成运营的报警--Java后端架构
转:http://mp.weixin.qq.com/s?__biz=MzI4OTU3ODk3NQ==&mid=2247483970&idx=1&sn=2a00acfb25f0c ...
- IT运维监控解决方案介绍
现状 •小公司/ 创业团队< 500台服务器规模 开源方案:Zabbix.Nagios.Cacti- 云服务提供商:监控宝.oneAlert等 •BAT级别> 10万台服务器 投 ...
- 一切从“简”,解放IT运维人员
运维人的神技 运维既是个技术活儿也是个苦差事,而运维人员被期望有着无限的技能:主机.存储.网络.操作系统样样精通,而且还要会写SQL.shell.开发语言java..net.python等等,对业务更 ...
随机推荐
- tomcat-manager 设置
tomcat默认是没有用户登录控制的,需要登录manager,则需要配置角色与用户 1. 在conf/tomcat-users.xml中添加 <role rolename="manag ...
- 小白学习Spark系列六:Spark调参优化
前几节介绍了下常用的函数和常踩的坑以及如何打包程序,现在来说下如何调参优化.当我们开发完一个项目,测试完成后,就要提交到服务器上运行,但运行不稳定,老是抛出如下异常,这就很纳闷了呀,明明测试上没问题, ...
- int rc = -EINVAL是什么意思
rc应该是return code的意思,将函数返回值rc初始化为-EINVAL,EINVAL由POSIX.1规范中的一个宏,一般通过包含C标准头文件errno.h,表示参数无效(invalid arg ...
- 51nod-完美字符串(贪心)
约翰认为字符串的完美度等于它里面所有字母的完美度之和.每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数. 约翰不在乎字母大小写.(也就是说字母F和f)的完美度相同. ...
- centos7把编译安装的服务通过systemctl管理
nginx编译安装的目录是/usr/local/nginx nginx配置文件是/usr/local/nginx/conf/nginx.conf systemctl管理的服务文件在/usr/lib/s ...
- maven引入MySQL相关依赖
<!--mysql驱动包--> <dependency> <groupId>mysql</groupId> <artifactId>mysq ...
- C# 实现自定义的USB设备与上位机进行通信(上位机部分)
因为以前没用过USB,对USB也不了解,于是上网查了很多资料,不过网上的资料都是零零散散,不清不楚的,于是我自己总结了一下,下面几个链接是网上这么多零散资料里,我觉得比较有参考意义的. USB设备连接 ...
- 数据库连接池dataesoruce pool深入理解
8.数据库连接池的connection都是长连接的,以方便多次调用,多人连续使用.dataSourcePool9.数据库连接池中的连接,是在你用完之后,返回给数据库连接池的,并不是close()掉,而 ...
- HDU 2521
了解反素数的定义: 反素数是指[1,n]内,比n小的数的约数个数都比n的约数个数要少.注意n其实是最后一个.而在区间内,[a,b]是明显无法满足条件的. 注意了最大才5000.所以,不妨使用枚举. # ...
- 从C到C++(下)
继承 从一个类派生到另外一个类,使前者的所有特征在后者中自己主动可用. 他能够声明一些类型,这些类型能够共享部分或所有曾经所声明的类型.它也能够从超过一个的基类中共享一些特性. C++是支持多继承的. ...