在软件上线之前,不可避免地要对软件的正确性、可靠性进行测试,又最好不要停机维护、不要影响用户体验,并且在新版本出现问题的时候能够及时回退。所以,需要有一套完整的部署方案,灰度发布、滚动发布、蓝绿部署都是常见的手段,而A/B测试则是对用户体验进行调查的测试手段,这里一并学习。
一、灰度发布
定义
灰度发布又叫做金丝雀发布,以前矿工下矿洞前,会放一只金丝雀去试探是否有瓦斯(金丝雀对瓦斯很敏感),映射到这里就是先发布一小部分来试探整体是否能够正常运行,如果能正常运行则进行完全部署的发布方式,目前仍然是不少成长型技术组织的主流发布方式。
操作描述
(1)当前版本为V1,替换服务器集群中的一小部分(比如1台)为新版本V2。
(2)如果正常运行,则把剩余V1版本全部升级为V2;如果运行失败,所有服务器回退到V1。
特点分析
(1)流量趋势图
绿色为旧流量,黄色为新流量。
(2)优点
用户体验影响小,发布过程中出现问题只影响一部分用户。
能够动态指定新版本流量
(3)缺点
自动化程度不够,发布期间可能会引发服务中断。
二、滚动发布
定义
滚动发布(Rolling Update Deployment)是在灰度发布上的改进,先发布一小部分,然后逐步增加新版本的数量,直到服务器都升级为新版本。自动化程度较高,用户体验平滑,是目前成熟型技术组织所采用的主流发布方式。
操作描述
(1)先发布小比例新版本,类似金丝雀。
(2)如果验证成功,按照一定比例替换新版本,直到所有版本都升级为新版本,例如1台,10%,50%,100%。
(3)一旦失败,将所有新版本应用替换回旧版本应用。
特点分析
(1)流量趋势图
绿色为旧流量,黄色为新流量。
(2)优点
用户体验影响小,体验平滑。
(3)缺点
发布和回退时间缓慢。
发布工具复杂,NLB需要平滑的流量摘除和拉入能力。
无法动态控制流量
三、蓝绿部署
定义
蓝绿部署(Blue Green Deployment)是一种可以保证系统在不间断提供服务的情况下上线的部署方式,它以可预测的方式发布应用,减少发布过程中服务停止的时间。
操作描述
(1)准备两个相同的应用运行环境,命名为蓝色环境、绿色环境,刚开始,蓝色环境和绿色环境都运行着相同的应用版本V1,只有蓝色环境对外提供服务。
(2)我们开发了一个新版本V2,那么放到绿色环境上进行反复的测试、修改、验证,确定达到上线标准后,利用负载均衡器/反向代理/路由等手段将对外服务切换为绿色环境。
(3)一段时间后,如果发生故障,那么迅速切换回蓝色环境V1;如果运行没有异常,那么蓝色环境更新版本到V2,版本再次一致。
(4)当需要开发下一个版本V3,重复前面的步骤,蓝色绿色相互切换相互备份。
特点分析
(1)流量趋势图
绿色为旧流量,黄色为新流量。
(2)特点
蓝色绿色环境相同,但硬件可以不同,例如蓝色和绿色环境分别是两台独立的机器。
蓝色绿色环境都会在上线版本、旧版本(用于回滚)和新版本(用于上线前测试)之间循环。
如何保证数据库的事务在切换、回退过程中不受影响是很重要的事情,一般来说可以在切换过程中设置为“只读”,或者设计回馈机制,将事务同时反馈到两个环境。
(3)优点
不停机更新。
遇到问题能及时回退到正确版本。
(4)缺点
需要的硬件成本和软件服务倍增了。
数据库同步非常困难。
如果需要同时处理“微服务架构应用”和“传统架构应用”,当协调不好的时候还是可能出现服务停止的。
在非隔离基础架构(VM、Docker)上执行蓝绿部署,蓝绿色环境都有被摧毁的可能。
四、双服务器发布
蓝绿发布就是双服务器发布中的蛮力发布法(强行切换),而利用相同的双服务器发布模式可以进行灰度、滚动发布。
五、测试方法
前面的所有都是发布方法,旨在发现bug、隐患。
测试方法则是效果测试,关注的是旧版本和新版本的效果好坏,比如流量转化率、用户体验等等。
A/B测试
A/B测试指的是同时上线V1和V2版本,根据一定条件将流量分别导入V1和V2版本,收集感兴趣的数据,来对比产品功能的效果。
影子测试
影子测试主要用于语言切换,比如从JAVA项目迁移到.NET项目,准备两个完全相同的环境,将流量同时导入两个环境,比对输出的响应,来判断是否逻辑等价。
这种测试可能需要几周,也可能长达半年。
总结
部署方式 | 零停机 | 生产流量测试 | 机器成本 | 回退速度 | 对用户的影响 | 复杂度 |
---|---|---|---|---|---|---|
灰度发布 | ? | √ | 低 | 慢 | 一般 | 低 |
滚动发布 | √ | √ | 低 | 慢 | 低 | 低 |
双服务器组——蓝绿 | √ | × | 高 | 快 | 一般 | 一般 |
双服务器组——灰度 | √ | √ | 高 | 快 | 小 | 一般 |
双服务器组——滚动 | √ | √ | 高 | 快 | 小 | 一般 |
参考资料
1、《蓝绿部署、A/B测试以及灰度发布》
2、《蓝绿部署、金丝雀发布(灰度发布)、A/B测试的准确定义》
3、《微服务部署:蓝绿部署、滚动部署、灰度发布、金丝雀发布》
4、《金丝雀发布、滚动发布、蓝绿发布到底有什么差别?关键点是什么?》