蓝绿部署及其在 DevOps 中的作用解释

在当今云计算和 DevOps 软件平台高度灵活、敏捷及持续部署的背景下,传统的“瀑布式”软件开发方法显得格格不入。

仅仅准备一份在生产发布部署时执行的手动步骤清单是远远不够的。 如果你仍然这样做,那么你并不能真正算作敏捷实践者,更不是真正的 DevOps 推崇者。

蓝绿部署:概念解析

蓝绿部署是一种软件部署策略,它通过构建两个相同的环境(一个活动环境,即“蓝色”环境;一个非活动环境,即“绿色”环境),从而显著降低停机时间和新软件版本带来的潜在风险。

活动环境是当前软件版本的运行场所,也是用户访问并产生生产流量的地方。而非活动环境则用于部署和测试新版本的软件。

一旦新版本完成测试并准备就绪,系统会将流量从活动环境切换至非活动环境,使其成为新的活动环境。 这个过程可以按需反复进行。

来源: docs.aws.amazon.com

DevOps 环境下的蓝绿部署

蓝绿部署与 DevOps 的理念和实践高度契合,因为它支持软件的持续交付和部署,同时最大限度地减少生产用户的停机时间,并降低生产发布失败的风险。

拥有两个相同的环境,允许在不干扰当前生产环境的情况下测试和部署新版本的软件。 这意味着可以实现更快、更频繁的发布,而这正是 DevOps 的核心要素。

此外,在环境之间快速切换流量的能力,为出现问题时快速回滚提供了重要保障,这对 DevOps 环境来说至关重要。

蓝绿部署的核心原则

#1. 两个完全相同的环境

蓝绿部署的基础是创建两个完全相同的环境。 这意味着两个环境在数据和流程上都是一致的。 其中一个环境处于活动状态(蓝色),另一个处于非活动状态(绿色)。

蓝色环境是生产用户进行日常操作的场所。 绿色环境始终与蓝色环境同步,但测试人员会在该环境中运行他们的测试用例。 尽管绿色环境不是生产环境,但由于其环境配置与生产环境相似,因此可以在真实条件下运行测试。

#2. 流量切换

当新版本的软件完成测试并准备好部署时,系统会将流量从当前的活动环境切换到非活动环境,使后者成为新的活动环境。

这个切换过程是即时完成的。所有的部署工作在此之前就已经完成,无需停机时间窗口。用户无需执行任何操作,即可自动被重定向到新的环境。

来源: aws.amazon.com

#3. 快速回滚

在环境之间快速切换流量的能力也意味着,在出现问题时,可以快速地将系统回滚到之前的稳定状态。这保证了最短的停机时间,并确保应用程序具有高可用性。

如果绿色环境出现故障,所有的用户都可以立即切换回稳定的蓝色环境,不会出现任何不流畅的情况。

#4. 自动化测试

自动化测试是蓝绿部署的关键组成部分。它可以确保新版本的软件在部署到活动环境之前,已经经过了全面的测试。

如果你的系统中缺乏大量的自动化测试(至少包括单元测试、功能测试和回归测试),那么实施蓝绿部署的意义可能不大。

缺乏自动化测试会大大降低你的速度。 测试新环境所需的时间将会过长,以至于当你能够切换到绿色环境时,从软件开发生命周期的角度来看,它可能已经“过时”了。

#5. 持续交付

蓝绿部署是持续交付流程的重要组成部分,最终目的是实现更快、更频繁的软件发布到生产环境。

当你在绿色环境上准备好测试新版本的软件时,你可以立即进行切换。 由于部署已经完成,你只需要进行流量切换,这个过程非常快,你可以每天都进行多次。当然,这假设你的测试活动也足够快。

典型的生命周期

