一、介绍
为了避免版本发布带来的各种故障以及回退问题,本文总结了几种常见的服务发布策略来解决版本升级过程中带来的问题
二、蓝绿发布
蓝绿发布需要对服务的新版本进行冗余部署,一般新版本的机器规格和数量与旧版本保持一致,相当于该服务有两套完全相同的部署环境,只不过此时只有旧版本在对外提供服务,新版本作为热备。当服务进行版本升级时,我们只需将流量全部切换到新版本即可,旧版本作为热备。由于冗余部署的缘故,所以不必担心新版本的资源不够。如果新版本上线后出现严重的程序 BUG,那么我们只需将流量全部切回至旧版本,大大缩短故障恢复的时间。待新版本完成 BUG 修复并重新部署之后,再将旧版本的流量切换到新版本。
如图,某服务旧版本为 v1,对新版本 v2 进行冗余部署。版本升级时,将现有流量全部切换为新版本 v2。
当新版本 v2 存在程序 BUG 或者发生故障时,可以快速切回旧版本 v1。
蓝绿部署的优点:
1、部署结构简单,运维方便;
2、服务升级过程操作简单,周期短。
蓝绿部署的缺点:
1、资源冗余,需要部署两套生产环境;
2、新版本故障影响范围大。
三、金丝雀发布
金丝雀发布也叫灰度发布。
金丝雀发布的思想则是将少量的请求引流到新版本上,因此部署新版本服务只需极小数的机器。验证新版本符合预期后,逐步调整流量权重比例,使得流量慢慢从老版本迁移至新版本,期间可以根据设置的流量比例,对新版本服务进行扩容,同时对老版本服务进行缩容,使得底层资源得到最大化利用。
如图,某服务当前版本为 v1,现在新版本 v2 要上线。为确保流量在服务升级过程中平稳无损,采用金丝雀发布方案,逐步将流量从老版本迁移至新版本。
金丝雀发布的优点:
1、按比例将流量无差别地导向新版本,新版本故障影响范围小;
2、发布期间逐步对新版本扩容,同时对老版本缩容,资源利用率高。
金丝雀发布的缺点:
1、流量无差别地导向新版本,可能会影响重要用户的体验;
2、发布周期长。
四、流量隔离环境发布
一般我们发布的单位都是应用,但是一个功能模块往往是由多个应用组合在一起提供的服务(如微服务),即使当前发布的应用出现了异常,这个异常也未必体现在当前应用中,在复杂的情况下,异常会延迟到它的下游应用才体现出来,如何发现此类问题并且不影响用户体验是非常重要的。此外,我们有时候还希望新版本的代码上线以后,只影响到一小部分用户。而传统的灰度发布,因为无法识别业务流量,所以即使某个应用只有一台机器出现了问题,也可能会影响到所有的用户。
如下图左侧的灰度发布,App1 的所有机器都有一定概率会路由到出现问题的红色 App2 机器上。而右侧的隔离环境发布中,新版本的代码会先发布在全链路隔离环境中,即使发布中出现问题,也只会影响少量用户。
优点:
-
能够发现一些复杂的, 涉及到多应用的问题
-
出现故障时, 只会影响很小一部分用户
缺点:
-
需要对流量隔离环境进行独立监控
-
系统设计复杂, 需要中间件和链路上的所有应用能够识别业务流量
适用场景:
-
较为核心的生产业务场景