我们今天的主题:
- 理解蓝绿,红黑部署与灰度发布之间的区别。
- 灰度发布会遇到哪些挑战?
在升级部署过程中,采用科学方式可以有效减少服务停机时间以及控制新版本带来的风险。
针对目前主流的发布部署技术,有三个,蓝绿部署、红黑部署、灰度发布。
其中蓝绿部署,红黑部署被称为全量发布,而灰度发布被称为增量发布。那么什么是全量?什么是增量?稍后进行演示你就能够明白。
1. 蓝绿部署(Blue-Green)
所谓蓝绿部署,实际上是指两个完全相同的集群,一个代表色蓝,另一个代表色绿。假设我们需要在应用程序运行过程中对版本进行升级,
外来用户通过网关进行访问,这个网关可以是标准的nginx代理服务器,也可以是 Spring Cloud 的 gateWay。无论使用哪种组件,它的作用是对请求进行可控制分发。 假设我们现在需要对应用程序进行升级,将所有应用版本升级到 1.1:
- 首先,在网关层面断开与应用集群 A(蓝色) 的连接。
- 先升级应用集群 A,此时所有请求都发布到应用集群 B(绿色集群)。
- 应用集群 A 完成升级后,通过网关重新接入,再把应用集群 B 的 1.0 版本下线并升级到 1.1。
后来的用户访问时已使用 1.1 版本,原本的 1.0 由运维工程师升级到 1.1,之后重新接入网关,这样就完成了红、绿两个集群的版本升级。
通过这种方式,作为用户无感知,访问后自然会升级到 1.1 版本上。
这种方式相对古老,存在一些自身问题,稍后我们会结合红黑发布进行比对。
2. 红黑部署(Red-Black)
红黑部署最典型的特征是只需要有一个应用集群,之前用户发来的所有请求都会由单独的应用集群进行处理。
如果需要进行应用升级:
- 运维工程师首先开辟一个全新的集群(黑色),在上面部署新版本 v1.1。
- 当 v1.1 部署完成后,网关把流量接入黑色集群,同时将红色集群下线,所有之前占用的计算资源全部释放。
外部用户无感知地切换到 1.1 版本应用集群上。
红黑部署相比于蓝绿部署,更为简单。
优缺点对比: 与蓝绿部署相比,红黑部署可以充分利用了云计算的弹性伸缩优势,从而获得了两个收益:
- 一是,简化了流程;
- 二是,避免了在升级的过程中,由于只有一半的服务器提供服务,而可能导致的系统过载问题
3. 灰度发布(Canary / 增量发布)
灰度发布也被称为金丝雀发布,与蓝绿部署、红黑部署不同的是,灰度发布属于增量发布方法。也就是说,服务升级的过程中,新旧版本会同时为用户提供服务。
金丝雀典故:胡八一下墓前先把金丝雀放进去,对氧气敏感,用来探测环境是否安全。
灰度发布采用小体量尝试:先对少量用户提供服务,验证通过后逐步提高系统负载和用户数量。
###示意流程:
- 原始应用集群 1.0;新版本上线后扩展一个新的应用集群 1.1。
- 网关先放行 20% 用户进入 1.1,其余 80% 访问 1.0。
- 管理者发现 1.1 支撑 20% 无异常,将比例增大到 60%;随后 100%,最后下线 1.0。
小米手机内测推送就是生活中的灰度发布:先少量用户试用,再大规模推送。
灰度发布是一个平滑的转换过程,对外部用户无感知。
4. 灰度发布的三大挑战
- 数据库变更对旧版本的兼容性影响
例:原表 t 只有 a、b 两个字段,旧版本 SQL 写insert into t values(...)。
1.1 新增 c 字段后,旧 SQL 报错,因字段数与值不匹配。
-
第一种解决方案:
- 团队开发时必须显式声明字段名及对应值。
- 99% 团队要求必须写字段名。
- 删除、更新字段名、改类型都要格外谨慎;
- 灰度期间需同时对新旧版本测试。
- 若底层数据逻辑重写(1.0→2.0),无法照顾旧版本,只能放弃灰度,改用红黑全量发布。
-
另一种方案:新旧版本独立数据源,
- 旧库→ETL→新库,但仅适合小数据量或初创公司;
- 大数据量(淘宝数千亿)不可行。
- 灰度期间 80% 流量进 1.1、20% 进 1.0,两库并行写入,如何保证数据一致性是架构师和 DBA 的大考。
-
用户群选择的路由一致性:
不能仅靠 Nginx/网关权重:权重只能按比例分发,不能保证同一用户始终访问同一版本。 例:同一 IP 第一次进 1.1,第二次进 1.0,导致业务混乱。- 解决方案:在网关(如 OpenResty)增加 Lua 脚本,用 IP/UA/用户名等稳定特征取模:
- 模 10 <8 → 旧版本;8、9 → 新版本,确保用户固定路由。
-
需要监控:失败率、处理时长、异常数。
- 工业级:ELK、Prometheus
- 轻量级:SkyWalking(国产开源,Java agent 零侵入,拓扑图自动生成,接口耗时一目了然)
5.三种部署方式总结
- 蓝绿部署(Blue-Green)
• 两套完整集群(蓝/绿),一次性全流量切换。
• 优点:零停机、秒级回滚。
• 缺点:需要双倍资源;升级时单集群算力减半,高峰期有风险。 - 红黑部署(Red-Black)
• 全量发布,但只保留一套线上集群。升级时新建黑集群,切换后销毁红集群。
• 优点:资源弹性伸缩、流程简单、100% 算力持续在线。
• 缺点:仍需一次全量流量切换;对自动化要求高。 - 灰度发布(Canary / 增量发布)
• 按百分比逐步放量:20% → 60% → 100%。
• 优点:风险最小,用户无感知。
• 缺点:流程复杂,需要额外监控与回滚策略。