架构师-金丝雀与蓝绿发布
什么是金丝雀发布
金丝雀发布,又称灰度发布,是指通过让小部份用户流量引入的新版本进行测试,如果一切顺利,则可以增加(可能逐渐增加)百分比,逐步替换旧版本。如在过程中出现任何问题,则可以中止并快速回滚到旧版本。最简单的方式是随机选择百分比请求到金丝雀版本,但在更复杂的方案下,则可以基于请求的内容、特定范围的用户或其他属性等。
金丝雀发布的命名原因:
人们发现金丝雀这种生物对于有毒气体很敏感。因此矿工在下井采矿之前会把金丝雀鸟儿投入或携带到矿井中,如果鸟儿能够从矿井中飞出就表示井下有氧气,矿工就可以安心下井采矿了。
通过这个故事,我们就可以看出金丝雀部署就是先把新版本试水的一部分就叫金丝雀发布。金丝雀发布可以快速而有效地发现软件新版本存在的问题。
它的原理就是部署的时候让一小部分用户先试用功能 ,通过日志监控或者服务器监控,看下新用户的反馈。如果没有严重问题,尽快部署这个新版本,否则快速会退。小代价去试错
-
实施步骤:
- 选定测试用户:首先选择一小部分具有代表性的用户群体来测试新版本。
- 逐步推送:将新版本逐步推送给这些选定的用户,同时监控新版本的表现和用户反馈。
- 扩大范围:如果新版本在这些用户中表现良好,且没有收到负面反馈,则逐步扩大新版本的推送范围,直至覆盖所有用户。
-
优势与目的:
- 降低风险:通过逐步推送新版本,可以及时发现并修正潜在的问题,从而降低新版本全面上线后可能出现的问题风险。
- 用户反馈:可以更早地收集到用户对新版本的反馈,以便及时调整产品方向或修复问题。
- 平稳过渡:为用户提供了一个平稳过渡到新版本的过程,减少了突然改变可能带来的不适感。
-
技术实现:
- 金丝雀发布可以通过多种技术实现,例如在服务器端或客户端进行分流,将部分用户引导到新版本。
- 在大型互联网应用中,可能会使用专门的灰度发布引擎来管理用户分流和版本推送。
在蓝绿发布中,由于存在流量整体切换,所以需要按照原服务占用的机器规模为新版本克隆一套环境,相当于要求原来1倍的机器资源。在 A/B 测试中,只要能够预估中匹配特定规则的请求规模,我们可以按需为新版本分配额外的机器资源。相比于前两种发布策略,金丝雀发布的思想则是将少量的请求引流到新版本上,因此部署新版本服务只需极小数的机器。验证新版本符合预期后,逐步调整流量权重比例,使得流量慢慢从老版本迁移至新版本,期间可以根据设置的流量比例,对新版本服务进行扩容,同时对老版本服务进行缩容,使得底层资源得到最大化利用。
如图,某服务当前版本为 v1,现在新版本 v2 要上线。为确保流量在服务升级过程中平稳无损,采用金丝雀发布方案,逐步将流量从老版本迁移至新版本。
什么是蓝绿发布
蓝绿发布,提供了一种零宕机的部署方式,是一种以可观测的方式发布应用的方式,目的减少发布过程中停止时间。在保留老版本的同时部署新版本,将两个版本同时在线,新版本和老版本相互热备,通过切换路由权重的方式(非0即100)实现应用的不同版本上线或者下线,如果有问题可以快速地回滚到老版本。这样做的好处是无需停机,并且风险较小。
蓝绿发布是一种与金丝雀发布类似的策略,但是在新版本应用程序推出之前,先在一个完全独立的环境中进行测试并准备好一个完整但不向外公开的备份环境。当新版本准备好并经过测试之后,将新环境与旧环境进行切换,让新环境提供服务。如果在切换后出现问题,可以立即将流量切换回旧环境中,从而减少影响范围和恢复时间。
蓝绿发布需要对服务的新版本进行冗余部署,一般新版本的机器规格和数量与旧版本保持一致,相当于该服务有两套完全相同的部署环境,只不过此时只有旧版本在对外提供服务,新版本作为热备。当服务进行版本升级时,我们只需将流量全部切换到新版本即可,旧版本作为热备。由于冗余部署的缘故,所以不必担心新版本的资源不够。如果新版本上线后出现严重的程序 BUG,那么我们只需将流量全部切回至旧版本,大大缩短故障恢复的时间。待新版本完成 BUG 修复并重新部署之后,再将旧版本的流量切换到新版本。
蓝绿发布通过使用额外的机器资源来解决服务发布期间的不可用问题,当服务新版本出现故障时,也可以快速将流量切回旧版本。
如图,某服务旧版本为 v1,对新版本 v2 进行冗余部署。版本升级时,将现有流量全部切换为新版本 v2。
当新版本 v2 存在程序 BUG 或者发生故障时,可以快速切回旧版本 v1。