← 返回题目列表

蓝绿部署、金丝雀发布、滚动发布有什么区别?灰度发布怎么做?

高频 中等 第 2 / 24 题 更新于 2026/08/03
蓝绿部署金丝雀发布灰度发布滚动发布

简化版

这些都是「怎么把新版本安全地发布到线上、尽量不影响用户、出问题能快速回滚」的发布策略,区别在「怎么切换流量、影响范围多大、回滚多快」:蓝绿部署(Blue-Green)——准备两套完全相同的环境(蓝=旧版、绿=新版),新版部署到绿环境、测试通过后一次性把全部流量从蓝切到绿;出问题切回蓝即可(回滚极快);缺点是要双倍资源。② 金丝雀发布(Canary)——新版先只给一小部分用户/流量(如 5%),观察没问题再逐步扩大(5%→20%→50%→100%);像「金丝雀试毒」,用小范围试错、控制爆炸半径;出问题只影响那一小部分。③ 滚动发布(Rolling)——逐批替换实例(一次换几个:v1 停一部分、起 v2,再换下一批),不用双倍资源,但发布过程中新旧版本并存。④ 灰度发布——通常是金丝雀的泛称/延伸,指「按一定规则(比例、用户标签、地域)让部分用户先用新版」,逐步放量。核心区别:蓝绿=整体切换(快但费资源)、金丝雀/灰度=按比例逐步放量(控制风险)、滚动=逐批替换(省资源但新旧并存)。

详细版

四种发布策略对比

策略怎么做资源回滚影响范围
蓝绿部署两套环境,一次性全量切换双倍极快(切回旧)切换瞬间全量
金丝雀发布先小流量,逐步放量少量额外快(撤掉金丝雀)逐步扩大(先小)
滚动发布逐批替换实例无额外较慢(逐批回滚)逐批(新旧并存)
灰度发布按规则让部分用户先用(金丝雀泛称)少量按规则控制
蓝绿部署:
  [蓝环境 v1] ←100%流量        部署v2到绿→测试
  [绿环境 v2]                   →一次性切流量→
  [蓝环境 v1]                   [绿环境 v2] ←100%流量(切换完成)
  出问题→切回蓝(秒级回滚)

金丝雀/灰度:
  v1 ←95%    v2 ←5%     观察OK→   v1 ←80%   v2 ←20%   →...→ v2 ←100%
  出问题→把 5% 切回 v1(只影响这 5%)

滚动发布(4个实例):
  [v1][v1][v1][v1] → [v2][v1][v1][v1] → [v2][v2][v1][v1] → ... → [v2][v2][v2][v2]
  逐批替换,过程中新旧并存

⚠️ 选择发布策略的核心是权衡「资源成本、回滚速度、风险控制」三者蓝绿部署回滚最快(切回旧环境秒级)、但要双倍资源(两套环境同时在跑),适合「不能容忍长时间故障、资源充足、要求快速回滚」的关键系统。金丝雀/灰度****风险控制最好(新版先给一小撮用户,出问题爆炸半径小),适合「新功能不确定、要小范围验证」的场景,但发布周期长(要逐步放量观察)。滚动发布****最省资源(不用双倍环境、逐批替换)、是 K8s 的默认策略,但发布过程中新旧版本并存(要保证新旧版本兼容,尤其数据库/接口的兼容性)。实践中常组合使用:比如「金丝雀 + 滚动」——先金丝雀验证一小部分,通过后再滚动全量替换。还有一个隐藏前提:要能快速回滚(新版本要向后兼容,别做不可逆的数据库变更)。

完整版教学

一、为什么需要发布策略

先理解「安全发布」的诉求:

发布新版本的风险:
  直接把线上全部换成新版("一刀切"发布):
    如果新版有 bug → 全部用户立刻受影响 → 大故障
    回滚也慢(要重新部署旧版)

想要的(安全发布的目标):
  ① 尽量不影响用户(发布过程用户无感或影响小)
  ② 控制风险(出问题只影响小范围,不是全量)
  ③ 快速回滚(发现问题能立刻退回旧版)
  ④ 可观察(发布过程能监控新版表现)

