应用部署、监控和自动测试¶
变更的恐惧¶
当线上的发布开始,或许运维人员只是轻点了一下鼠标,然而过了几十秒,突然的交易下跌伴随着客服电话疯狂涌入。
然而,即使收到异常通知,不论是监控报警还是不幸的客户投诉,运维人员惊讶地发现,软件回滚完全没有效果。
究竟是什么出了问题?
发布平台的回滚功能异常?
回滚方案中的脚本错误?
数据库、缓存中的错误数据无法恢复?
是什么导致了新部署的软件无法正常工作,明明已经测试过了啊!!!
隐患¶
很多时候,管理者认为把开发和运维分离,由不同团队负责是有好处的:
权限被掌握在少数运维操作者手中,容易查出是谁操作或怎么操作错误
由于变更人员有限,实际上无形中使得变更无法频繁进行,或许也是保证线上稳定的一种方式
然而,运维人员没有实际的开发代码,很多时候疲于救火,也没有精力和动力去仔细推敲每个参数。这是很多故障隐患的开始。
没有预演过升级发布,直接拿线上系统”一把梭”,那是在赌”代码质量和线上的坑”。或许平台还有兜底,运气好还能回滚。然而,运气不会每次都站在你这边。
持续集成和持续测试¶
应用在部署到生产环境之前,应该持续自动化测试,同时应该经过多重部署环节:
开发环境
测试环境
金丝雀环境
灰度环境
生产环境
在每个部署环境下,都要实现自动的测试,来实现发现和预期不同的异常,进一步分析和排除故障。
在金丝雀之后的环境,需要部署严密的监控,不仅仅是简单的服务运行监控,而是要结合到业务逻辑,能够自动发现业务异常。
在发布的多个步骤中,每个环节都要有自动化的监控和自动测试,以便发现某个步骤引发的异常。越是早发现异常,损失越小,也更容易恢复。
线上变更需要有自动执行的方案,以及每一步能够无损的回滚方案。
更多的残酷现实¶
然而现实世界真的很残酷:
软件缺陷
代码缺陷导致应用重启有一定概率启动失败。
程序启动后,加载参数和实际服务正常需要一定时间,此时不能有业务流量进入,否则报错。也许会更糟,程序甚至会奔溃。
多个服务之间有依赖,当应用A更新时,应用B的数据需要重新刷新;然而推送到数据中心的参数,应用B不会自动更新,需要重启B才会下载。诸如此类的意大利面式的依赖运维人员知道么?即使明确了关系,然而没有自动化工具,依赖人工操作,错误的可能性非常高。
待续¶
想到一点我会更新一点…