蓝绿部署
2010年3月1日
我和我的同事们敦促客户实现的目标之一是完全自动化的部署流程。自动化部署有助于减少从软件“完成”到实现其价值之间出现的摩擦和延迟。Dave Farley 和 Jez Humble 正在完成一本关于这个主题的书 - 持续交付。它建立在许多与 持续集成 相关的理念之上,更加注重快速将软件投入生产并使其发挥作用的能力。他们关于蓝绿部署的部分引起了我的注意,我认为这是一种未被充分利用的技术,所以我想在这里做一个简要的概述。
自动化部署的挑战之一是切换本身,即将软件从测试的最后阶段转移到实时生产环境。您通常需要快速完成此操作以最大程度地减少停机时间。蓝绿部署方法通过确保您拥有两个尽可能相同的生产环境来做到这一点。在任何时候,其中一个环境(例如,以蓝色为例)都是活动的。当您准备新版本的软件时,您将在绿色环境中进行最后阶段的测试。一旦软件在绿色环境中正常工作,您就可以切换路由器,以便所有传入请求都转到绿色环境 - 蓝色环境现在处于空闲状态。
蓝绿部署还为您提供了一种快速回滚的方法 - 如果出现任何问题,您可以将路由器切换回蓝色环境。在绿色环境处于活动状态时,仍然存在处理丢失事务的问题,但根据您的设计,您可以以将事务同时馈送到两个环境的方式,以便在绿色环境处于活动状态时将蓝色环境作为备份。或者,您可以在切换之前将应用程序置于只读模式,以只读模式运行一段时间,然后将其切换到读写模式。这可能足以解决许多未解决的问题。
这两个环境需要不同,但要尽可能相同。在某些情况下,它们可以是不同的硬件,也可以是在相同(或不同)硬件上运行的不同虚拟机。它们也可以是单个操作系统环境,划分为具有不同 IP 地址的两个独立区域。
将绿色环境上线并对其稳定性感到满意后,您就可以将蓝色环境用作下一个部署的最终测试阶段的暂存环境。当您准备好发布下一个版本时,您可以像之前从蓝色切换到绿色一样从绿色切换到蓝色。这样,绿色和蓝色环境就会定期在活动环境、先前版本(用于回滚)和下一个版本的暂存环境之间循环。
这种方法的优点是,它与您使热备用工作所需的机制相同。因此,这使您可以在每次发布时测试您的灾难恢复程序。(我希望您发布的频率高于发生灾难的频率。)
基本思想是拥有两个易于切换的环境,可以在细节上进行多种变化。一个项目通过弹跳 Web 服务器而不是在路由器上工作来进行切换。另一种变化是使用相同的数据库,使蓝绿切换用于 Web 和域层。
数据库通常是这种技术的一个挑战,尤其是当您需要更改架构以支持新版本的软件时。诀窍是将架构更改的部署与应用程序升级分开。因此,首先应用 数据库重构 来更改架构以支持应用程序的新旧版本,部署它,检查一切是否正常工作,以便您有一个回滚点,然后部署新版本的应用程序。(当升级完成后,删除对旧版本的数据库支持。)
这种技术已经“存在”很长时间了,但我没有看到它像应有的那样经常被使用。 Daniel Terhorst-North 和 Jez Humble 的一些模糊组合 想出了这个名字。
致谢
插图由 Ketan Padegaonkar 提供更新
2015-06-05:该页面今天获得了更多的页面流量,因为 Hacker News 注意到了它。所以我添加了关于数据库更改和进一步阅读部分的段落。