部署策略-蓝绿部署

什么是蓝绿部署?

蓝绿部署是一种发布管理技术,可降低风险并最大程度地减少停机时间。它使用称为蓝色和绿色的两种生产环境来提供可靠的测试、持续的无中断升级和即时回滚。

蓝绿部署的起源

故事开始于 2005 年左右,有两个开发人员和一个问题。他们正在开发的电子商务网站出现了许多意外错误。这些开发人员一丝不苟,并有一个很好的测试套件,但由于某种原因,错误在雷达下飞来飞去并进入了生产阶段。整个情况给他们的客户带来了很多麻烦。

经过更深入的检查,他们找到了原因。他们注意到生产和测试机器之间存在太多差异。他们的测试在测试环境中通过了,但在生产中部署时代码失败了。

这些开发人员Daniel North 和 Jez Humble然后有了一个非常规但绝妙的主意。他们将直接在生产中进行部署和测试。

现在我知道你在想什么了。生产中的测试不是一个很大的禁忌吗?通常,是的。但是你看,这里的关键是他们没有覆盖旧网站。相反,他们在同一个物理盒子中并排运行新的,因此用户不知道正在进行的部署。旧站点继续照常工作,而 Dan 和 Jez 则负责发布。

部署是这样工作的。他们将包含最新版本的文件夹复制到生产机器中。然后他们使用单独的域启动了该网站,并在那里对其进行了冒烟测试。一旦他们感到高兴,他们就会将 Apache Web 服务器指向新文件夹,收工,大概喝一杯啤酒。如果出现任何问题,他们可以将 Web 服务器指向旧文件夹,修复错误,然后重试。这种策略极大地改进了错误检测,因为测试和生产环境现在是相同的。

蓝绿部署

此时,他们在同一台机器上有两个环境:一个用于旧版本,另一个用于新版本。最初,他们想用字母来称呼它们:环境 A环境 B等等。但有人指出,人们会倾向于相信 A 在某种程度上比 B 更好(可能听起来太像“计划 B”了)。他们最终决定使用没有自然顺序的颜色来代替。因此,他们计划了诸如bluegreenorange 之类的名称(他们避免使用红色,因为它暗示着危险)。最后,事实证明他们只需要两个环境。因此创造了蓝绿色这个词。

蓝绿部署如何运作?

除了我们稍后将探讨的一些注意事项外,蓝绿色几乎检查了理想部署过程的所有框:

  • 无缝:用户不应经历任何停机时间。
  • 安全:失败的可能性低。
  • 完全可逆:我们可以撤消更改而不会产生不利影响。

蓝绿方法的基础是并行部署。为此,我们需要两个独立但相同的环境。我指的是最通用的环境,包括服务器、虚拟机、容器、配置、数据库等。有时我们可以使用不同的盒子。其他时候,我们可以使用运行在同一硬件上的不同虚拟机。或者它们可以是在单个设备中运行的不同容器。

以最纯粹的形式,蓝绿要求我们复制我们的应用程序所依赖的每个资源。

Two independent production environments

然而,在实践中,运行所有内容的备用副本并不总是有意义的。例如,保持两个数据库同步尤其困难。出于这个原因,我们经常发现带有共享组件的蓝绿部署。

Two production environments with some shared components

我们还需要某种方式来切换两个环境之间的传入连接。我们将用一个路由器符号来表示它。它可以是一个真正的路由器、一个负载平衡器、一个反向代理,或者像在原始情况下一样,一个 Web 服务器。

The router switches traffic to one production environment at a time

蓝色和绿色轮流扮演生产角色。在任何给定时间,只有一种环境处于活动状态。例如,假设蓝色处于活动状态。在这种情况下,它接收所有流量——同时,green 充当一个临时区域,我们可以在那里部署和测试下一个版本。

Users continue accessing v1 on blue while the new v2 release is deployed on green

一旦我们确保以绿色运行的版本运行良好,我们将切换路线。然后循环再次开始。

Deployment is complete once users are switched to the new version running on green

云使蓝绿部署更可行

始终保持两组环境运行会变得昂贵。幸运的是,我们有许多工具可以让我们按需启动和拆除基础设施。我们可以使用基础设施即代码(IaC) 平台(如 Ansible 或 Terraform)启动和停止服务器。我们可以使用容器来简化发布,或者使用 Kubernetes 来编排部署。令人惊讶的是,当我们考虑到云提供的灵活性和成本降低时,每个人都可以实现蓝绿部署。

云将大部分基础设施抽象化。我们可以将部署描绘成一系列松散耦合的组件。

Blue production environment in the cloud

当需要发布新版本时,我们会在不接触实时环境的情况下创建新资源。在实践中,我们将使用像这样的CI/CD工具来创建相同的新组件并进行部署。

Green production environment is created on demand

然后我们立即重新路由所有用户连接。

