灰度黑洞:零风险的混沌工程实验 | IDCF

DevOps

共 3134字,需浏览 7分钟

 ·

2021-06-24 22:53

来源:混沌工程实践
作者:码六贾

Netflix使用了灰度部署进行混沌实验,但仍会有小部分用户可能会受到影响。灰度黑洞,为混沌工程测试的安全性提供了理想的环境,对用户的影响则完全为零。


一、又快又稳的新挑战



人总有完美主义倾向,而现实是:写的代码不会没有Bug,所有的测试不可能完备,生产的构建部署不会没有缺陷,用户永远都会遇到问题。不过,我们革新和改变的动力,往往来自惨痛的生产事件:

  • 2019年7月CloudFlare的大宕机,是由错误配置的Web应用防火墙造成的。
  • Facebook的反垃圾邮件系统,意外地折叠了指向合法来源的链接。
  • 由于临床记录管理系统的软件更新,错误地为超过10,000名的患者开了药。

采用DevOps实践已经成为共识,发布周期的缩短,新功能推向生产的速度比以往更快同时,微服务和云原生架构正在增加应用的复杂性。当速度和复杂性增加时,软件缺陷进入生产的机会也在增加。

为了解决这一风险,我们需要加强在生产中的测试实践,这一过程常常称为“测试右移”。


测试右移,从后期生产阶段开始测试任务。这些测试是为了确保稳定性、性能和可用性标准。这样,就可以从目标用户那里收集反馈和评论,以了解在现实世界中的应用行为。这有助于进一步提高质量。

二、生产中测试的迫切性



在新产品投产之前,单元测试、功能测试、集成测试和非功能性测试等多种测试类型,对质量保障至关重要。下面这个图非常有意思,从测试对象的范围(从单个组件到系统层面)以及是否获得新知识这两个维度,对上述测试类型进行分类。 

( “混沌工程”在图的右上角)
一般而言,测试都在隔离的环境中进行。这些环境尽可能复制生产,以便为测试人员提供相当的测试环境,而不在生产环境直接测试,避免用户因为测试面临风险。
但是,仅进入生产之前的测试不足以解决所有问题,原因有以下几种:
2.1 生产是一个独特环境
生产不可替代。我们可以构建测试环境,使用与生产相同的基础设施和数据(基础设施即代码的方法等等),但是永远无法完全复制生产。环境具有其独特的配置,这会影响应用的行为方式,而且难以重现。当我们需要投入大量的时间和金钱,来达到环境之间的均等性。随着生产的不断变化,这种企图几乎是痴心妄想。
2.2 生产是用户在的地方
生产之前的测试受到时间、资金和人员技能的影响,无法做到完备测试。生产中的测试为测试人员提供了额外的机会来发现缺陷,以免对用户体验产生负面影响。

三、生产中测试的风险



在测试环境中进行测试的一个好处是,测试人员可以安全地运行侵入性测试,例如压力测试、压力测试和灾难恢复测试。
在生产中运行这些测试存在以下风险:
  • 影响性能或稳定性,损害用户体验;
  • 产生用户数据泄漏、修改或丢失;
  • 影响营销分析和运营指标,例如用户流量或错误率;
  • 引起违反法规或标准的事件(遵循GDPR、PCI、HIPAA等标准的个人身份信息 PII的使用)。
因此,与在测试环境中进行测试相比,在生产中进行测试需要一种更加受控的方法。

四、生产中安全的部署策略



许多应用部署策略非常适合生产测试:
  • 测试在生产的基础设施上上运行;
  • 将风险控制在相对较少的用户中;
  • 在重大缺陷或故障的情况下回滚。
4.1 蓝绿部署
蓝绿部署(Blue/Green Deployment)是一种发布策略,本质上就是并排运行两个相同的生产环境。一个环境(蓝色)托管应用的当前版本,而另一个环境(绿色)托管新版本。绿色环境开始保持闲置状态,不提供任何用户访问量,逐步将用户流量从蓝色环境切换到绿色环境中,不会产生停机时间。

