蓝绿部署及其在DevOps中的作用解释
传统的“大爆炸”软件开发方法与今天的云计算和devops软件平台的高灵活性、敏捷性和持续部署要求不兼容。
仅仅准备一个手动步骤清单以在生产发布部署期间执行是不够的。如果这样做,你并不真正敏捷,也不是一个合适的devops。
蓝绿部署:概述
蓝绿部署是一种软件部署方法,通过创建两个相同环境(活动(蓝色)和非活动(绿色))来减少新软件版本的停机时间和风险。
活动环境是当前软件版本运行的地方,用户正在生成生产流量。非活动环境是部署和测试新软件版本的地方。
一旦新版本经过测试并准备就绪,将流量从活动环境切换到非活动环境,使其成为新的活动环境。您可以根据需要重复此过程。
devops环境
蓝绿部署与devops的思维方式和流程非常契合,因为它支持软件的持续交付和部署,同时最大限度地减少生产用户的停机时间,并消除生产发布失败的风险。
拥有两个相同的环境使得可以在不影响当前生产环境的情况下测试和部署新版本的软件。这意味着更快速、更频繁的发布,这是devops的一个关键方面。
此外,快速切换流量的能力是在出现问题时迅速回滚的主要前提条件,这在devops环境中也很重要。
蓝绿部署的关键原则
#1. 两个相同的环境
蓝绿部署需要创建两个相同的环境。这意味着从数据和流程角度来看是相同的。其中一个是活动的(蓝色),另一个是非活动的(绿色)。
蓝色环境是生产用户运行日常流程的地方。绿色环境始终与蓝色环境保持同步,但测试人员在那里运行他们的测试用例。尽管此环境不是生产环境,但您可以在类似生产环境的条件下运行测试。
#2. 切换流量
一旦新版本经过测试并准备就绪,将流量从活动环境切换到非活动环境,使其成为新的活动环境。
切换是瞬时的。所有部署现在都是过去的事情。没有停机窗口。用户不需要做任何操作即可访问新环境。他们会自动重定向,同时全部用户。
#3. 快速回滚
快速在不同环境之间切换流量的能力也意味着在出现问题时可以快速回滚。这确保了最小的停机时间,应用程序始终可用。
如果绿色环境出现任何问题,所有用户将立即切换回稳定的原始蓝色环境,没有任何困扰。
#4. 自动化测试
自动化测试是blue-green部署的关键方面。它确保在部署到活动环境之前对软件的新版本进行了彻底测试。
如果您的系统中没有大量测试自动化(包括单元测试、功能测试和至少回归测试),那么考虑实施blue-green部署可能没有太多意义。
缺乏自动化测试将大大减慢您的速度。测试新(绿色)环境所需的时间将如此之长,以至于在您能够切换到绿色环境时,它在软件开发生命周期的角度上已经“太旧”了。
#5. 持续交付
blue-green部署是持续交付流程的一部分,这意味着软件更快、更频繁地发布到生产环境。
只要您准备好在绿色环境上测试新软件版本,您就可以立即切换。由于部署已经完成,您只需要执行流量切换本身,所以速度非常快,您可以每天进行此操作。前提是您在测试活动中也很迅速,显然。
典型的生命周期
运行blue-green部署的平台具有自己特定的步骤和流程的生命周期。通常包括以下内容:
- 构建软件的新版本。这包括编译代码,运行自动化测试,并创建可部署的构件。
- 下一阶段是将软件的新版本部署到非活动(绿色)环境。这包括设置环境,部署构件,并配置任何必要的设置。
- 一旦软件的新版本部署到绿色环境中,运行自动化测试以确保新版本的功能正常。包括功能测试,回归测试,集成测试,如果您非常出色,甚至还会包括性能测试。
- 切换流量从活动(蓝色)环境到非活动(绿色)环境。这包括更新负载均衡器或dns设置以将流量引导到绿色环境。当然,您希望通过自动化流程完成此操作。
- 完成切换后,监控应用程序以确保其正常运行。这包括监控错误,性能问题和其他问题。
- 此步骤是可选的,并且您不希望经常达到此步骤。但是,如果有人发现任何重大问题,请将流量切换回蓝色环境以进行即时回滚。同样,不会对生产用户产生任何停机时间或断开连接。只需更新负载均衡器或dns设置以将流量引导到蓝色环境。
- 解决这些问题后,当您准备再次切换到新版本时,请将流量切换回绿色环境。所以再次更新负载均衡器或dns设置以将流量重新引导到绿色环境。
- 最后,一旦软件的新版本稳定并且功能正常,请停用在蓝色环境中运行的旧版本软件。您将需要它来构建另一个新版本的系统。
实施ci/cd流水线
将蓝绿部署实施到devops ci/cd流水线中应该是一个自然的过程。
一个强制性的先决条件是您已经准备好了这两个相同的环境。由于这将是一个自动化的过程,您可以使用基础设施即代码工具(如aws cloudformation)或者甚至是与云无关的terraform脚本在自动化流水线中为您创建/重建/更新环境。
一旦您有了这个,创建一个完全自动化的部署流程就相对容易了。您只需重用已经存在的蓝色和绿色环境创建的流水线。然而,这次您还需要在流水线中包含测试过程。
您可以使用aws elastic load balancer或nginx等工具自动化流量切换过程。这涉及更新负载均衡器或dns设置,以在新版本的软件经过测试并准备好后将流量引导到绿色环境。
拼图的下一个部分是监控。为此,使用诸如aws cloudwatch、new relic或datadog等工具。
最后,即使对旧的蓝色环境进行退役,也可以重复使用现有的流水线。您可以选择在从头开始重新创建之前先对所有服务和组件执行销毁操作,或者您可以只更新链中每个服务的脚本。通常,销毁和重新创建是更安全的选择,因为在更新时,您需要考虑更多的特殊情况。
blue-green 部署的最佳实践
想知道如何最好地使用 blue-green 部署吗?以下是一些来自实践的建议。
拥有稳定的数据库迁移策略
在部署软件的新版本时,确保数据库模式正确更新非常重要。使用类似于 flyway 或 liquibase 的数据库迁移策略来管理数据库模式的更改。
使用金丝雀分析工具
即使 金丝雀部署 是一种替代方法,您仍然可以使用其一些技术来完善您的 blue-green 部署。
使用诸如 kayenta 或 spinnaker 的金丝雀分析工具来分析新软件版本在真实环境中的性能。这涉及将新软件版本的性能与旧软件版本的性能进行比较。
使用诸如 togglz 的功能切换框架来在新软件版本中启用或禁用功能。这允许逐步推出新功能,并在需要时快速回滚。
使用带有健康检查的负载均衡器
使用诸如 aws 弹性负载均衡器或 nginx 的负载均衡器,并进行健康检查,以确保流量仅定向到正常运行的实例。这确保应用程序保持高度可用,并将停机时间最小化。
使用具备自动回滚功能的回滚计划
在出现问题时,制定一个回滚计划,并使用诸如 aws codedeploy 或 octopus deploy 的工具自动执行回滚过程。这确保停机时间最小化,并保持应用程序的高可用性。
这主要适用于绿色环境,当您发现新版本存在一些重大问题时。
蓝色环境不需要回滚计划,因为它在切换中保持不变,您可以随时返回到这个稳定的环境。
blue-green 部署的挑战
对于开发团队来说,实施 blue-green 部署可能存在一些挑战。以下是一些典型的挑战:
- 搭建和管理两个相同的环境可能会很复杂和耗时。这需要熟悉基础设施即代码工具(如terraform或cloudformation)的专业知识。您需要有一个资深的开发团队,能够应对这些技术挑战。
- 在部署新版本的软件时,确保数据库模式得到正确更新非常重要。这可能是具有挑战性的,特别是当数据库模式很复杂时。您需要建立可自动和可靠处理模式更新活动的数据库部署流程。
- 在实际环境中分析新版本软件的性能可能具有挑战性。这需要熟悉金丝雀分析工具(如kayenta或spinnaker)的专业知识。
- 实施功能切换可能具有挑战性,特别是如果应用程序具有大量的功能。这需要仔细的规划和协调开发团队之间的工作。
- 在实际环境中测试新版本的软件可能具有挑战性,特别是如果应用程序具有大量的用户或服务器。您需要尽可能自动化测试用例。此外,您的常规流程将包含大量开发和测试团队之间的协调。
- 拥有良好的监控解决方案对于正常的devops操作来说是非常重要的,但这是非常罕见的现实。尽快投资时间来构建经过验证的服务(如aws cloudwatch,new relic,datadog)。
蓝绿部署和金丝雀部署的区别
与传统的部署流程相比,与蓝绿部署的区别非常明显(传统的部署流程中没有运行具有不同软件版本的两个并行环境)。与金丝雀部署相比,与传统部署的区别可能更有趣。
蓝绿部署意味着两个环境(蓝色和绿色)。但同时,两个环境在数据方面始终保持同步。一旦新版本经过测试并被认为准备就绪,将流量从活动环境切换到非活动环境,使其成为新的活动环境。您不需要花时间部署新代码,也没有生产停机时间。所有生产用户始终在当前活动环境上工作,他们甚至不会注意到切换。
金丝雀部署涉及将软件的新版本部署到少部分用户,而大多数用户或服务器继续使用当前版本。这是逐步部署而不是完全切换。在这种情况下,测试人员是直接的生产用户,尽管只有其中的一部分。该组正在积极测试新版本,使用生产流程;最终稳定后,新版本将传播到其他用户。
那么哪种更好?
顾问的回答“这取决于”最合适,虽然听起来有点模棱两可。
如果您的系统优先考虑高可用性,那么蓝绿部署将是您的选择。
如果您更希望更快的反馈和更受控(尽管较慢)的新系统版本推出,则金丝雀部署比蓝绿部署具有优势。
重要的是,两者都足够灵活,可以认为它们都足够适合创建严肃的devops系统。
案例研究
netflix使用蓝绿部署来部署其流媒体服务的新版本。通过使用蓝绿部署,netflix可以在不影响用户体验的情况下部署新版本的服务。事实上,netflix还在其他情况下并行使用金丝雀部署,因此将不同的devops部署方法结合在一起并不是不现实的。
此外,亚马逊和etsy也使用蓝绿部署来部署其电子商务平台的新版本。
另一个案例是linkedin,它使用蓝绿部署来部署其社交网络平台的新版本。
最后,ibm使用蓝绿部署来部署其云平台的新版本。
这些公司已成功将蓝绿部署应用于其平台基础架构,并为其他公司树立了良好的榜样。
最后的话
与金丝雀一样,蓝绿部署致力于对已有的敏捷流程和方法进行最佳优化,以平稳地交付新软件,以至于没有人会注意到它。这是这些方法的最终目标。你不断地、非常频繁地交付,但没有人知道,没有人注意到,最后,没有人在意。
对于开发团队来说,他们的最新发布没有被公司传播可能有点令人沮丧。但如果你问我,这正是你可以提供的最好的服务。没有人谈论它,但每个人都每天使用它。
接下来,查看常见的devops面试问题和答案。