什么是灰度发布
1. 一般发布
一般我们发布新应用,需要经过以下几个步骤:
- 上传新的程序包到服务器
- 停止旧版本服务
- 启动新版本服务
这种发布方式,会存在两个问题:
- 新版本升级发布过程中,服务是中断的,无法向外提供服务
- 如果新版本发布后有bug,升级失败,回滚会比较麻烦,容易造成更长时间的服务不可用
为了解决这些问题,所以提出了多种发布策略。
2. 蓝绿部署
蓝绿部署指的就是,同时运行两个版本的应用。如下图。
蓝绿部署时,v1旧版本服务不会被停止,而是直接部署一套新版本服务v2。等v2运行起来没有问题之后,再把服务提供从v1切换到v2。
但是蓝绿部署的缺点在于,升级过程中需要部署两套程序,对硬件的要求就是需求的两倍。比如日常运行需要5台服务器,蓝绿部署就需要10台服务器。
3. 滚动发布
如下图。
滚动发布可以解决蓝绿部署造成的硬件要求倍增问题。
滚动发布也就是说,在服务升级过程中,并不是一下子启动所有版本,而是先启动一台v2新服务,再停止一台v1旧服务,然后再启动v2,停止v1,直到所有服务都升级完成。
也就是,利用滚动发布,日常运行需要5台的服务器,升级过程中只需要6台服务器就足够了,比蓝绿部署对硬件的要求低了很多。
但是滚动发布也有问题。开始滚动发布后,流量会直接流向已经启动的新服务,但是这个时候新服务不一定是可用的,也就是说,在升级过程中整个系统处于一种不稳定的状态,且如果在途中发现了问题,难以定位是新服务还是旧服务的问题。
所以可以看出,滚动发布需要实现流量控制功能。
4. 灰度发布
灰度发布(金丝雀发布),起源是,矿井工人发现,金丝雀对瓦斯气体很敏感,矿工会在下井之前,先放一只金丝雀到井中,如果金丝雀不叫了,就代表瓦斯浓度高。
4.1. A/B测试
A/B测试是一种将网页或应用程序的两个版本相互比较以确定哪个版本的性能更好的方法。
它类似于初中生物说的对照试验。对用户分组,每个组使用一个方案(方案应遵从单变量前提),在相同的时间维度上去观察用户的反应(体现在业务数据和用户体验数据上)。
需要注意的是各个用户群组的组成成分应当尽量相似,譬如新老用户很有可能表现出较大的偏好差异。最后根据假设检验的结果,判断哪些版本较之原版有统计意义上的差异,并根据效应量选出其中表现最好的版本。
4.2. 灰度机制
很多公司在一开始做产品定义时,要么确定它是黑的,要么确定它是白的。但是其实互联网的产品定义是由用户决定的,在一开始不定义它是黑还是白,有一个灰度周期。在这个灰度周期里,用用户的口碑来决定它是生是死是黑是白。
4.3. 灰度发布定义
灰度发布,又称金丝雀发布,起源是矿井工人发现金丝雀对瓦斯气体很敏感,所以矿工在下井之前,会先放一只金丝雀到井中,如果金丝雀不叫了,就代表瓦斯浓度高。
灰度发布是指在黑与白之间能够平滑过渡的一种发布方式,在其上可以进行A/B测试,也就是让一部分用户继续使用产品特性A,另一部分用户使用产品特性B,如果用户们对B没有反对意见,便主键扩大使用范围,把所有用户都迁移到B上,如下图。
灰度发布可以保证整体系统的稳定性,且在初始灰度时可发现问题,调整问题,降低影响。
4.4. 灰度发布具体流程
- 灰度发布开始后,先启动一个新版本应用,但并不切流量,而是让测试人员先对新版本进行线上测试。启动的这个新版本应用,就是金丝雀。
- 如果测试没有问题,则将少量用户导入新版本上,对新版本做运行状态观察,收集各种运行时数据,对照新旧版本数据对比,这就是所谓的A/B测试。
- 确认新版本运行良好,逐步将流量导入新版本。期间可以不断调整新旧两个版本运行的服务器数量,让新版本承受越来越大的流量压力,直到全部切换到新版本,此时可以关闭剩下的老版本服务,完成灰度发布。
在灰度发布过程中,如果发现新版本问题,就应该立即将流量切回到老版本,这样将负面影响控制在最小范围内。
4.5. 优点
- 灵活选择测试用户参与产品测试
- 避免停止服务给用户带来的不便
- 具有容灾能力:降低全量发布引起的服务器崩溃风险,逐步发布产品,逐步控制服务器压力
- 规避一定的发布风险,降低产品迭代升级所影响的范围
- 迅速获得用户的反馈意见,完善产品功能,提升产品质量