所以需要"发布策略"——不是简单粗暴地全量替换,
  而是有控制、可回滚、可观察地发布

不同策略在"资源、速度、风险控制"上各有侧重:
  蓝绿:快速回滚(双倍资源)
  金丝雀/灰度:风险控制(小范围试错)
  滚动:省资源(逐批替换)

发布策略要解决「安全发布」——直接全量替换(一刀切)的风险是「新版有 bug 全部用户立刻受影响、回滚慢」。安全发布的目标:尽量不影响用户、控制风险(出问题只影响小范围)、快速回滚、可观察。所以需要「有控制、可回滚、可观察」的发布策略,不同策略在「资源、速度、风险控制」上各有侧重。理解「一刀切发布风险(新版 bug 全部受影响+回滚慢)、安全发布目标:不影响用户/控制风险/快速回滚/可观察、需要有控制可回滚的发布策略」,就理解了为什么需要发布策略。

二、蓝绿部署:整体切换

蓝绿部署——两套环境、一次性切换:

蓝绿部署(Blue-Green Deployment):
  准备两套完全相同的生产环境:
    蓝环境(Blue):当前运行的旧版本 v1(100% 流量)
    绿环境(Green):闲置或用来部署新版本

  发布流程:
    1. 把新版本 v2 部署到绿环境
    2. 在绿环境测试、验证(此时绿环境不接生产流量)
    3. 验证通过 → 把流量从蓝一次性切到绿(改路由/负载均衡)
       → 此刻用户全部走 v2
    4. 蓝环境保留一段时间(作为回滚备份)
    5. 稳定后,蓝环境可用于下次发布(角色互换)

回滚:
  发现 v2 有问题 → 把流量切回蓝环境(v1)
  → 秒级回滚(蓝环境一直在跑,切路由即可)

优点:
  ① 回滚极快(切回旧环境)
  ② 发布干净(切换瞬间完成,不是新旧混合)
  ③ 可在绿环境充分测试再切
缺点:
  ① 双倍资源(两套环境同时存在)
  ② 切换瞬间是全量(如果 v2 有问题,切过去全量受影响,
     但能立刻切回)

蓝绿部署——两套完全相同的环境(蓝=旧 v1 接 100% 流量、绿=部署新 v2),流程:部署 v2 到绿环境 → 绿环境测试验证(不接生产流量)→ 一次性把流量从蓝切到绿(改路由)→ 蓝环境保留作回滚备份。回滚:切回蓝环境秒级(蓝一直在跑)。优点:回滚极快、发布干净(切换瞬间完成)、可充分测试再切;缺点:双倍资源、切换瞬间全量(v2 有问题全量受影响但能立刻切回)。理解「蓝绿:两套环境(蓝旧绿新)、部署 v2 到绿测试→一次性切流量到绿→蓝保留回滚;回滚切回蓝秒级;优点回滚快发布干净、缺点双倍资源+切换瞬间全量」,就掌握了蓝绿部署。

三、金丝雀发布:小范围试错

金丝雀发布——先小流量、逐步放量:

金丝雀发布(Canary Release):
  名字来源:矿工带金丝雀下矿,金丝雀对毒气敏感、先出事 → 预警
  → 用一小部分(金丝雀)先试,出问题先在小范围暴露

发布流程(逐步放量):
  1. 新版 v2 先只接一小部分流量(如 5%)
     大部分(95%)还是 v1
  2. 观察 v2 的表现(监控错误率、延迟、业务指标)
  3. 没问题 → 逐步扩大 v2 的流量比例:5% → 20% → 50% → 100%
     每一步都观察
  4. 直到 v2 接管全部流量、v1 下线

回滚:
  某一步发现 v2 有问题 → 把这部分流量切回 v1
  → 只影响那一小部分用户(爆炸半径小)

优点:
  ① 风险控制最好——新版先小范围验证,出问题影响小
  ② 渐进式——每步观察,有问题及时止损
  ③ 用真实流量验证(比测试环境更真实)
缺点:
  ① 发布周期长(要逐步放量、逐步观察)
  ② 新旧版本并存期间要兼容
  ③ 需要精细的流量控制(按比例路由)

