在深入探讨各种部署策略之前,让我们先对本文讨论的每种策略进行简要概述:
一次性部署(All-at-once Deployment):该策略一次性更新所有目标环境,是速度最快的方法,但同样伴随着最高的风险。就地部署(In-place Deployment):此方法涉及停止当前运行的应用程序,然后直接用新版本替换,这会直接影响到服务的可用性。蓝/绿部署(Blue/Green Deployment):这是一种零停机时间的部署方法,通过同时运行两个相同的生产环境,并在它们之间进行切换,实现无缝过渡。金丝雀部署(Canary Deployment):在全面推出之前,该策略先将新变更以小规模方式引入给一小部分用户,以测试其稳定性和性能。影子部署(Shadow Deployment):通过将实时流量复制到一个影子环境,可以在不影响生产环境的情况下,对新部署进行测试。2 一次性部署一次性部署策略,亦称为“Big Bang”部署,指的是将应用程序的新版本同时推送到所有服务器或环境中。这种方法因其简单直接而易于实施,无需复杂的编排或额外的基础设施支持。一次性部署的主要优势在于其简洁性,能够迅速将所有用户升级至应用的新版本。

然而,此方法也伴随着显著的风险。由于所有实例同步更新,新版本中的任何缺陷都可能立即影响所有用户,不存在逐步推出更新或通过小范围用户测试来降低风险的机会。此外,一旦发生问题,回滚过程可能同样具有破坏性。
尽管存在这些风险,一次性部署在某些情况下仍是合适的选择。例如,在小型应用或对停机时间容忍度较高的环境中,或者在潜在问题影响较小且应用在发布前已经过全面测试以确保兼容性和稳定性的情况下。
3 就地(重新创建)部署就地部署策略,也称为重新创建部署,是在开发项目中常用的另一种策略。它以简单著称,无需额外的基础设施投入。
该策略的核心在于,在部署新版本时,会先停止当前运行的应用程序,随后用新代码启动它。这种方法的主要缺点是,服务将不可避免地经历停机,这将直接影响到用户。
此外,如果新软件更新存在问题,可能需要执行回滚操作,这同样会导致服务的进一步中断。
为了避免这种停机风险,并允许在部署过程中无中断地回滚更改,业界已经开发并采用了一些更为先进的部署策略。
4 蓝/绿部署
接下来,我们将探讨蓝/绿部署策略,这是一种旨在将新软件版本部署时的停机时间和风险降至最低的零停机部署方法。该策略通过维护两个完全相同的服务环境来实现:一个环境(蓝色环境)运行着当前为用户请求提供服务的原始应用程序,而另一个环境(绿色环境)则用于部署新的软件更改。这种方法允许我们在不影响用户和服务的情况下,对新更改进行验证和测试,几乎不会引发停机时间,并且可以在遇到问题时安全地进行回滚。
蓝/绿部署的典型流程是:在绿色环境中对新更改进行验证和测试后,我们将用户流量从蓝色环境重新导向至更新过的绿色环境。
听起来似乎很简单明了,对吧?
嗯,实际上,这取决于具体情况。
挑战在于,只有在服务无状态的情况下,我们才能轻松地在两个环境之间重新路由流量。如果服务与任何数据源交互,情况就会变得复杂。例如,虽然在两个环境之间共享无状态的数据源(如NoSQL数据库或对象存储服务,例如AWS S3)相对容易实现,但关系数据库则不然,因为它需要额外的工作来支持蓝/绿部署。NoSQL数据库在某些情况下也可能需要额外的配置。
如果服务不是无状态的,并且使用了具有固定架构的数据源,那么实施蓝/绿部署策略可能并不总是最佳选择。这是因为它可能会引入额外的风险和故障点,从而削弱蓝/绿部署策略的优势。然而,如果您决定需要采用蓝/绿部署策略,并且您的基础设施运行在Amazon Web Services(AWS)上,您可能会发现AWS提供的关于如何实施蓝/绿部署及其所需基础设施的指南非常有用。
对于在不停机的情况下处理架构更新的详细方法,本文不进行讨论。但如果您对如何在不停机的情况下更新数据库架构感兴趣,可以参考相关文章以获取更多信息。此外,如果您有任何关于在不停机的情况下更新架构的有趣资源,欢迎在评论中分享。
5 金丝雀部署
金丝雀部署策略的核心思想是通过逐步向用户推出新更改,从而降低在生产环境中部署新软件版本的风险。
与蓝/绿部署策略类似,我们将新的软件版本部署到相同的生产环境中。然而,不同于完全切换流量,我们使用负载均衡器将一部分用户流量导向到更新了新软件版本的环境。决定哪些用户获得新软件版本的比例和标准,通常因公司或项目而异。有些公司可能首先对内部员工进行新更改的测试,有些可能随机选择用户,而有些则可能采用算法根据特定标准来选择用户。您可以根据项目的具体需求选择最合适的方法。
6 影子部署
影子部署策略是我个人特别感兴趣的一种策略。它同样采用了与蓝/绿部署和金丝雀部署相同的环境概念。主要的区别在于,我们不是简单地重定向全部或部分真实用户流量,而是将全部流量复制到部署了新更改的第二个环境。这样,我们可以在不影响用户体验的情况下,测试和验证我们的更改,从而降低因软件更新而导致服务中断或出现性能瓶颈的风险。
7 五种部署策略的比较下面的比较表提供了每种部署策略的简要描述、主要优点、可能的缺点以及它们通常适用的场景。在选择部署策略时,需要根据项目的具体需求和限制来决定最合适的方法。
部署策略
描述
优点
缺点
适用场景
一次性部署
同时更新所有目标环境
简单快速
风险高,可能导致广泛影响
小型应用,停机时间可接受
就地部署
停止当前应用,直接用新版本替换
操作简单
影响可用性,回滚可能复杂
快速迭代,简单应用
蓝/绿部署
运行两个相同环境,切换以部署新版本
零停机时间
资源密集
需要高可用性的场景
金丝雀部署
逐步向一部分用户推出新版本
降低风险
需要复杂流量管理
用户群体较大,需要逐步验证
影子部署
复制全部流量到新环境测试
无用户影响
资源消耗大
对稳定性和性能要求高
8 结论在本文中,我们探讨了五种不同的部署策略,每一种都具有其独特的优势和挑战。一次性部署和就地部署策略以其快速部署新版本软件和所需的最小工作量而受到青睐。尽管在许多情况下,这些策略可能是首选,但了解更复杂且资源密集型的策略同样重要。
最终,实施任何部署策略都需要我们仔细权衡对系统及其用户可能产生的影响。选择部署策略时,应充分考虑项目的具体需求、风险承受能力以及运营的实际情况,确保所选策略与这些因素相匹配。