金丝雀部署是一种软件开发和部署技术,它在向整个用户群推广之前逐步向一小部分用户发布新功能或更新。
这种方法涉及创建软件的新版本并将其部署给一小部分用户,同时保持旧版本为其余用户运行。 开发团队密切监控新版本,以确保其稳定并按预期运行。
如果一切顺利,新版本将向更多用户推出,直到最终覆盖整个用户群。 通过这种方式,项目团队可以最大限度地降低引入错误或其他可能同时影响所有用户的问题的风险。
金丝雀部署的目的是降低向大量用户群引入新功能的风险。 通过逐步向用户推出更改,开发人员可以监控新版本的性能和稳定性。 他们在部署到整个用户群之前进行必要的调整。 因此,向新版本的过渡会更加顺利。
目录
主要原则和好处
资料来源:martinfowler.com
Canary 部署的主要原则包括以下内容:
DevOps 中金丝雀部署的好处包括:
基于概念和术语的金丝雀部署
来源:cncf.io
让我们回顾一下该流程的典型生命周期。
这一切都从金丝雀开始,即新版本系统的“尝鲜者”。 与此并行的是基线组。 这里属于 Canary 之外的所有其他用户。
随着Canary用户继续使用新版本,Canary部署扩展到越来越多的用户。 这就是流量转移。 Canary 组增长,而 Baseline 组缩小,因此系统执行渐进式部署 (Gradual Rollout)。
在此过程中,监控流程会记录所有活动和使用结果,并生成开发人员需要的指标作为反馈。 然后开发人员做出反应并修复必要的问题。 或者,如果他们目前无法解决问题,他们会回滚到基线。
自动化所有监控和部署活动。 这使得开发人员能够专注于问题修复。
Canary 小组可能会发现新版本的某些功能很糟糕,而另一些功能则很好。 因此,开发人员将标记有问题的功能,以在部署过程中禁用它们。
开发人员同时关注这两个群体——金丝雀和基线。 用户正在生成 A/B 测试结果。 这就是旧系统和新系统在相同条件下的行为。 而且,新版本的系统上会不断运行自动测试,以确保 Canary 组健康检查稳定。
它与传统部署策略有何不同
了解了高层生命周期流程后,这与传统部署流程的区别是相当明显的。
- 您可以逐步部署并更好地控制,而不是一次性部署给每个人并等待影响整个生产的问题。
- 您仅将新版本错误的风险限制在 Canary 组中,而不是让整个世界同时面临这些问题。
- 您可以在用户拥有新版本之前对其进行监控,而不是在用户拥有新版本之后进行监控,并在发布过程的超级维护阶段投入大量时间和资源。
- 您可以在将新版本完全部署到生产环境之前决定回滚方式。 另一方面是安排另一个发布窗口以在生产发布完成后撤消生产。
- 金丝雀部署自然会迫使您尽可能投资自动化工具和流程。 另一方面,坚持传统的部署策略自然会将所有自动化计划的优先级降低到待办事项列表的末尾。
Canary 部署中的 CI/CD 管道
来源:aws.amazon.com
在典型的 CI/CD 管道中,更改会自动构建、测试并部署到临时环境中,以便在部署到生产之前进行进一步测试。 而且,它是 Canary 部署中的完美用例。
将更改部署到临时环境并通过所有必要的测试后,CI/CD 管道将自动将金丝雀版本部署到生产环境中的一小部分用户。
如果出现问题,只需运行另一个管道进行回滚即可。 或者标记有问题的功能,它永远不会再出现在部署管道的部署过程中。 一切都是自动的,您无需再关心它。
由于金丝雀版本充满了自动化健康检查测试,所有这些都自然地融入到 CI/CD Pipelines 的基本功能中。 无论如何,它们是每个优秀的 CI/CD 管道的必备组成部分。
金丝雀部署的工作流程和阶段
将信息汇总在一起,这是您可以在项目中使用的典型 Canary 部署的通常工作流程。
#1. 规划和准备
在此阶段,开发团队计划并准备金丝雀部署。 这包括确定要进行的更改或更新、创建软件的新版本以及定义将用于监控新版本性能的指标和运行状况检查。 该团队还确定了将首先收到新版本的用户子集,并定义了推出计划。
#2. 实施流量路由和监控
新版本的软件将部署到规划阶段确定的用户子集。 流量路由的实现是为了将一部分用户流量引导至新版本,同时保持旧版本为其余用户运行。 使用指标和运行状况检查密切监控新版本的性能和稳定性,以确保其按预期运行。
#3。 分析和评估部署性能
根据规划阶段定义的指标和健康检查来分析和评估新版本的性能。 如果新版本表现良好,随着时间的推移,将逐渐向更多用户推出。 如果新版本出现任何问题,部署可以快速回滚到之前的版本。
#4。 升级或回滚部署
开发团队决定是否向整个用户群推广新版本或回滚到以前的版本。 如果新版本表现良好并符合必要的质量标准,则将其推广到整个用户群。 如果新版本出现任何问题,可以快速轻松地将部署回滚到以前的版本。
来源:aws.amazon.com
最佳实践和策略
在您的平台中实施金丝雀部署时,首先要定义明确的目标以及最终的成功结果。 您可能会在性能指标、用户反馈标准和业务影响等方面提供帮助。
创建一小部分用户来测试软件的新(金丝雀)版本。 一开始较大的群体并不是真正的优势。 您希望尽可能灵活,尤其是在开始时。
正如已经提到的几次,使用指标和运行状况检查来监控新版本的性能和稳定性。 每当看到任何可疑的情况时都要做出反应。 当逐步推出时,过度反应比反应不足要好。
随着时间的推移,逐渐向更多用户推出新版本。 这可确保更顺利地过渡到新版本。
尽可能使用自动化工具和流程来简化部署和监控流程。 将它们包含到 CI/CD 管道中,并使它们自动触发预定的部署流程。 这降低了人为错误的风险,并确保部署过程的一致性和可重复性。
实施功能标志以启用或禁用软件中的特定功能。 您将获得对未来部署流程的控制,而无需总是手动修改或更新。 您将让开发人员更加关注重要的领域——修复错误。
使用 A/B 测试来比较两个不同版本软件的性能。 将随机用户分配到一个版本或另一个版本。 确定哪个版本性能更好,并根据未来的开发决策做出反应。
确保如果新版本出现任何问题,您可以随时快速回滚部署。 它将减少任何问题的影响并允许快速恢复。
挑战和案例研究
尽管金丝雀部署具有明显的优势,但仍然存在一些挑战。
金丝雀部署的一项挑战是网络延迟,这可能会影响新版本软件的性能。 为了应对这一挑战,开发人员可以使用负载均衡器和内容交付网络等工具来提高网络性能。 这不仅仅是外部使用造成的系统延迟。 还有部署或 CI/CD 管道执行等内部流程的延迟。 这些必须尽快完成。 否则,您将有一队处于空闲状态的开发人员等待管道完成运行。
另一个挑战是确保新旧版本软件之间的数据一致性。 为了应对这一挑战,开发人员可以使用数据库复制和同步等技术来确保数据在所有版本中保持一致。 让生产用户同时在旧版本和新版本中运行会增加您的期望,即您将确保两个版本始终完全同步,并且用户不会仅仅因为他们位于 Canary/Baseline 组中而丢失任何生产数据。 这可能确实是一个很难满足的期望,因此请用可靠的后台流程来支持自己。
Netflix 是使用 Canary Deployment 对其流媒体服务进行更改的著名公司示例。 该公司结合使用自动化测试、功能标记和 A/B 测试来缓慢推出更改。
谷歌是使用 Canary Deployment 对其云服务进行更改的公司的另一个例子。 同样,该公司利用自动化测试、流量分割和监控包含的优势,逐步向一小部分用户推出更改,然后再部署到所有用户。 这种方法帮助谷歌提高了服务的质量和稳定性。
最后的话
与所有流程、方法或策略一样,金丝雀部署并不能解决世界上所有问题。 在某些情况下,由于环境限制、人们的知识或普遍缺乏概念理解,几乎不可能实施。 我
更适合新时代的项目。 如果敏捷思维是坚如磐石的基本属性,那么每个流程的自动化无疑是优先事项,而最大程度的可靠性是利益相关者的强烈期望。
在这种情况下,金丝雀部署在某种程度上是敏捷开发实践的下一个层次。 它可以将团队提升到项目以前从未有过的领域。
接下来,检查扩展和优化 CI/CD。