金丝雀部署及其在 DevOps 中的作用解释

金丝雀发布,作为一种软件开发与部署策略,其核心理念在于:在全面推广新功能或更新之前,先逐步向少量用户群体发布。

这种方法的操作模式是这样的:首先创建软件的新版本,并将其部署到一部分用户手中,而其余用户继续使用旧版本。 开发团队在此期间会密切关注新版本的运行状况,确保其稳定且功能符合预期。

若新版本表现良好,便会逐步扩大用户覆盖范围,直至覆盖全体用户。 这种渐进式的发布方式,能够有效降低因引入错误或其它潜在问题而对所有用户造成影响的风险。

金丝雀发布的关键目标在于降低新功能上线可能带来的风险。 通过这种循序渐进的发布方式,开发人员可以实时监控新版本的性能和稳定性,并及时进行必要的调整,从而确保向新版本的过渡更加平稳。

主要原则与优势

资料来源:martinfowler.com

金丝雀发布的核心原则包含以下几点:

  • 首先将新版本部署给小部分用户,然后逐步扩大用户覆盖范围。
  • 对新版本进行密切监控,以确保其稳定性以及功能是否符合预期。
  • 一旦出现问题,能够快速且便捷地回滚至之前的版本。
  • 尽可能地实现部署过程的自动化,以此来降低人为错误的风险。

在DevOps实践中,金丝雀发布具有以下优势:

  • 通过逐步发布更新,最大程度降低了因引入错误或其它问题而对所有用户产生影响的风险。
  • 开发人员能够更快地获得关于新版本的反馈,从而在全面推广之前做出必要的调整。
  • 通过持续监控新版本的性能和稳定性,开发人员可以确保其在部署到所有用户之前达到必要的质量标准。
  • 金丝雀发布有助于提高开发人员和利益相关者对部署过程的信心,因为它降低了因问题影响用户体验的风险。

基于概念和术语的金丝雀发布

来源:cncf.io

接下来,让我们来回顾一下金丝雀发布的典型生命周期。

整个过程始于“金丝雀”,即新版本系统的“尝鲜者”。 与之对应的是“基线”组,指的是除“金丝雀”用户之外的所有其他用户。

随着“金丝雀”用户对新版本的持续使用,金丝雀发布会逐步扩大到更多用户,这便是流量转移的过程。 “金丝雀”组的规模不断扩大,“基线”组的规模则相应缩小,最终实现系统的渐进式部署。

在此过程中,监控系统会记录所有活动和使用结果,并生成开发人员所需的指标作为反馈。 开发人员根据这些反馈来修复问题,或是在无法解决问题的情况下回滚至基线版本。

所有监控和部署活动都是自动化的,这让开发人员可以更加专注于问题修复。

“金丝雀”组可能会发现新版本的某些功能存在问题,而另一些功能则表现良好。 因此,开发人员会标记存在问题的功能,并在部署过程中禁用它们。

开发人员需要同时关注“金丝雀”和“基线”两个用户群体。 用户在使用过程中会生成A/B测试结果,这反映了旧系统和新系统在相同条件下的表现。 同时,新版本系统也会持续运行自动化测试,以确保“金丝雀”组的健康检查处于稳定状态。

与传统部署策略的差异

在了解了金丝雀发布的高层生命周期后,它与传统部署流程的区别便显而易见了。

  • 金丝雀发布采用逐步部署的方式,可以更好地控制风险,而非一次性部署给所有用户并等待问题爆发。
  • 它将新版本错误的潜在风险限制在“金丝雀”组中,而不是让所有用户同时面临风险。
  • 它允许在用户使用新版本之前对其进行监控,而不是在用户使用之后才开始监控,从而避免了在发布后的维护阶段投入大量时间和资源。
  • 在将新版本完全部署到生产环境之前,你可以随时回滚版本,而传统的部署策略则需要在发布完成后安排另一个发布窗口来撤销更改。
  • 金丝雀发布自然会促使你尽可能地投资自动化工具和流程,而传统的部署策略往往会将自动化计划的优先级降低。

金丝雀发布中的 CI/CD 管道

来源:aws.amazon.com

在典型的 CI/CD 管道中,代码更改会自动构建、测试并部署到临时环境中,以进行进一步的测试。 金丝雀发布正是CI/CD管道的理想应用场景。

在代码更改部署到临时环境并通过所有必要的测试后,CI/CD 管道会自动将金丝雀版本部署到生产环境中,供一小部分用户使用。

如果出现问题,只需运行另一个管道进行回滚。 或者标记存在问题的功能,使其不再参与后续的部署流程。 所有流程都是自动化的,无需过多的人工干预。

金丝雀版本通常会集成自动化健康检查测试,而这些测试也是CI/CD管道的基本组成部分,对于构建高效的CI/CD管道至关重要。