怎么分流量:
  按比例(5% 流量到 v2)、按用户标签(内部员工先用)、
  按地域(某地区先用)等

金丝雀发布(矿工带金丝雀试毒预警)——新版先只接一小部分流量(5%),观察没问题再逐步放量(5%→20%→50%→100%,每步观察),直到 v2 接管全部。回滚:某步发现问题切回 v1,只影响那一小部分(爆炸半径小)。优点:风险控制最好(小范围验证)、渐进式(每步观察及时止损)、真实流量验证;缺点:发布周期长、新旧并存要兼容、需精细流量控制。分流量方式:按比例/按用户标签/按地域。理解「金丝雀:新版先小流量(5%)观察→逐步放量(5→20→50→100%)每步观察;回滚切回 v1 只影响小部分(爆炸半径小);优点风险控制最好+渐进+真实流量、缺点周期长+要兼容;分流量按比例/标签/地域」,就掌握了金丝雀发布。

四、滚动发布:逐批替换

滚动发布——逐批替换实例,K8s 默认:

滚动发布(Rolling Update):
  逐批替换实例,不用双倍环境
  假设有 4 个实例都是 v1:
    [v1][v1][v1][v1]
  发布过程(逐批换):
    停 1 个 v1、起 1 个 v2:[v2][v1][v1][v1]
    再换一批:              [v2][v2][v1][v1]
    继续:                  [v2][v2][v2][v1]
    完成:                  [v2][v2][v2][v2]
  → 一批批地把 v1 换成 v2,直到全部替换

K8s 的默认策略就是滚动更新:
  maxSurge(最多多起几个新的)、maxUnavailable(最多几个不可用)
  控制替换的节奏

优点:
  ① 无额外资源(不用双倍环境,就在原有实例上逐批换)
  ② 平滑(一批批换,不是一刀切)
缺点:
  ① 发布过程中新旧版本并存(v1 和 v2 同时在跑)
     → 要保证新旧兼容(接口、数据库结构兼容)
  ② 回滚较慢(要逐批换回 v1)
  ③ 发布过程中有一段时间容量下降(有实例在替换)

滚动 vs 蓝绿:
  滚动:省资源、新旧并存、逐批
  蓝绿:双倍资源、整体切换、回滚快

滚动发布(K8s 默认)——逐批替换实例(4 个 v1 实例:停 1 个 v1 起 1 个 v2 → 逐批换 → 全部 v2),不用双倍环境。K8s 用 maxSurge/maxUnavailable 控制节奏。优点:无额外资源(原实例逐批换)、平滑;缺点:发布过程新旧版本并存(要保证兼容)、回滚较慢(逐批换回)、发布中容量下降。滚动 vs 蓝绿:滚动省资源/新旧并存/逐批、蓝绿双倍资源/整体切换/回滚快。理解「滚动:逐批替换实例(停 v1 起 v2 逐批)、K8s 默认(maxSurge/maxUnavailable);优点无额外资源+平滑、缺点新旧并存要兼容+回滚慢+容量下降;vs 蓝绿省资源但新旧并存」,就掌握了滚动发布。

五、灰度发布与流量控制

灰度发布——金丝雀的泛称,按规则放量:

灰度发布(Gray Release):
  通常是金丝雀发布的泛称/延伸——
  "让一部分用户先用新版,逐步扩大到全部"

  和金丝雀的关系:
    金丝雀通常指"按比例小流量试错"
    灰度是更泛的说法,强调"按规则逐步放量"
    → 二者概念高度重叠,实践中常混用

灰度的分流规则(比金丝雀更强调"按规则"):
  ① 按比例:5% 流量到新版
  ② 按用户标签:内部员工、白名单用户、VIP 先用
  ③ 按地域:某个城市/地区先用
  ④ 按设备/客户端版本:某版本 App 先用
  ⑤ 按请求特征:带某个 header 的走新版

实现(微服务里怎么控制流量):
  ① 网关/负载均衡按规则路由(比例、header、用户标签)
  ② 服务网格(Istio)的流量管理(VirtualService 按权重/规则)
  ③ 注册中心 + 元数据(灰度标签)+ 路由规则
     (如 Nacos 的灰度、Dubbo 的路由规则、Spring Cloud 的灰度)