运行蓝绿部署的平台,有着其自身特定的运行步骤和流程的生命周期, 通常包含以下几个关键步骤:

  • 构建新版本的软件。这包括编译代码、运行自动化测试,以及创建可部署的工件。
  • 将新版本的软件部署到非活动(绿色)环境。这涉及到环境的设置,部署工件,以及配置任何必要的设置。
  • 在新版本软件部署到绿色环境后,运行自动化测试以确保新版本运行正常。 这包括功能测试、回归测试、集成测试,如果条件允许,还包括性能测试。
  • 将流量从活动(蓝色)环境切换到非活动(绿色)环境。这需要更新负载均衡器或DNS设置,以便将流量引导至绿色环境。 理想情况下,这个过程应该由自动化流程完成。
  • 在切换完成后,监控应用程序,以确保其正常运行。 这包括监控错误、性能问题和其他异常情况。
  • 这是一个可选步骤,你可能并不希望频繁地执行它。但是,如果检测到任何重大问题,则应立即将流量切换回蓝色环境以执行回滚操作。 同样,这种回滚对生产用户是无缝的,不会造成停机或中断。只需要更新负载均衡器或 DNS 设置即可将流量引导至蓝色环境。
  • 在问题得到解决并且新版本准备好再次部署时,将流量切换回绿色环境。 重申一次,这需要更新负载均衡器或 DNS 设置,将流量重新导向绿色环境。
  • 最后,一旦新版本的软件稳定运行,就可以停用在蓝色环境中运行的旧版本软件。 你将需要此环境来构建系统的下一个新版本。

实施 CI/CD 管道

将蓝绿部署整合到 DevOps CI/CD 管道中应该是一个自然而然的过程。

一个重要的前提条件是,你已经拥有两个相同的环境。由于这应该是一个自动化过程,你可以使用诸如 AWS CloudFormation 甚至是云无关的 Terraform 等基础设施即代码工具,在自动化管道中创建、重新创建和更新环境的脚本。

一旦做到了这一点,创建完全自动化的部署流程就相对简单了。 你可以重用现有的管道来创建蓝色和绿色环境。 但同时,你还需要在管道中包含测试流程。

可以使用诸如 AWS Elastic Load BalancerNGINX 等工具来自动化流量切换过程。 这涉及到更新负载均衡器或 DNS 设置,以便在新版本的软件经过测试并准备就绪后,将流量引导至绿色环境。

下一个难题是监控。为此,可以使用诸如 AWS CloudWatchNew RelicDatadog 等工具。

最后,可以重用现有的管道,甚至可以废弃旧的蓝色环境。 你可以决定是首先销毁所有服务和组件,然后再从头开始重建它们,还是只更新链中每个服务的脚本。 通常,销毁并重新创建是一个更安全的选择,因为随着更新,你可能需要考虑更多的特殊情况。

蓝绿部署的最佳实践

想知道如何充分利用蓝绿部署的优势吗? 这里有一些从实践中总结出的技巧:

制定可靠的数据库迁移策略

在部署新版本的软件时,确保正确更新数据库架构至关重要。可以使用诸如 FlywayLiquibase 等数据库迁移工具来管理数据库模式的更改。

使用金丝雀分析工具

尽管金丝雀部署是另一种方法,你仍然可以借鉴它的一些技术来优化蓝绿部署。

可以使用诸如 KayentaSpinnaker 等金丝雀分析工具来分析新版本的软件在真实环境中的表现。这包括将新版本软件的性能与旧版本进行比较。

使用诸如 Togglz 等功能切换框架来启用或禁用新版本软件中的功能。这样可以逐步推出新功能,并在必要时快速回滚。

使用具有运行状况检查的负载均衡器

使用诸如 AWS Elastic Load Balancer 或 NGINX 等负载均衡器,并配置运行状况检查,以确保流量仅被路由到运行正常的实例。这保证了应用程序的高可用性,并最大限度地减少停机时间。

制定带有自动回滚功能的回滚计划

制定一个回滚计划来应对可能出现的问题,并使用诸如 AWS CodeDeploy 或 Octopus Deploy 等工具来自动化回滚过程。 这确保了最大限度地减少停机时间,并确保应用程序保持高可用性。

当发现新版本存在严重问题时,这主要用于绿色环境的回滚。

你无需为蓝色环境制定回滚计划,因为该环境不会受到切换的影响,并且你可以根据需要立即恢复到这个稳定的环境。

蓝绿部署的挑战

