微服务下蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别

在有关微服务、DevOps、Cloud-native的迭代过程中,不可避免的需要“上线”,上线就需要部署,需要部署就意味着有修改,修改则意味着有风险。

目前有很多部署模式,本文的目的是对部署方案的总结。包括:蓝绿部署、A/B 测试、灰度发布、滚动发布、红黑部署等概念经常被提到的区别。

一、蓝绿部署(Blue/Green Deployment)

定义:蓝绿部署是不停老版本,部署新版本,然后进行测试,确认OK,将流量切到新版本,然后老版本同时也升级到新版本。

第一步:初始化状态,流量全部打到版本1中。

微服务下蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别 - 图1
第二步:发布版本2(发布的代码包含新功能和Bug修复等)
第三步:将流量从版本1切换到版本2。

微服务下蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别 - 图2
第四步:等到版本2测试正常,则删除版本1正在使用的资源(例如实例,数据库),从此正式用版本2。

4、蓝绿发布的注意事项

  • 当切换到蓝色环境时,需要妥当处理未完成的业务和新的业务。如果你的数据库后端无法处理,会是一个比较麻烦的问题;
  • 蓝绿部署在蓝绿阶段,需要平时服务器的数量的两倍,所有,如果基础设施层有更好的支持就更好了。
  • 如果应用之间有MQ,需要在业务架构层面做好兼容。
  • 蓝绿发布对于增量升级有比较好的支持,但是对于涉及数据表结构变更等等不可逆转的升级,并不完全合适用蓝绿发布来实现,需要结合一些业务的逻辑以及数据迁移与回滚的策略才可以完全满足需求。

过去的 10 年里,很多公司都在使用蓝绿部署(发布)来实现热部署,这种部署方式具有安全、可靠的特点。蓝绿部署虽然算不上“ Sliver Bullet”,但确实很实用。

不过蓝绿发布在大型的微服务系统已经很难在用了,主要是考虑到服务器成本,以及如果本次改动涉及到的中间件过多,数据迁移和回滚都很麻烦。如果丹丹做应用层面的蓝绿,写代码就需要考虑各种向前和向后的兼容。
BlueGreenDeployment中给出的一张图特别形象:
微服务下蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别 - 图3

二、A/B 测试(A/B Testing)
A/B测试跟蓝绿部署完全是两码事。A/B测试是用来测试应用功能表现的方法,例如可用性、受欢迎程度、可见性等等。A/B测试通常用在应用的前端上,不过当然需要后端来支持。
微服务下蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别 - 图4
A/B测试与蓝绿部署的区别在于,A/B测试目的在于通过科学的实验设计、采样样本代表性、流量分割与小流量测试等方式来获得具有代表性的实验结论,并确信该结论在推广到全部流量可信;蓝绿部署的目的是安全稳定地发布新版本应用,并在必要时回滚。
A/B测试和蓝绿部署可以同时使用。

三、灰度发布/金丝雀发布
定义:灰度发布是一种增量发布的类型,在原有版本可用的i情况下,采用一种平滑过渡的方式发布。例如:现在有一个应用有100台服务器,我们用一台将某一台的服务器更新到最新版本作为“金丝雀”,然后通过服务路由的方式,将流量切到“金丝雀”的服务中,最后让测试人员测试新版本的性能和表现,以保障整体系统稳定的情况下,尽早发现、调整问题。
如果测试没有问题,就一只只发布“金丝雀”,直到这100台的服务器都更新成最新版本。
金丝雀发布的来历:
注释:矿井中的金丝雀
17世纪,英国矿井工人发现,金丝雀对瓦斯这种气体十分敏感。空气中哪怕有极其微量的瓦斯,金丝雀也会停止歌唱;而当瓦斯含量超过一定限度时,虽然鲁钝的人类毫无察觉,金丝雀却早已毒发身亡。当时在采矿设备相对简陋的条件下,工人们每次下井都会带上一只金丝雀作为“瓦斯检测指标”,以便在危险状况下紧急撤离。
微服务下蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别 - 图5
灰度发布/金丝雀发布由以下几个步骤组成:
1、准备好部署各个阶段的工件,包括:构建工件,测试脚本,配置文件和部署清单文件。
2、从负载均衡列表中移除掉“金丝雀”服务器。
3、升级“金丝雀”应用(排掉原有流量并进行部署)。
4、对应用进行自动化测试。
5、将“金丝雀”服务器重新添加到负载均衡列表中(连通性和健康检查)。
6、如果“金丝雀”在线使用测试成功,升级剩余的其他服务器。(否则就回滚)
灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
灰度发布/金丝雀部署适用的场景:
1、不停止老版本,额外搞一套新版本,不同版本应用共存。
2、灰度发布中,常常按照用户设置路由权重,例如90%的用户维持使用老版本,10%的用户尝鲜新版本。
3、经常与A/B测试一起使用,用于测试选择多种方案。AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。

四、滚动发布(rolling update)
滚动发布,一般是取出一个或者多个服务器停止服务,执行更新,并重新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本。这种部署方式相对于蓝绿部署,更加节约资源——它不需要运行两个集群、两倍的实例数。我们可以部分部署,例如每次只取出集群的20%进行升级。

这种方式也有很多缺点,例如:
(1) 没有一个确定OK的环境。使用蓝绿部署,我们能够清晰地知道老版本是OK的,而使用滚动发布,我们无法确定。
(2) 修改了现有的环境。
(3) 如果需要回滚,很困难。举个例子,在某一次发布中,我们需要更新100个实例,每次更新10个实例,每次部署需要5分钟。当滚动发布到第80个实例时,发现了问题,需要回滚。此时,脾气不好的程序猿很可能想掀桌子,因为回滚是一个痛苦,并且漫长的过程。
(4) 有的时候,我们还可能对系统进行动态伸缩,如果部署期间,系统自动扩容/缩容了,我们还需判断到底哪个节点使用的是哪个代码。尽管有一些自动化的运维工具,但是依然令人心惊胆战。
并不是说滚动发布不好,滚动发布也有它非常合适的场景。

红黑部署(Red-Black Deployment)
这是Netflix采用的部署手段,Netflix的主要基础设施是在AWS上,所以它利用AWS的特性,在部署新的版本时,通过AutoScaling Group用包含新版本应用的AMI的LaunchConfiguration创建新的服务器。测试不通过,找到问题原因后,直接干掉新生成的服务器以及Autoscaling Group就可以,测试通过,则将ELB指向新的服务器集群,然后销毁掉旧的服务器集群以及AutoScaling Group。
红黑部署的好处是服务始终在线,同时采用不可变部署的方式,也不像蓝绿部署一样得保持冗余的服务始终在线。
红黑部署参考:
https://sweetibharti.wordpress.com/2016/11/11/red-black-deployment-on-aws/