Canary Release 是一种部署策略,新版本的应用程序首先交付给一小部分用户,然后逐步推广到所有受众。这种方法可以早期发现问题,最大限度地减少对所有用户的影响。根据 Google Cloud (2024),canary 发布将事件平均检测时间减少了 60%。金丝雀部署已成为关键服务的标准,在这些服务中,功能的完全不可用是不可接受的。
要点
Canary Release 是一种部署技术,新版本的服务首先被导向一小部分用户,只有在稳定性确认后才推广到所有受众。这个术语源于 “煤矿中的金丝雀” 的比喻——历史上矿工们带着金丝雀来检测危险气体。在软件开发中,金丝雀用户组扮演着同样的早期问题指示器角色。
软件开发生态中的 canary 比喻出现在 2010 年代,随着微服务架构和持续部署实践的兴起。Netflix、Amazon 和 Google 公司率先大规模应用了 canary 发布,并发布了结果和方法论。如今,canary 已成为每个严肃项目的标准模式,这些项目中生产环境错误的代价以用户数据和收入来衡量。现代编排平台(如 Kubernetes)为 canary 策略提供内置支持。
Canary 发布的基础是在应用程序的旧版本(stable)和新版本(canary)之间分配流量。Canary 版本的初始份额占总流量的 1–5%。监控系统持续比较两个版本的指标。如果偏差不超过允许的阈值,canary 份额会自动增加到 25%、50% 并最终达到 100%。当指标恶化时,部署会自动停止并启动回滚。
金丝雀部署过程由连续的阶段组成,每个阶段在进入下一阶段之前都需要 自动验证。让我们以在 Kubernetes 中部署的、使用 service mesh 进行流量管理的后端服务为例来探讨典型场景。
第一阶段 — 将 canary 版本部署到带有 `version: canary` 标签的隔离 Pod 组。流量均衡器(例如 Istio 或 Linkerd)将 2% 的请求引导到该组。监控系统在 10-30 分钟内收集两个版本的指标。如果错误率稳定且延迟没有增加,自动化系统会将 canary 份额增加到 10%,然后是 50%。在每个阶段,管道等待监控或开发人员(手动门控)的确认。当 100% 的流量流向 canary 时,旧版本退出服务。
stage("Canary Deploy") {
steps {
sh "kubectl set image deployment/canary app=${NEW_VERSION}"
sh "kubectl scale deployment/canary --replicas=2"
}
}
stage("Canary Observation") {
steps {
script {
def healthy = sh(
script: "check-canary-health.sh",
returnStatus: true
)
if (healthy != 0) {
error "Canary failed health check"
}
}
}
}
stage("Gradual Rollout") {
steps {
sh "update-traffic-split.sh canary 25"
sh "sleep 300 && check-metrics.sh"
sh "update-traffic-split.sh canary 50"
sh "sleep 300 && check-metrics.sh"
sh "update-traffic-split.sh canary 100"
}
}
Canary 的关键优势 — 当指标恶化时 自动回滚。如果在增加 canary 版本份额后错误率超过阈值(例如,比基线高 +5%),管道会自动将所有流量引导回旧版本。开发人员会收到包含详细报告的通知:哪些指标下降、在哪些端点、部署了哪个代码版本。这种方法将恢复时间(MTTR)从数小时缩短到数分钟。
| 阶段 | 流量份额 | 持续时间 | 转换条件 |
|---|---|---|---|
| Initial | 2% | 10–30 分钟 | 错误率 < 基线 + 1% |
| Expansion | 10–25% | 30–60 分钟 | 延迟 p95 < 基线 + 10% |
| Majority | 50% | 30–60 分钟 | 业务指标稳定 |
| Full rollout | 100% | — | 所有检查通过 |
Canary 和 blue-green 是两种流行的零停机部署策略,经常被混淆。两者都确保服务的 持续可用性,但在流量管理和新版本测试方法上存在根本区别。理解差异对于为特定场景选择正确策略至关重要。
蓝绿部署使用两个相同的环境(blue — 当前,green — 新)。在完成 green 环境的部署和测试后,流量立即切换——通过一次 路由器切换。而 Canary 则专注于在同一基础设施上逐步增加新版本的份额,提供更精细的控制。蓝绿部署需要复制整个基础设施,成本更高,但保证立即回滚。Canary 更经济,但需要更复杂的监控和自动化。
Canary 发布适用于 部署频率高(每天多次)的服务,在这些服务中,在真实流量上测试变更非常重要。它对于移动应用的 backend 服务、API 网关和微服务特别有效,因为可以精确控制路由。蓝绿部署则更适合单体应用或难以实现流量分数分配的服务。
Canary 发布的成功完全取决于 监控质量。如果没有在 canary 和 stable 版本之间精确比较指标,canary 就失去了意义——关于扩展或回滚的决定是盲目做出的。让我们探讨一下 canary 分析的关键指标及其聚合方法。
主要指标 — 错误率(HTTP 5xx 百分比、异常和超时)、延迟(p50、p95、p99 响应时间)、吞吐量(每秒请求数)和资源利用率(CPU、内存)。比较必须是隔离的:canary 组的指标与相同大小的对照组的指标进行比较,而不是整个服务的指标。为了正确比较,使用 Mann-Whitney 统计检验或置信区间计算。
除了技术指标外,canary 分析还应考虑 业务指标:转化率、留存率、交易数量、每用户收入。对于移动应用,无崩溃率、冷启动时间和 ANR 频率至关重要。如果技术指标正常但业务指标下降——这是回滚的信号。将 canary 平台与分析系统(Amplitude、Mixpanel)集成可以自动比较组之间的业务指标。重要的是为两个组使用相同的比较周期,考虑季节性和流量的日周期性。例如,在高峰时段比较 canary 组与在低负载时段的对照组进行比较会产生扭曲的结果。
设置自动回滚阈值是一项关键任务,需要在灵敏度和对 噪声的抵抗力之间取得平衡。阈值过低会导致在指标正常波动时产生误报并停止部署。阈值过高会漏掉真正的问题。建议根据历史数据设置阈值:前 7 天的基线指标,置信区间为 95%。对于错误率,典型阈值是相比基线增加超过 2 个百分点。对于延迟 — p95 超过 20%。
现代生态系统提供了许多实现 canary 发布的工具——从编排平台的内置功能到 专门的 service mesh 解决方案。具体工具的选择取决于技术栈和流量控制要求。
Istio — Kubernetes 中最流行的用于 canary 部署的 service mesh。Istio 允许在 VirtualService 和 DestinationRule 级别管理流量分配,而无需更改应用程序代码。Linkerd 提供类似的功能,配置更简单。这两个工具都支持加权流量分配、请求镜像和基于指标的自动回滚。
CI/CD 平台,如 Argo Rollouts 和 Flagger,为 Kubernetes 中的 canary 部署提供专门的资源。它们与 Prometheus 集成以收集指标,并自动管理扩展或回滚过程。对于移动应用,canary 通过 Google Play Console 和 App Store Connect 中的分阶段发布实现,其中新用户的份额在应用商店级别在几天内进行调整。
常见问题
Canary Release 是一种用于检查新版本稳定性的部署策略,而 A/B 测试是比较两个变体有效性的实验。Canary 检查 “服务是否会崩溃”,而 A/B 检查 “哪个变体对业务更好”。然而,canary 基础设施经常被用作 A/B 实验的基础。
最佳初始百分比是总流量的 1–5%。这足以满足指标的统计显著性,但在出现问题时不足以对用户产生重大影响。对于低流量服务(低于 1000 RPM),份额可以增加到 10–20% 以获得有意义的数据。重要的是,对 canary 的绝对请求数必须足以进行分析。
Canary 阶段的最短持续时间为 10–30 分钟,以收集足够的指标。完整的 canary 发布周期可能需要 30 分钟到几个小时,具体取决于服务的复杂性和流量量。对于通过应用商店的移动应用,由于更新传播的延迟,canary 阶段可能持续 1-3 天。
是的,对于移动应用,canary 通过 Google Play Console 和 App Store Connect 中的 分阶段发布 实现。新版本首先对 1–5% 的用户可用,然后如果崩溃没有增加,份额会增加。对于移动应用的 backend 服务,canary 通过 API 网关侧的流量分配标准方式工作。
主要风险 — 错误的 不均匀分布:canary 组可能意外接收到特定用户(例如仅来自一个区域),这将扭曲指标。另一个风险 — 正确设置监控和自动回滚阈值的复杂性。过于激进的 canary(高初始百分比或快速 rollout)会失去逐步部署的优势。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。