实施蓝绿部署可能会给开发团队带来一些挑战。以下是一些常见的挑战:

  • 设置和管理两个相同的环境可能既复杂又耗时。 这需要具备诸如 Terraform 或 CloudFormation 等基础设施即代码工具的专业知识。你需要拥有一支能够应对此类技术挑战的高级开发团队。
  • 在部署新版本的软件时,确保正确更新数据库架构非常重要。这可能具有挑战性,尤其是当数据库模式很复杂时。你需要可靠的数据库部署流程,来自动化并可靠地处理模式更新。
  • 在真实环境中分析新版本软件的性能可能具有挑战性。 这需要具备诸如 Kayenta 或 Spinnaker 等金丝雀分析工具的专业知识。
  • 实现功能切换可能具有挑战性,特别是当应用程序具有大量功能时。 这需要在开发团队之间进行仔细的规划和协调。
  • 在真实环境中测试新版本的软件可能具有挑战性,尤其是当应用程序具有大量用户或服务器时。你需要尽可能使测试用例自动化。此外,你的日常流程最终将包括开发和测试团队之间的大量协调。
  • 拥有良好的监控解决方案并不容易,但对于正确的 DevOps 操作来说是至关重要的。 只要可行,就投入时间使用经过验证的服务 (AWS CloudWatch、New Relic、Datadog) 来构建此解决方案。

蓝绿部署和金丝雀部署的区别

虽然与传统的部署过程的差异非常明显(传统部署过程中不存在运行不同软件版本的两个并行环境),但与金丝雀部署的差异可能更有趣。

蓝绿部署意味着存在两种环境(蓝色和绿色)。 然而,与此同时,这两个环境在数据方面始终保持同步。 一旦新版本经过测试并被认为准备就绪,流量就会从活动环境切换到非活动环境,使其成为新的活动环境。 你无需花费任何时间来部署新代码,并且不会涉及生产停机时间。 所有生产用户始终在当前活动环境中工作,他们甚至不会注意到切换。

金丝雀部署涉及将软件的新版本部署给一小部分用户,而大多数用户或服务器继续使用当前版本。这是一种渐进式的部署,而不是全面的切换。 在这种情况下,测试人员是直接生产用户,即使只是他们中定义的一个子集。 该小组正在积极测试新版本的生产流程,当最终稳定后,新版本将传播给其他用户。

那么哪一个更好呢?

一个咨询顾问的经典回答“视情况而定”最适合这里,尽管听起来可能有点敷衍。

如果你的系统的首要目标是高可用性,那么蓝绿部署将是你的首选。

如果你强烈倾向于更快的反馈和更可控(尽管更慢)的新系统版本推出,那么金丝雀部署相比蓝绿部署则更具优势。

重要的是,它们都足够敏捷,足以被认为是严肃的 DevOps 系统创建的有效方法。

案例研究

Netflix 使用蓝绿部署来部署其流媒体服务的新版本。通过使用蓝绿部署,Netflix 可以在不影响用户体验的情况下部署其服务的新版本。 事实上,Netflix 还在其他情况下并行使用金丝雀部署,因此在同一框架下结合使用不同的 DevOps 部署方法并非不现实。

此外,Amazon 和 Etsy 也使用蓝绿部署来部署其电子商务平台的新版本。

另一个案例是 LinkedIn,它使用蓝绿部署来部署其社交网络平台的新版本。

最后但并非最不重要的一点是,IBM 使用蓝绿部署来部署其云平台的新版本。

这些公司已成功地在其平台基础设施中实施了蓝绿部署,并为其他公司树立了良好的榜样。

最后的话

与金丝雀一样,蓝绿部署旨在对现有的敏捷流程和方法进行最佳优化,以一种无缝的方式交付新软件,让用户浑然不觉。 这就是此类方法的最终目标。 你不断地、频繁地交付新软件,但却不会引起用户的注意,最终,用户也不关心这些细节。

对于开发团队来说,公司里没有人议论他们最新的版本,这可能会让他们感到有点沮丧。 但是,如果你问我,这正是你能提供的最好的服务。 没人谈论它,但每个人都在每天使用它。

下一步,可以查看常见的 DevOps 面试问题和答案。