所以灰度发布 = 按规则让部分用户先用新版、逐步放量、精细控制风险
  是金丝雀思想的具体落地(强调分流规则和流量控制)

灰度发布(金丝雀的泛称/延伸)——「让一部分用户先用新版、逐步扩大」。和金丝雀高度重叠(金丝雀强调「按比例小流量」、灰度强调「按规则逐步放量」,实践常混用)。分流规则:按比例、按用户标签(内部员工/白名单/VIP)、按地域、按设备/客户端版本、按请求特征(header)。实现:网关/负载均衡按规则路由、服务网格(Istio)流量管理、注册中心+灰度标签+路由规则(Nacos/Dubbo/Spring Cloud 灰度)。理解「灰度发布(金丝雀泛称):让部分用户先用逐步放量、分流规则按比例/用户标签/地域/设备/header、实现靠网关路由/Istio/注册中心灰度标签」,就掌握了灰度发布。

六、选择与组合

总结怎么选、以及组合使用:

选择(按需求):
  要求快速回滚、资源充足、关键系统 → 蓝绿部署
  新功能不确定、要小范围验证、控制风险 → 金丝雀/灰度
  省资源、能接受新旧并存、常规发布 → 滚动发布(K8s 默认)
  按人群/地域精细放量 → 灰度发布(按规则)

组合使用(实践常见):
  金丝雀 + 滚动:
    先金丝雀验证一小部分(小流量观察)
    通过后再滚动全量替换(省资源地铺开)
  蓝绿 + 金丝雀:
    绿环境先接一小部分流量(金丝雀式验证)
    再逐步全量切换

三个关键前提(任何策略都要):
  ① 可回滚——新版本要向后兼容,别做不可逆的变更
     (尤其数据库:加字段兼容、别删字段/改类型)
  ② 可观察——发布过程要监控(错误率、延迟、业务指标)
     才能判断"新版好不好、要不要继续/回滚"
  ③ 新旧兼容——滚动/金丝雀期间新旧并存,接口和数据要兼容

一句话:
  蓝绿=整体切换(快但费资源)、金丝雀/灰度=按比例/规则逐步放量
  (控制风险)、滚动=逐批替换(省资源但新旧并存);
  实践常组合,前提是可回滚+可观察+新旧兼容

选择(按需求):快速回滚/资源充足/关键系统→蓝绿;新功能不确定/小范围验证→金丝雀/灰度;省资源/常规发布→滚动(K8s 默认);按人群/地域精细放量→灰度。组合使用:金丝雀+滚动(先金丝雀验证再滚动全量)、蓝绿+金丝雀。三个关键前提(任何策略都要):① 可回滚(新版向后兼容、别做不可逆变更,尤其数据库加字段别删改)、② 可观察(监控错误率/延迟/业务指标判断好坏)、③ 新旧兼容(滚动/金丝雀期间并存要兼容)。理解「选择:快速回滚用蓝绿、小范围验证用金丝雀、省资源用滚动、按规则放量用灰度;组合金丝雀+滚动;三前提:可回滚(向后兼容别不可逆)+可观察(监控)+新旧兼容」,就掌握了选择和组合。

记忆钩子:「发布策略权衡资源/回滚速度/风险控制:①蓝绿部署(两套环境蓝旧绿新、部署 v2 到绿测试→一次性切流量、回滚切回蓝秒级;优点回滚快发布干净、缺点双倍资源+切换全量)②金丝雀发布(新版先小流量 5%观察→逐步放量 5→20→50→100%、回滚切回 v1 只影响小部分爆炸半径小;风险控制最好但周期长)③滚动发布(逐批替换实例、K8s 默认;省资源但新旧并存要兼容+回滚慢)④灰度发布(金丝雀泛称、按规则放量:比例/用户标签/地域/header、靠网关/Istio/注册中心灰度标签);组合金丝雀+滚动;三前提:可回滚(向后兼容)+可观察(监控)+新旧兼容」

