一次失败升级后的反思

最近两周因为一个升级搞的精疲力竭,一共熬了四次通宵。睡了一天,总算把觉补回来了。

不得不说这次升级非常失败,为了从哪跌倒从哪爬起,为了以后不再这么悲催,我总结下我收获的经验教训,希望对那些和我们处于同一水平线的项目有些许借鉴意义。

预则立,不预则废

准备不充分是我们这次犯得最严重的问题,从开发到测试再到运维。虽然为了这次升级我们已经忙了几个月,但是在升级这件事上还是过于乐观了,或者说不重视。

先说开发,低估了工作的难度和复杂性(这应该算是程序猿这个物种的通病吧),一而再再而三的出现任务延迟。这次升级主要内容是对原来用C#写的系统用Java重写,所以从编码的角度来说没什么难度,只是时间问题,但可能就是因为“没难度”导致重视不够,最后上线的前一天还发现了好几个bug,开发测试关键时刻总是在做救火的事

另外,上线准备的时候,低估了一些工作所花的时间,导致上线时大分部时间花在了数据迁移上,当出现问题的时候发现留给自己的时间已经不多了。

讨论、讨论、然后就没有然后了

其实准备开始的足够早,考虑到一次性升级的东西太多,也计划分步骤来上线。有会议记录,有文档,有邮件……,但是结果却没有按计划的时间点执行。 至于原因很多,可能真的是太忙了吧。

环境问题

测试环境

1、  首先测试环境非常混乱,组件那么多,都部署在一台机器上,相互影响的可能性谁也说不清楚;

2、  一开始一直没有提供一个完整的集成测试环境让客户端集成测试,导致集成测试不充分。

3、  测试环境和现网环境差距比较大(部署结构、数据量、硬件…)导致性能测试的结果没有100%说服力,升级过程中发现好几次测试环境性能ok,上线后却出现了问题。

现网环境:

1、  几台机器的环境不一致(部署路径不一样,mysql版本等),直接的影响就是出现问题的时候,变量太多了,由不得大家不乱猜,结果就是越猜越乱,时间都浪费在了验证各种变量和配置上面了。最严重的是导致修改了一天的验证性工作都白做了,严重打击了大家自信心,大伙本来就累得够呛还感觉在做无用功,效率极其低下。

2、  硬件的问题。当最后定位发现时硬盘有问题的时候,运维同事自己都说“这机器不适合做服务器”,我只能“呵呵”,熬了两个通宵,眼皮都抬不起来了…

3、  现网优化不足,比如mysql就发现查询缓存没有开启。

应对问题的准备不够

一开始过于乐观,风险评估不足。没有做好应对问题的打算,比如提前准备好profile工具,开启mysql的慢查询日志……尤其是第一次升级失败后,第二次仍然过于乐观,拍脑袋认为问题已经解决了,最后导致前两次升级基本在做无用功。

每次升级都应该抱着最坏的打算。

技术问题

首先需要自我反思的是引进的一些新技术没有能够研究透彻,导致上线后性能很不理想。随着系统负载压力越来越大,不像之前网上随便找找复制粘贴拿来用就可以了,不光知其然还要知其所以然。

从这次暴露出来的问题,我觉得我们可以朝以下几点努力,其中有的我们已经尝试在做了:

1、自动化部署。我们现在的部署方式太原始了,完全依赖手动操作,有多少台tomcat测试就要准备好多少个war包,而且依赖测试手动的去一个个修改配置文件,效率太低。当然一口吃不了个胖子,可以先逐步的脚本化。

2、 配置管理。这次升级过程中发现配置太多,而且写在一个本地文件里,开发、测试和上线,版本库就那一个文件,相互影响,上线时候依赖测试手动修改,太容易出错了。要想实现自动化部署,首先要解决的就是配置问题。

3、自动化测试。和自动化部署目的是一样的减少人力的投入,减少失误。解放人才能提高生产力,现在我们的测试手段还是比较落后的,还是依赖测试一个个去手动执行用例,像上线后验证这种工作完全可以脚本自动化完成。

4、服务降级。系统应该具备一定的降级能力,这样出现问题的时候,可以通过拒绝一些出现问题的服务来保证其他服务正常,这样可以边验证已经上线的功能一边修复问题。

5、平滑升级。完全的平滑升级不太可能,但做一些系统升级的时候如何在尽可能不影响现有服务的情况下完成升级是很值得思考的。其实我们这次升级最欠考虑的一个地方就是把后端存储结构也一起改了,这就导致新系统和老系统完全不能兼容,上线和回退的成本都比较高,非常浪费时间。最后我们也是调整了方案,让后端存储保持一致,先从nginx拉一点流量到新部署的tomcat上,发现没问题,再逐步的迁移,等所有web应用服务器升级完了,下次再考虑升级后端的存储结构。

 

团队发展