User traffic is cut-over to the green production environment

一旦部署完成并且我们感到满意,我们就可以废弃旧环境。

Blue is removed to free up resources and reduce costs

Kubernetes 是一种让蓝绿变得非常简单的技术。

谁可以从蓝绿部署中受益?

当我们需要时,蓝绿色是一个很好的解决方案:

  • 正常运行时间:当我们无法关闭系统来更新它时。
  • 准确测试:当需要更可靠和准确的测试时。
  • 可靠性:当我们想要提高部署的可靠性时。

要使用蓝绿部署,我们需要做一些事情:

  • 自动化:我们需要持续交付管道(CI/CD Pipeline)来自动化配置、部署和测试过程。
  • 测试:我们需要详尽的测试。我们将依靠他们来决定何时可以部署版本。我们应该使用持续集成(continuous integration)来快速捕获错误并在上线之前测试新版本。
  • 隔离:我们需要两个相同且独立的环境。否则,一种环境可能会影响另一种环境。

每个人都可以做蓝绿部署吗?并非总是如此,某些情况可能会阻止我们使用该方法:

  • 无论在什么情况下,我们都无法进行持续更新。
  • 当法规限制必须如何更新软件时。例如,在航空航天、电信或医疗行业。
  • 当我们不能有两个相同的环境时。
  • 当我们无法隔离环境时。
  • 由于基础设施的原因,我们不能使用路由器、负载均衡器或反向代理。
  • 当我们有破坏性的数据库架构更改时。数据库更改需要向前和向后兼容。

蓝绿部署的优点

那么,蓝绿是适合您的部署策略吗?要回答这个问题,我们必须比较它的优缺点。

让我们从优点开始:

  • 测试奇偶校验:这是功能。测试对等意味着测试真正反映了生产的现实。这就是 Dan 和 Jez 在设计蓝绿色时所寻找的。通过在相同的硬件和软件上运行测试,他们使它们更有用和更有意义。
  • 随时部署:无停机意味着我们可以随时发布。无需等待维护时段。
  • 即时切换:用户即时或几乎切换到新版本。每个人都可以同时看到最新版本。
  • 即时回滚:切换是双向的。如果我们决定回到以前的版本,我们可以立即将所有用户切换回来。
  • 热备:蓝绿可以将我们从灾难场景中拯救出来。假设一个数据中心离线,导致现场环境瘫痪。没什么大不了的,我们会切换到另一个,直到问题得到解决。只要我们采取了不将蓝色和绿色放在同一个可用区上的预防措施,这就会起作用。
  • 事后分析:就地部署很难调试失败的版本。面临停机时,首要任务始终是恢复正常。收集调试数据是次要的,因此在回滚过程中可能会丢失很多有价值的信息。Blue-green 不会遇到这个问题——回滚总是让失败的部署完好无损以供分析。

蓝绿部署的缺点

在这一点上,您可能会认为蓝绿色一定有问题。否则,每个可能会使用它的人。那么,让我们检查一下缺点:

  • 冷启动:用户突然切换到新环境时可能会感到缓慢。此外,此时可能会出现任何未检测到的性能问题。热身作业和压力测试可以缓解这些问题。
  • 成本:与其他方法相比,蓝绿部署更昂贵。按需配置基础架构会有所帮助。但是当我们每天进行几次横向扩展部署时,成本可能会滚雪球。
  • 时间:设置蓝绿部署过程需要时间和精力。过程复杂,责任重大。在让它正常工作之前,我们可能需要进行多次迭代。
  • 数据库:数据库迁移更难,甚至到了成为表演者的地步。数据库模式更改必须向前和向后兼容。我们可能需要在新旧版本之间来回移动。当我们有两个数据库时,问题变得更加复杂,一个用于蓝色,一个用于绿色。保持数据同步是一种痛苦。解决此问题的常见策略包括使用复制或将一个数据库设为只读。
  • 用户交易:割接过程中,部分用户交易会中断。我们必须仔细考虑如何处理它们。我们应该如何处理半应用的交易?我们是否显示错误消息并告诉用户重试?或者我们是否尝试将它们转移到新环境中?一种可能的解决方案是同时并行地将所有事务提供给两个环境。在这种情况下,我们需要在部署完成后处理任何重复的数据。
  • 共享服务:数据库和其他共享服务可能会在蓝绿之间泄漏信息。这里需要谨慎,否则一种环境可能会间接影响另一种环境。这可能会破坏隔离规则并干扰部署。

如您所见,蓝绿与传统的就地部署相比具有许多优点,但它也有一些缺点。有些人不喜欢全有或全无的方法,更喜欢使用金丝雀部署,它结合了蓝绿部署和就地部署的元素,并提供更渐进的过渡。

参考:semaphoreci.com

你可能感兴趣的:(部署策略-蓝绿部署)