首页/开发/CI/CD 与发布速查/蓝绿发布(Blue-Green)
发布策略60 条

蓝绿发布(Blue-Green)

维护两套同构环境,新版本在非生产槽位验证通过后将流量整体切过来;出问题切回旧槽位即完成回滚,代价是双倍资源与数据库兼容约束。

CI/CD 与发布速查开发更新于 2026-10-13

蓝绿发布是干什么的

维护两套同构环境(蓝与绿),新版本部署到非生产槽位,验证通过后把流量整体切过去;出问题切回旧槽位,回滚是分钟级。代价是发布窗口内两套并行、资源接近双倍,且两个版本必须兼容同一份数据:数据库结构变更要向前兼容,否则新结构暴露给旧代码后,切回去也恢复不了。适用于发布频率不高、对回退速度要求苛刻的服务。

基本信息

流量切换负载均衡或路由指向新环境
回滚切回旧环境,分钟级
资源发布窗口内两套并行,接近双倍
前提两个版本兼容同一份数据
适用发布频率低、要求快速回退的服务

典型使用场景

  • 单体应用整体升级:一次性切换整个版本,验证重点是切换前的全量检查。
  • 高风险切换演练:先在预发演练切换流程,正式发布按同一脚本执行。
  • 回退要求苛刻:监管或业务要求分钟级恢复时,切回旧环境的确定性高于前滚修复。
  • 发布窗口受限:在夜间或低峰窗口完成切换与观察,降低切换动作本身的风险。
  • 数据库兼容优先:配合先扩展后收缩式迁移,才能安全切回旧版本。
  • 与负载均衡配合:健康检查先在目标组通过,再开始承接流量。
  • 定期空转演练:保持切换脚本、权限与排空流程持续可用。

切流量与验证

切流量与验证
kubectl patch service web -p '{"spec":{"selector":{"slot":"green"}}}'  # 切到绿环境
kubectl rollout status deployment/web-green  # 确认新环境收敛
# 出问题切回:
kubectl patch service web -p '{"spec":{"selector":{"slot":"blue"}}}'
切换时长连接会残留在旧环境:先摘除旧环境的新流量、等待连接排空,再完成数据库层面的收尾,否则排空期的报错会污染观察结论。
两套环境要有同构的配置管理:手工给绿环境开小灶,验证就不再代表生产行为。蓝绿不负责发现业务逻辑问题,切换前的验证深度决定发布质量。
切换完成后旧环境应保留待命一段时间再缩容:立即下线会让回退通道失效,也失去热备价值。

易错点

  • 两套环境配置漂移:绿环境过验证不代表能承接生产行为,回切时的差异还会造成二次故障。
  • 切换前未做数据库向前兼容:旧代码被新结构打断,切回去也恢复不了。
  • 切换后不排空旧环境连接:立刻停旧环境导致在途请求失败,出现本可避免的错误尖峰。
  • 长期保留两套但不治理:资源双倍、版本漂移,蓝绿退化成两套不一致的环境。
  • 把蓝绿当免观测通道:切换后不看错误预算与关键指标,故障照样全量暴露。

数据来源与参考

  • martinfowler.com《BlueGreenDeployment》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