蓝绿部署的主要好处是,可助力DevOps团队验证生产中的更改,不会给用户带来风险。通过将用户路由到以前的版本来回滚任何有问题的变更,DevOps团队始终拥有可靠安全的生产环境。
最大的问题是,在切换流量之前,绿色环境没有用户流量,很难测试应用刚上线时的行为。此外,维护两个独立的生产环境会增加成本和运营开销。
4.2 灰度部署
在灰度部署(Canary Deployment)中,新的更改最初会部署到一小部分用户,然后逐步推广到所有用户。蓝绿部署由两个单独的生产环境组成,灰度部署则是一个生产环境,托管着应用的两个不同版本。稳定版会继续处理大部分用户流量,而灰度所占的用户流量比例要小得多。
灰度部署的主要好处是:
  • 在实际的生产系统上运行;
  • 面向少量用户,减少缺陷带来的潜在影响;
  • 便捷地向所有用户推出经灰度验证的新版本。
例如,Netflix使用灰度部署来进行混沌实验、负载测试和回归测试。其中一个实验可能涉及部署一个API失效的服务版本,将一小部分用户路由到该服务,随着失败请求的增加,观察系统行为。测试完成后,可以删除灰度部署,并将这小部分用户重新路由到该服务的稳定版本。

不过,灰度部署仍可能存在有问题的服务,有影响小部分用户的风险,但是这种风险相对较小。 
4.3 黑洞启用
在黑洞启用(Dark Launch)中,实时用户流量将被复制并发送到应用的稳定版本和新版本中。稳定版本将继续响应用户请求,而新版本将没收其所有响应,不让用户可见,类似只进不出,俗称“黑洞启用”。
黑洞启用,可全面测试新版本的端到端功能,以及在实际负载下的性能。和灰度部署类似,黑洞部署可以逐渐扩大规模,以处理随着时间推移不断增长的流量,所以有时候也称之为“灰度黑洞(Dark Canary)”。

上图中,服务A拥有多个实例来接收用户请求,并调用服务B检索必要的信息。这是一个典型的分层系统,其中服务A是中间层服务,服务B是后端服务。而服务A是我们要验证的服务,则需要启用服务A的灰度黑洞群集。
LinkedIn使用Rest.li中的动态发现(D2)服务发现机制,D2库安装在每个服务实例中,向Zookeeper查询拥有该服务的集群,负责将服务A中的请求转发。灰度黑洞群集的流量就是这么来的。(https://linkedin.github.io/rest.li/Dynamic_Discovery )
灰度黑洞集群的响应会忽略,不会返回给用户。
一旦对新版本进行了完整的测试并进行了审核,如果要发布该新版本,只需启用新版本的返回响应,并禁用原始版本的响应即可。
当然,这需要一次运行两个版本的应用,会有成本的开销,但这比蓝绿部署要低得多。
灰度黑洞,为混沌工程测试的可靠性提供了理想的环境。Netflix使用了灰度部署进行混沌实验,但仍然会有小部分用户可能会受到影响。如果是灰度黑洞的方法,我们可以在与生产相同规模上运行这些实验,而对用户的影响则完全为零。
我们可以在基础架构的不同点引入故障,衡量对实际用户请求的影响,并解决直接影响用户的风险点。同时还可以发现,测试环境中的功能测试或端到端测试无法发现的问题。
灰度黑洞,可以做到这一点而不会影响任何用户。

五、结论



完美无缺的应用是一种奢望,我们不得不面对现实,在任何可能出现问题的地方检查应用行为。
在生产中测试,助力DevOps团队更好地了解应用行为及其基础设施,降低故障风险,改善用户体验,这是有巨大价值的。
蓝绿部署、灰度部署和黑洞启用,可以从只在测试环境中的检查,扩展到生产中的测试,使用受控的方法,控制用户风险。我相信,它们会使你的系统变得更加可靠,生产缺陷率将持续下降,用户体验将变得更好。
“有过DevOps黑客马拉松的人生,才算完整!
7月24-25日,IDCF DevOps黑客马拉松·北京,等你来挑战!!👇


浏览 15
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报