七、常见误区与追问

  • 误区:蓝绿部署和金丝雀发布一样。 不一样——蓝绿是「两套环境、一次性全量切换」(切换瞬间全量走新版,回滚切回旧环境);金丝雀是「先小流量、逐步放量」(新版先给一小部分用户、观察后逐步扩大);蓝绿整体切换、金丝雀渐进放量,风险控制方式不同。
  • 误区:滚动发布不用管新旧版本兼容。 要管——滚动发布过程中新旧版本并存(部分实例是 v1、部分是 v2 同时在跑),所以接口、数据库结构必须新旧兼容;否则新旧版本交互会出错;这是滚动发布(和金丝雀)的一个重要前提。
  • 误区:蓝绿部署没有风险。 蓝绿切换瞬间是全量的——如果新版 v2 有问题,切过去后全量用户立刻受影响(只是能快速切回蓝环境回滚);它的优势是回滚快,不是风险小;要小范围验证控制风险应该用金丝雀/灰度。
  • 误区:有了发布策略就能随便发。 任何发布策略都有前提——① 可回滚(新版本要向后兼容,别做不可逆的数据库变更如删字段、改类型);② 可观察(要监控错误率、延迟、业务指标才能判断新版好坏);否则发布策略再好,出问题也回滚不了、或发现不了问题。
  • 追问:蓝绿部署和滚动发布怎么选? 蓝绿:要求快速回滚(切回旧环境秒级)、资源充足(能承受双倍环境)、关键系统不能容忍长故障;滚动:省资源(不用双倍环境、逐批替换、K8s 默认)、能接受发布过程中新旧版本并存和短暂容量下降;蓝绿回滚快但费资源、滚动省资源但回滚慢且新旧并存。
  • 追问:金丝雀发布怎么控制流量(让 5% 走新版)? 通过流量路由——① 网关/负载均衡按权重路由(95% 到 v1、5% 到 v2);② 服务网格 Istio 的 VirtualService 按权重或规则分流;③ 注册中心 + 灰度标签 + 路由规则(如 Nacos/Dubbo/Spring Cloud 的灰度,给实例打标签、按规则路由);分流规则可以是比例、用户标签、地域、请求 header 等。
  • 追问:为什么发布前要保证「向后兼容」和「可回滚」? 因为发布可能失败要回滚——如果新版本做了不可逆的变更(如数据库删了字段、改了字段类型),回滚到旧版本时旧代码可能读不到数据或报错,就回滚不了了;所以数据库变更要向后兼容(只加字段、不删不改),保证新旧版本都能正常工作,这样新版出问题才能安全回滚到旧版;这是所有发布策略的隐藏前提。

八、加强记忆

蓝绿部署、金丝雀发布、滚动发布、灰度发布都是「安全发布新版本」的策略,权衡「资源成本、回滚速度、风险控制」① 蓝绿部署(Blue-Green)——两套相同环境(蓝=旧 v1 接 100% 流量、绿=部署新 v2),部署 v2 到绿测试通过后一次性把全部流量切到绿,出问题切回蓝秒级回滚;优点回滚快、发布干净,缺点双倍资源、切换瞬间全量② 金丝雀发布(Canary)——新版先只接一小部分流量(5%)观察,没问题再逐步放量(5%→20%→50%→100%),出问题只影响那一小部分(爆炸半径小);风险控制最好但周期长、新旧并存要兼容。③ 滚动发布(Rolling)——逐批替换实例(K8s 默认),省资源但新旧版本并存要兼容、回滚较慢④ 灰度发布——金丝雀的泛称,按规则(比例/用户标签/地域/header)让部分用户先用、逐步放量,靠网关/Istio/注册中心灰度标签实现。选择:快速回滚用蓝绿、小范围验证用金丝雀/灰度、省资源用滚动;实践常组合(金丝雀+滚动)。三个前提可回滚(新版向后兼容、别做不可逆的数据库变更)、可观察(监控错误率/延迟/业务指标)、新旧兼容。一句话「蓝绿=两套环境整体切换(回滚快但双倍资源)、金丝雀=先小流量逐步放量(风险控制最好爆炸半径小)、滚动=逐批替换(省资源但新旧并存 K8s 默认)、灰度=按规则放量(金丝雀泛称);选择看快速回滚/小范围验证/省资源;前提可回滚+可观察+新旧兼容」。