金丝雀发布的工作流程与阶段

综上所述,以下是你在项目中可以应用的典型金丝雀发布流程:

#1. 规划和准备

在这一阶段,开发团队需要对金丝雀发布进行规划和准备,包括确定要进行的变更或更新、创建软件的新版本,以及定义用于监控新版本性能的指标和健康检查。 团队还需要确定首批使用新版本的用户子集,并制定详细的发布计划。

#2. 实施流量路由和监控

新版本的软件会部署给规划阶段确定的用户子集。通过实施流量路由,将一部分用户流量引导至新版本,而其余用户继续使用旧版本。同时,使用各项指标和健康检查,对新版本的性能和稳定性进行密切监控,以确保其运行符合预期。

#3. 分析和评估部署性能

根据规划阶段定义的指标和健康检查,对新版本的性能进行分析和评估。 如果新版本表现良好,将逐步扩大用户覆盖范围。 若新版本存在问题,可以快速回滚至之前的版本。

#4. 升级或回滚部署

开发团队需要决定是否将新版本推广给所有用户,或者回滚至之前的版本。 如果新版本表现良好并符合质量标准,则会推广至所有用户。 如果新版本存在问题,可以快速便捷地回滚至之前的版本。

来源:aws.amazon.com

最佳实践和策略

在你的平台中实施金丝雀发布时,首先要明确目标以及最终的成功标准。 你可以在性能指标、用户反馈以及业务影响等方面制定相应的标准。

创建一个小规模用户群体来测试软件的新版本,即“金丝雀”版本。 一开始选择规模过大的用户群体并非明智之举,因为在初期阶段,灵活性至关重要。

正如之前多次强调的那样,使用指标和健康检查来监控新版本的性能和稳定性。 一旦发现任何可疑情况,都要及时采取行动。 在逐步发布的过程中,过度反应比反应不足更为稳妥。

随着时间的推移,逐步扩大新版本的用户覆盖范围。 这有助于确保新版本的平稳过渡。

尽可能地利用自动化工具和流程来简化部署和监控流程,将其集成到 CI/CD 管道中,并使其自动触发预定的部署流程。 这有助于降低人为错误的风险,并确保部署过程的一致性和可重复性。

实施功能标志,以启用或禁用软件中的特定功能。 这让你能够更好地控制未来的部署流程,而无需频繁地手动修改或更新代码,从而让开发人员更加专注于重要的领域,即修复错误。

使用 A/B 测试来比较两个不同版本软件的性能。将用户随机分配到不同的版本中,以确定哪个版本的性能更佳,并以此指导未来的开发决策。

确保在遇到问题时,能够快速回滚部署。这有助于降低问题的影响,并实现快速恢复。

挑战与案例研究

虽然金丝雀发布具有显著的优势,但也面临着一些挑战。

金丝雀发布面临的一个挑战是网络延迟,这可能会影响新版本软件的性能。 为了应对这一挑战,开发人员可以使用负载均衡器和内容分发网络等工具来提高网络性能。 这不仅包括外部用户访问造成的系统延迟,还包括部署或 CI/CD 管道执行等内部流程的延迟。 这些延迟必须尽可能地缩短,否则会导致开发人员空闲等待管道完成运行。

另一个挑战是确保新旧版本软件之间的数据一致性。 为了应对这一挑战,开发人员可以使用数据库复制和同步等技术,来确保数据在所有版本中保持一致。 当生产用户同时运行旧版本和新版本时,你需要确保这两个版本始终完全同步,并且用户不会因为身处“金丝雀”或“基线”组而丢失任何生产数据。 这可能是一个难以达成的目标,因此需要可靠的后台流程来提供支持。

Netflix是使用金丝雀发布来对其流媒体服务进行更改的著名公司。该公司结合使用自动化测试、功能标记和 A/B 测试来缓慢推出更改。

谷歌也是使用金丝雀发布来对其云服务进行更改的公司。 同样,该公司利用自动化测试、流量分割和监控来逐步向一小部分用户推出更改,然后再部署到所有用户。 这种方法帮助谷歌提高了服务的质量和稳定性。

总结

与所有流程、方法或策略一样,金丝雀发布并不能解决所有问题。 在某些情况下,由于环境限制、人员的知识水平或缺乏概念理解等原因,很难实施金丝雀发布。

它更适合新时代的项目。 如果敏捷思维是坚实的基础,那么每个流程的自动化无疑是重中之重,而最大程度的可靠性是利益相关者的强烈需求。

在这种情况下,金丝雀发布在某种程度上是敏捷开发实践的下一个层次,它可以将团队提升到项目以前从未达到过的领域。

下一步,可以考虑扩展和优化 CI/CD。