我和我的同事向我们的客户提出的目标之一是完全自动化的部署过程。自动化部署有助于减少在“完成”软件和实现其价值之间出现的摩擦和延迟。它建立在许多通常与持续集成相关的想法之上,更多地推动了这种将软件快速投入生产并让它发挥作用的能力。他们关于蓝绿部署的部分作为未充分使用的技术之一引起了我的注意,所以我想在这里简要概述一下。
自动化部署的挑战之一是切换本身,将软件从测试的最后阶段带到现场生产。您通常需要快速执行此操作以最大程度地减少停机时间。蓝绿部署方法通过确保您拥有两个尽可能相同的生产环境来做到这一点。在任何时候,其中一个,例如蓝色,是实时的。当您准备软件的新版本时,您将在绿色环境中进行最后阶段的测试。一旦软件在绿色环境中运行,您切换路由器,以便所有传入请求都进入绿色环境 - 蓝色的现在空闲。
蓝绿部署还为您提供了一种快速回滚的方法——如果出现任何问题,您可以将路由器切换回您的蓝色环境。在绿色环境运行时仍然存在处理丢失事务的问题,但根据您的设计,您可以将事务提供给两个环境,以便在绿色环境运行时保持蓝色环境作为备份。或者,您可以在切换前将应用程序置于只读模式,在只读模式下运行一段时间,然后将其切换到读写模式。这可能足以解决许多悬而未决的问题。
这两个环境需要不同但尽可能相同。在某些情况下,它们可以是不同的硬件,或者它们可以是在相同(或不同)硬件上运行的不同虚拟机。它们也可以是一个单独的操作环境,被划分为不同的区域,两个切片具有不同的 IP 地址。
将绿色环境投入使用并对其稳定性感到满意后,您就可以将蓝色环境用作暂存环境,以进行下一次部署的最后测试步骤。当您准备好下一个版本时,您可以从绿色切换到蓝色,就像之前从蓝色切换到绿色一样。这样,绿色和蓝色环境都会定期在实时、上一个版本(用于回滚)和暂存下一个版本之间循环。
这种方法的一个优点是它与使热备份工作所需的基本机制相同。因此,这允许您在每个版本上测试您的灾难恢复过程。(我希望你发布的频率比你有灾难的频率高。)
基本思想是有两个易于切换的环境来切换,有很多方法可以改变细节。一个项目通过弹跳 Web 服务器而不是在路由器上工作来完成切换。另一种变化是使用相同的数据库,为 web 和域层制作蓝绿色开关。
使用这种技术,数据库通常是一个挑战,尤其是当您需要更改架构以支持新版本的软件时。诀窍是将架构更改的部署与应用程序升级分开。因此,首先应用数据库重构来更改架构以支持新版本和旧版本的应用程序,部署它,检查一切是否正常,以便有一个回滚点,然后部署新版本的应用程序。(当升级完成后,删除旧版本的数据库支持。)