1. 蓝绿部署概述

1.1 定义与核心思想

蓝绿部署(Blue-Green Deployment)是一种通过维护两套完全独立的生产环境(蓝环境与绿环境)来实现零停机发布与快速回滚的部署策略。其核心思想是:在任何时刻,只有一套环境承载全部生产流量,另一套环境处于待命或闲置状态。

核心原则:流量一次性切换,而非逐步滚动。切换前,新版本已在隔离环境中完成全量验证;切换后,旧版本环境保留作为即时回滚目标。

蓝绿部署与传统滚动更新的本质区别在于:滚动更新通过逐个替换实例来渐进式上线新版本,而蓝绿部署通过路由层一次性切换完成版本更替。下表从多个维度对比两种策略:

对比维度 蓝绿部署 滚动更新
环境数量 两套完整环境(蓝+绿) 单套环境,逐步替换
切换方式 路由/负载均衡器一次性切换 逐个实例滚动替换
回滚速度 秒级(切回旧环境) 分钟级(需重新滚动)
资源占用 双倍资源(切换后可释放旧环境) 基本不变(仅额外保留一个实例)
验证窗口 切换前可在隔离环境全量验证 仅能验证已替换的部分实例
适用场景 关键业务、要求秒级回滚、可接受双倍资源 资源敏感、变更风险低、可接受分钟级回滚
SRE 视角:蓝绿部署的本质是用资源冗余换取切换确定性。在流量切换的瞬间,系统状态从"全量旧版本"直接变为"全量新版本",中间不存在混合版本窗口,这极大降低了分布式系统在发布期间的兼容性风险。

1.2 蓝绿部署的标准流程

一次完整的蓝绿部署包含以下五个阶段:

  1. 准备阶段:确认当前生产环境(假设为蓝环境),绿环境保持与蓝环境一致的基线版本。
  2. 部署阶段:将新版本应用部署到绿环境,执行数据库迁移、配置更新等操作。
  3. 验证阶段:在绿环境上执行冒烟测试、健康检查、预发布验证,确保新版本功能与性能达标。
  4. 切换阶段:通过负载均衡器/网关将生产流量从蓝环境一次性切换到绿环境。
  5. 观察与清理:观察新环境运行状态,确认稳定后释放旧环境资源;若异常则立即切回蓝环境。

下图展示了蓝绿部署的核心架构与流量切换路径:

蓝绿部署架构与流量切换示意图 用户流量 负载均衡器 / 网关 蓝环境(当前生产) App v1.0 App v1.0 DB v1 Cache v1 绿环境(新版本) App v2.0 App v2.0 DB v2 Cache v2 当前流量 待切换 切换时,负载均衡器将流量目标从蓝环境(实线)改为绿环境(虚线变为实线),实现零停机版本更替

1.3 蓝绿部署的关键成功要素

在实际生产环境中实施蓝绿部署,SRE 团队需要关注以下关键要素:

  • 环境一致性:蓝绿两套环境在基础设施规格、网络配置、中间件版本上必须保持完全一致,否则切换后可能出现非预期行为。
  • 数据兼容性:数据库 schema 变更必须向前兼容,确保切换前旧版本仍可读写;通常采用"增字段不删字段、加索引不加锁"的策略。
  • 会话保持:若应用有状态,需在切换前处理会话迁移或使用分布式会话存储(如 Redis),避免用户登录态丢失。
  • 切换原子性:DNS 变更或负载均衡配置更新应尽量做到原子操作,避免部分流量进入新环境而部分仍留在旧环境。
  • 监控与可观测性:切换前后需对比蓝绿环境的错误率、延迟、吞吐量等核心指标,确保新版本表现不劣于旧版本。
常见陷阱:蓝绿部署并非银弹。当数据库向后不兼容的变更(如删除字段、重命名表)无法避免时,蓝绿部署需要配合扩展的蓝绿模式或并行运行期来逐步迁移数据。此外,微服务架构中若服务间存在网状调用,蓝绿切换可能引发级联兼容性问题,需配合流量染色或版本路由策略。

1.4 蓝绿部署 vs 滚动更新:决策矩阵

以下决策矩阵帮助团队根据自身情况选择部署策略:

决策条件 推荐策略 理由
回滚时间要求 < 30 秒 蓝绿部署 旧环境保持运行,切换即回滚
资源预算有限,无法承担双倍环境 滚动更新 仅需额外 1 个实例的冗余
数据库变更无法向前兼容 滚动更新 + 分阶段迁移 蓝绿切换时旧环境无法处理新 schema
需要全量预发布验证 蓝绿部署 新版本在隔离环境完成全量测试后再切换
服务间存在强依赖版本耦合 蓝绿部署 + 流量染色 确保调用链路上所有服务版本一致
变更频率高(每日多次) 蓝绿部署 切换速度快,适合高频迭代