image.png
自动化部署的挑战之一是切换本身,将软件从测试的最后阶段转移到实际生产中。你通常需要快速的做这件事以减少停服带来的影响。蓝绿部署通过两套尽可能相同的生产环境来做到这个。在任何时候,有一套环境是服务于线上的,比如蓝。在另一套环境中做最后的发布测试,比如绿。一旦软件在绿测试通过,你通过切换路由器将请求路由到绿环境中,这样蓝就空闲了。
蓝绿部署也可以让你很快的回滚---如果有任何报错那么可以将路由器切换到蓝环境。当绿环境处于活动状态时,仍然存在处理错过事务的问题,但是根据您的设计,您可以将事务提供给两个环境,以便在绿环境处于活动状态时保持蓝环境作为备份。或者可以在切换前将应用置于只读模式,然后再切到读写模式。这可能足以解决许多突出的问题。
这两个环境需要不同但又尽可能相同。可以是不同的硬件,也可以是相同硬件上的不同虚拟机。它们也可以是一个单独的操作环境,被划分为不同的区域,这两个区域具有不同的IP地址。
一旦你上线绿环境,然后对它的稳定性感到满意,就可以将蓝环境当作下一次部署时最后的预演测试环境。当你准备好发布时,就可以从绿环境切换到蓝环境就像当时从蓝环境切换到绿环境一样。这样蓝和绿就交替成为线上的生产环境和发布测试环境。
基本思想是有两个容易切换的环境来切换,有很多方法可以改变细节:其中一个项目通过上下服务器而不是在路由器上工作来实现切换,另一种变体是使用相同的数据库,为web和域层制作蓝绿色的开关。
在这个技术中,数据库也是一个挑战,特别是你需要在下一个版本中改变表结构定义。有一种方法就是将数据库升级和应用升级分开。先应用database refactoring让数据库支持新旧两个版本,然后部署新版本的应用。