我们现在这个项目正处于一个发展阶段,而运维已经先行动起来了,慢慢规范起来了,现网各种权限只有运维有,现网的操作完全依赖运维一个人操作,这是必然的趋势,时代不同了,不再是当年一两个人时开发测试运维一人全包了,但是在自动化部署、持续集成等等这些都还没来得及跟上的这个阶段,升级的瓶颈往往就出现在运维这块了。这次升级发现一个无赖的情形:部署时或出现问题时一大堆人围着运维,有的干瞪眼,有的不停说着运维不熟悉的业务方面的术语,效率非常低。当下敏捷和DevOps非常流行,不知道是否可以解决这个问题?

最后想对自己说的是:不断提高自己的能力,做一个让别人值得信任的同伴。

一次失败升级后的反思

时间: 2024-10-17 21:42:03

一次失败升级后的反思的相关文章

Ubuntu升级后apache所有的失败,以解决虚拟文件夹的设置

问题描述: 将Ubuntu离12.04升级到14.04后,出现apache配置的虚拟文件夹所有失效.所有站点域名所有定向到根文件夹.无法分别訪问! 尝试方法: 開始以为是升级后Apache的问题.已经多次尝试删除虚拟文件夹又一次创建,都以失败告终! !! 解决方法: Apache升级后,发现apache.conf文件中面有一个地方进行的变更,详细例如以下: 原有Apache配置为: Include sites-enabled/ 发现升级后变更为: IncludeOptional sites-en

Yosemite 升级后第三方SSD TRIM失败不能进入系统处理

no zuo no die, 这把手欠升级到了Yosemite, 然后发现原来在Mavericks里已经激活的TRIM在这里不行了, 又提示trim enable软件不适于此版本. 然后,悲剧就开始了, 随手找了一个老帖子,按照那个命令把内核文件改了, 也没管适不适用于Yosemite, 然后重启, 就进不去了... 一个禁止的标志横在那, 心哇凉啊, 我都还没做Mavericks的U盘安装盘,想降回去也不行啊. 拿着PC在那狂搜, 看来老外比我早, 有人解决了,遇到这个情况的朋友,输入以下救命

Xcode升级后插件失败解决方法

大家都知道每次升级Xcode 然后插件都不能用了,最根本的原因是每一个插件都有个Info.plist文件,这个文件里有个key-DVTPlugInCompatibilityUUIDs记录了能够使用该插件的Xcode的UDID,因此每次升级Xcode,Xcode的UDID都会变 ,所以升级后的Xcode就使用不了原来的插件了. 因此仅仅要我们更改每一个插件的Info.plist中DVTPlugInCompatibilityUUIDs相应的UDID就能够再次使用了,怎样获取Xcode的UDID呢,相

Ubuntu升级后apache虚拟目录设置全部失效问题解决

问题说明: 将Ubuntu从12.04升级到14.04后,出现apache配置的虚拟目录全部失效,所有网站域名全部定向到根目录,无法分别访问! 尝试方法: 开始以为是升级后Apache的问题,已经多次尝试删除虚拟目录重新创建,都以失败告终!!! 解决方法: Apache升级后,发现apache.conf文件里面有一个地方进行的变更,具体如下: 原有Apache配置为: Include sites-enabled/ 发现升级后变更为: IncludeOptional sites-enabled/*

OkHttpUtils-2.0.0 升级后改名 OkGo,全新完美支持 RxJava,比 Retrofit 更简单易用。

okhttp-OkGo 项目地址:jeasonlzy/okhttp-OkGo 简介:OkHttpUtils-2.0.0 升级后改名 OkGo,全新完美支持 RxJava,比 Retrofit 更简单易用.该库是封装了 okhttp 的网络框架,支持大文件上传下载,上传进度回调,下载进度回调,表单上传(多文件和多参数一起上传),链式调用,可以自定义返回对象,支持 Https 和自签名证书,支持 cookie 的持久化和自动管理,支持四种缓存模式缓存网络数据,支持 301 和 302 重定向,扩展了

Msys2升级后不能编译

.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top: 0 } .todo { font-family: monospace; color: red } .done { font-family: monospace; color: green } .priority { font-fami

【安卓】判断"全新安装初次打开、升级后初次打开、第二次打开",比如可用于判断是否应显示"引导页"、!

思路: 1.基于SharedPreferences,每次打开时,根据上次打开时记录的版本即可区分此次打开的情形. StoredData.java: 1.Application.onCreate中调用StoredData.getThis().markOpenApp();即可.其他位置就可以根据getLaunchMode判断打开类型了. package com.example.test; import android.app.Application; import android.content.S

python2.6升级2.7的方法及升级后的故障处理

vps上的python是2.6的,想升级到2.7 1.查看python的版本 #python  -V Python 2.6.6 2.下载python2.7 #wget http://python.org/ftp/python/2.7.6/Python-2.7.6.tar.bz2 #tar -jxvf Python-2.7.6.tar.bz2 #cd Python-2.7.6 3.安装 #./configure #make all #make install #make clean #make d

TortoiseSVN升级后右键菜单没有TortoiseSVN的相关选项 解决方案

TortoiseSVN升级后右键菜单没有TortoiseSVN的相关选项 解决方案,布布扣,bubuko.com