能回滚的发布,才叫发布
【摘要】 发布流程里最先被省掉的就是回滚。三件事:把回滚当交付物、分清哪类改动回不去、在非峰值时段真拔一次。上线脚本写了 200 行,回滚脚本只有一句「重新部署上一版」——而上一版已经不在制品库里了。一、回滚是交付物,不是预案回滚脚本和发布脚本一起写、一起评审,缺一半不算完成。没有回滚路径的变更,本质上是在赌。「重新部署上一版」不是回滚:制品被覆盖、镜像标签被复用、配置被就地改过,这条路就走不通。版本...
发布流程里最先被省掉的就是回滚。三件事:把回滚当交付物、分清哪类改动回不去、在非峰值时段真拔一次。
上线脚本写了 200 行,回滚脚本只有一句「重新部署上一版」——而上一版已经不在制品库里了。
一、回滚是交付物,不是预案
- 回滚脚本和发布脚本一起写、一起评审,缺一半不算完成。没有回滚路径的变更,本质上是在赌。
- 「重新部署上一版」不是回滚:制品被覆盖、镜像标签被复用、配置被就地改过,这条路就走不通。版本必须可寻址。
- 回滚要有时限:入口流量切回、会话清理、缓存失效,全部算在时限里。写「5 分钟内可回滚」就真的计过时。
判据:随便挑一次历史发布,说清回滚到哪个版本、用哪条命令、谁有权执行、几分钟内完成。
二、分清哪三类改动回不去
| 改动类型 | 为什么回不去 | 先做的事 |
|---|---|---|
| 数据结构变更 | 新字段写入旧代码读不懂 | 先加列后用列,删列延后一个版本 |
| 不可逆副作用 | 消息已投递、外部已回调 | 幂等键 + 补偿任务,而不是靠回滚 |
| 状态就地覆盖 | 配置被原地改,没有旧值 | 配置版本化,回滚是切指针不是改内容 |
代码回滚是切指针,数据回滚是另一件事。把这两件事混成一句话,事故就多一次。
三、在非峰值时段真拔一次
# 演练:把流量切回上一版本,计时并记录现象
deploy switch --to "$PREV_VERSION"
deploy status --wait-until=ready
- 演练要有人在旁边计时,记录从下决定到流量全部恢复的分钟数;只写「已演练」不算证据。
- 演练要包含一次「发布到一半失败」:旧实例还在、新实例起不来,此时系统长什么样。
- 每次大版本发布前后各一次,比季度一次的大演练有用得多。
判据:演练记录里有时间戳、耗时、执行人,以及演练中发现并修掉的问题。
落到华为云上:制品用容器镜像服务 SWR 打不可变标签,回滚才有目标;发布用云容器引擎 CCE 的滚动与回滚,配合应用服务网格 ASM 做流量切分;配置变更进配置中心(CSE)走版本化,别在机器上原地改;云监控服务 CES 上给回滚前后各留一段指标基线。
参考
- Google SRE Workbook · Canarying Releases
- 华为云 · 云容器引擎 CCE 工作负载回滚
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)