4、回滚触发机制:手动触发、自动触发(健康检查失败、错误率飙升)、API触发
聊完了回滚的准备工作,咱们得聊聊一个更实际的问题——什么时候触发回滚。
说实话,我在生产环境里见过太多「该回滚时没回滚,不该回滚时瞎回滚」的惨案。有一次,某个团队因为监控告警阈值设得太低,半夜三点自动触发了一次回滚,结果把好好的版本给回滚了,搞得整个团队通宵排查。嗯,这里要注意——触发机制设计得好,能救命;设计得不好,能要命。
回滚触发机制,我一般把它分成三类:手动触发、自动触发、API触发。咱们一个一个说。
4.1 手动触发
手动触发,说白了就是「人肉决策」。这是最传统、也是最保险的方式。
我个人习惯,在灰度发布或金丝雀发布阶段,手动触发是首选。为什么?因为自动化的判断逻辑再聪明,也赶不上人的直觉和经验。你想想看,有时候错误率没飙升,但用户反馈说「页面加载变慢了」,这种场景自动化很难捕捉到。
手动触发的典型场景:
- 灰度验证阶段:QA 或 SRE 发现异常,手动点击「回滚」按钮
- 业务决策:产品经理说「这个功能上线后用户投诉太多,先回滚吧」
- 紧急止血:线上出现 P0 故障,运维直接执行回滚脚本
我曾经在某个电商大促期间,手动触发过一次回滚。当时灰度了 5% 的流量到新版本,结果发现订单支付成功率下降了 0.3%。虽然监控没报警,但我直觉不对劲,果断手动回滚。后来排查发现是新版本的 Redis 连接池配置有问题。嗯,有时候直觉比监控更靠谱。
- 提供一键回滚按钮,降低操作复杂度
- 回滚前自动生成「回滚影响分析报告」
- 支持「回滚到指定版本」,而不是只能回滚到上一个版本
- 记录操作人、操作时间、回滚原因
4.2 自动触发
自动触发,是 DevOps 的「终极梦想」——出了问题,系统自己搞定,不用人管。
但我要泼一盆冷水:自动触发是把双刃剑。阈值设得太敏感,容易误触发;设得太迟钝,又起不到作用。我见过最夸张的一次,某个团队把健康检查的超时时间设成了 1 秒,结果网络抖动一下,整个集群自动回滚了三次……
自动触发主要依赖两种信号:
4.2.1 健康检查失败
健康检查,说白了就是「探针」。Kubernetes 里常用的有 liveness probe(存活探针)和 readiness probe(就绪探针)。
我一般这样配置:
- 存活探针:检测进程是否活着。如果挂了,自动重启 Pod
- 就绪探针:检测服务是否可用。如果不可用,从 Service 中摘掉
当健康检查连续失败超过一定次数(比如 3 次),就触发回滚。这里有个坑——健康检查的间隔和超时时间要合理。我曾经见过有人把间隔设成 5 秒,超时设成 2 秒,结果服务启动慢了点(比如 10 秒),就被判定为失败,触发了回滚。
4.2.2 错误率飙升
错误率飙升,是比健康检查更「智能」的触发方式。它关注的是业务层面的健康,而不是进程层面的存活。
举个例子:你的服务进程活着,健康检查也返回 200,但接口返回的数据全是错的——这种情况健康检查发现不了,但错误率监控能发现。
我常用的错误率触发策略:
| 指标 | 阈值 | 持续时间 | 触发动作 |
|---|---|---|---|
| HTTP 5xx 错误率 | > 5% | 连续 2 分钟 | 自动回滚 |
| 接口超时率 | > 10% | 连续 1 分钟 | 自动回滚 |
| 业务异常率(如订单失败) | > 1% | 连续 3 分钟 | 自动回滚 + 通知 SRE |
4.3 API触发
API 触发,是介于手动和自动之间的「中间态」。它允许外部系统或工具通过 API 调用触发回滚。
这种场景很常见:
- CI/CD 流水线:测试阶段发现 bug,流水线自动调用回滚 API
- 监控系统:Prometheus + Alertmanager 告警后,通过 Webhook 调用回滚 API
- ChatOps:在 Slack 或钉钉群里输入 /rollback,触发回滚
API 触发的好处是——灵活。你可以把回滚能力暴露给任何系统,实现「万物皆可触发回滚」。
我设计 API 触发时,一般会提供这样的接口:
POST /api/v1/rollback
{
"deployment_id": "dep-20231001-v2.3.1",
"target_version": "v2.3.0",
"reason": "错误率飙升,自动触发",
"triggered_by": "monitoring-system",
"auto_confirm": true
}
这里有个细节——auto_confirm 参数。如果是自动化系统调用,我建议设为 true,直接执行回滚;如果是人工调用,设为 false,需要二次确认。
- 必须鉴权,防止恶意调用
- 限制调用频率,防止「回滚风暴」
- 记录完整的调用链路,方便审计
- 支持「回滚预览」——先返回影响范围,再决定是否执行
三种触发机制的对比
说了这么多,咱们用一张图来总结一下三种触发机制的核心逻辑:
最后说一句——没有完美的触发机制,只有适合你的触发机制。我个人的建议是:
- 灰度阶段:以手动触发为主,自动触发为辅
- 全量发布后:以自动触发为主,API 触发作为补充
- 任何时候:保留手动触发的「最高权限」,让 SRE 能随时介入
嗯,触发机制这块就聊到这儿。下一节咱们聊聊回滚后的「善后工作」——回滚完了,然后呢?
可可精品资料库