混沌工程详细介绍——Netflix持续交付实践探寻

内容来源:DevOps案例深度研究 – Netflix的文化与工程实践战队(本文只展示部分案例PPT及研究成果,更多细节请关注案例分享活动,及本公众号)。

本案例内容贡献者:高金梅,李晓莉,潘雄鹰,潘晓华,任广印,孙亚雄,王英伟

本次案例解读:潘晓华

原文首发于简书-潘晓华Michael

640?wx_fmt=jpeg

(捣乱猴子)
本篇来自于本人6月-7月参加的“DevOps案例深度研究”活动Netflix案例研究的第五部分,详细介绍了Netflix的混沌工程。
经过一个月的战斗,四个版本的迭代,Netflix战队最后交付了让所有人满意的战果,并获得了全场唯一的案例研究最佳小组奖杯。感谢我们的战友,还有指导老师,姚冬老师和徐磊老师。

640?wx_fmt=jpeg

(本案例所有研究人员)

一、Netflix实施混沌工程的背景

640?wx_fmt=png

640?wx_fmt=jpeg

(混沌工程)
08年Netflix决定把它的业务迁移到aws上,从自身运维的角度考虑,它有很多担忧的地方。
  • 很长时间内有两套系统在同时运行,运维的复杂度更高了。
  • Netflix的用户量已经达到了1亿,对应用稳定性依赖很高,如果出现故障对用户的影响非常大,甚至是致命的。
  • 它的业务不断复杂,引入微服务架构,对应用的高可用性要求越来越高。
  • 生产环境非常复杂,是多样性的,很难在测试环境中完全模拟生产的状态。
因此,Netflix决心探索一种在生产环境验证应用高可用性的一种方法,这就是现在大家所熟知的混沌工程。

二、混乱工程的发展

640?wx_fmt=png

640?wx_fmt=jpeg

(混乱工程的发展)
  • 2010年,捣乱猴子诞生

  • 2011年,猴子军团,有了更多场景下的工具集

  • 2012年,开源了捣乱猴子的代码,建立社区,影响了越来越多的公司混沌工程的发展

  • 2014年,Netflix创建了新的工作角色,混沌工程师,代表了Netflix将混沌工程融入了公司的运维文化中

  • 2015年,Netflix与社区正式提出混沌工程原则,从此混沌工程不只是一些工具的集合,而有了一套理论支撑

  • 2016年,Netflix前员工Kolton Andrus创立了Gremlin,正式将混沌实验工具商用化,可以看到混沌工程影响着越来越多的企业。

  • 2017年,Chaos Monkey 2.0

从一只猴子,发展成庞大的猴子军团,是Netflix在生产实践中不断探索与不断进化的结果。

三、Netflix猴子军团

640?wx_fmt=png

640?wx_fmt=jpeg

(Netflix猴子军团)

Netflix猴子军团包括很多工具:
  • Chaos Monkey,捣乱猴子,可以随机关闭生产环境中的实例,确保网站系统能够经受故障的考验,同时不会影响客户的正常使用。

  • Latency Monkey,延迟猴子,在RESTful服务的调用中引入人为的延时来模拟服务降级,测量上游服务是否会做出恰当响应。通过引入长时间延时,还可以模拟节点甚至整个服务不可用。

  • Conformity Monkey,一致性猴子,查找不符合最佳实践的实例,并将其关闭。例如,如果某个实例不在自动伸缩组里,那么就该将其关闭,让服务所有者能重新让其正常启动。

  • Doctor Monkey,医生猴子,查找不健康实例的工具,除了运行在每个实例上的健康检查,还会监控外部健康信号,一旦发现不健康实例就会将其移出服务组。

  • Janitor Monkey,守卫猴子,查找不再需要的资源,将其回收,这能在一定程度上降低云资源的浪费。

  • Security Monkey,安全猴子,这是Conformity Monkey的一个扩展,检查系统的安全漏洞,同时也会保证SSL和DRM证书仍然有效。

  • 10-18 Monkey,本地化猴子,进行本地化及国际化的配置检查,确保不同地区、使用不同语言和字符集的用户能正常使用Netflix。

  • Chaos Gorilla,捣乱大猩猩,Chaos Monkey的升级版,可以模拟整个Amazon Availability Zone故障,以此验证在不影响用户,且无需人工干预的情况下,能够自动进行可用区的重新平衡。

  • Chaos Kong,捣乱金刚,Chaos Gorilla的升级版,可以模拟整个Region的故障。

这些工具向我们展示了Netflix的一套方法论,混沌工程并不是一些测试工具的集合,而是一种思想:在生产实践中遇到问题时,利用混沌工程的思想,实施自己的一些混沌实践,引入新的猴子。相信以后会有越来越多的猴子加入到猴子军团。
使用 Simian Army 进行混沌工程实验,看起来似乎已经很完美。在生产上做这样不可控的实验,是很危险的。

四、混沌工程的原则

640?wx_fmt=png

640?wx_fmt=jpeg

(混沌工程的原则)
引入混沌实践时需要了解混沌工程的五大原则。
1)建立稳定状态的假设
在做混沌工程实验的时候,首先得确定需要测试的指标已经做了高可用的工作,才能进行验证指标对业务的是否有影响。如果没有做好高可用工作,而引入混沌工程实验的话,对业务而言将会是一声灾难。
2)多样化现实世界事件
不能够凭空想像出一些事件来验证,而是引入那些真实存在的,频繁发生的,且影响重大的事件。对我们而言给这些事件做混沌实验才具有价值。如磁盘故障、网络延时、主机宕机等。
3)在生产环境运行实验
尽量在类生产环境中进行测试,生产环境的多样性是任何其它环境无法比拟的。混沌工程的价值就是保证生产上的业务连续不中断。
4)持续自动化运行实验
实施混沌工程实验一般最开始是人工手动操作,当我们对业务有足够的信心时,要把混沌实验做成持续自动化。在版本升级、不断迭代的过程中,持续不断自动化地做验证,最大程序保证业务的连续性验证。
5)最小化影响范围
做混沌工程的意义就是保证生产上的业务。在我们实施混沌实验时也必须保证对线上业务影响最小。在实施实验时,从小范围开始,不断扩大范围,避开高风险时段,如选择业务量最小的时候实施实验。

五、混沌工程实践步骤

640?wx_fmt=png

640?wx_fmt=jpeg

(混沌工程实践步骤)

有了这些原则,就可以根据业务的真实场景设计混沌工程实验。

在真实展开实验时分为两个阶段:准备阶段、执行阶段。

1)准备阶段

  • 确认本次实验需要验证的目标。遵循建立稳定状态的假设、多样化现实世界事件的原则。例如:Redis的超时不会对系统影响。代码中已经对Redis超时的情况做了相关的工作,保证业务的可靠。实验只是用来测试验证。
  • 选择实验范围。遵循对线上业务影响最小、尽量与生产环境相近的原则。例如先测试环境验证,生产环境选择最小量用户验证。
  • 确认监控指标。例如:订单成交量、应用请求响应时间、应用响应错误率,做好监控实时查看状态。
  • 团队成员沟通。遵循最小化影响范围。确保团队相关成员了解实施情况,关注业务状态。准备阶段一般只是第一次实验的时候操作,一旦验证好了以后以后,后续重复执行本次工程不需要重新准备,除非对实验过程有变动。

2)执行阶段

  • 执行实验。遵循最小化影响范围。执行过程中实时关注指标,如果有异常,随时终止实验。例如,把Redis延时调大,查看监控指标是否有异常。
  • 分析结果。遵循最小化影响范围。根据收集的指标数据确认假设Redis的超时不会对系统影响。如果验证假设不成立,则需要分析代码,确认好原因,再组织下一次的混沌工程实验。
  • 扩大实验范围。遵循最小化影响范围。先小范围测试,再逐步扩大测试范围。
  • 自动化。遵循持续自动化运行实验。当对代码有足够的信心之后,将混沌工程实践做成自动化,让混沌工程实验能够持续保证业务的可用性,获得最大的价值。

六、Chaos Monkey在K8S集群下的应用

640?wx_fmt=png

640?wx_fmt=jpeg

(Chaos Monkey在K8S集群下的应用)
Kubernetes是容器编排市场的领导者。如何保证K8S集群及运行在上面的应用能够抵御生产中动荡环境的能力和信心呢?正确地使用混沌工程实践是这里面的关键。我做了一些调研,找到了常用的三款在K8S环境下的混沌工程工具。
  • Kube-monkey:模拟在指定时间随机删除K8s集群中的pod。

  • Powerfulseal:控制K8S中的Pod及Node节点的状态。

  • Gremlin:是一个商业版工具。通过web/API/CLI的方式对容器、主机,提供数十种攻击方式,方便与其它工具进行集成。

总结

640?wx_fmt=png

可见混沌工程并不仅仅是在传统运维、云平台发挥着作用,在最新的基础架构设施容器平台中也发挥着它的价值。我相信会有越来越多的企业将意识到混沌工程给系统带来的各种好处,不久的将来,混沌工程实践也许会成为基础设施运维与应用运维不可或缺的一部分。

参考文章

  • Netflix 混沌工程手册:https://www.infoq.cn/theme/13

  • Unleash the Chaos Monkey:https://www.ibm.com/developerworks/agile/library/a-devops4/index.html

  • Netflix的Chaos Monkey的一个实现用于Kubernetes集群:https://go.ctolib.com/kube-monkey.html

  • 获得1.25亿用户以后,Netflix总结了这些系统可用性经验:https://www.huxiu.com/article/258949.html?rec=similar

  • Istio Chaos Engineering: I Meant to Do That:https://developers.redhat.com/blog/2018/04/10/istio-chaos-engineering/

  • AWS云上混沌工程实践之启动篇:https://aws.amazon.com/cn/blogs/china/aws-chaos-engineering-start/

拓展阅读:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P4175 [CTSC2008]网络管理(整体二分)

P4175 [CTSC2008]网络管理 给定一棵有nnn个节点的树,点有点权,有两种操作:① 修改某个点的点权,② 查询两点路径间的点权第kkk大。 给定u,vu, vu,v,选定111号节点为根节点,设inf(x)inf(x)inf(x)表示从根节…

深入理解 JVM Class文件格式(六)

经过前几篇文章, 终于将常量池介绍完了, 之所以花这么大的功夫介绍常量池, 是因为对于理解class文件格式,常量池是必须要了解的, 因为class文件中其他地方,大量引用了常量池中的数据项。 对于还不了解常量池…

远程开发初探 - VS Code Remote Development

如果你是学生,你还在你的 windows 电脑上为各种环境配置头疼的时候,你应该了解一下 Remote Development。如果你喜欢 linux 的开发环境和舒适的 shell,但却不舍得抛弃 windows/macos 图形界面给你带来的用户体验和一些软件的兼容(QQ, 微信), …

深入理解 JVM Class文件格式(七)

本专栏列前面的一系列博客, 对Class文件中的一部分数据项进行了介绍。 本文将会继续介绍class文件中未讲解的信息。 先回顾一下上面一篇文章。 在上一篇博客中, 我们介绍了: this_class 对当前类的描述 super_class 对当前类的超类的描述 in…

P3250 [HNOI2016]网络(整体二分)

P3250 [HNOI2016]网络 给定一棵树,有三种操作: 给定u,v,wu, v, wu,v,w,表示u,vu, vu,v路径上有一个重要度为www的请求,给定ttt,第ttt个发生的请求结束,给定一个xxx,假设xxx发生故障&#xff0…

微信小程序集成腾讯云 IM SDK

1、背景因业务功能需求需要接入IM(即时聊天)功能,一开始想到的是使用 WebSocket 来实现这个功能,然天意捉弄(哈哈)服务器版本太低不支持 wx 协议(也就不支持 WebSocket了)不得不寻找…

深入理解 JVM Class文件格式(八)

在本专栏的第一篇文章 深入理解Java虚拟机到底是什么 中, 我们主要讲解了什么是虚拟机, 这篇博客是对JVM的一个概述。 在随后的几篇文章中,一直在讲解class文件格式。 在今天这篇博客中, 将会继续讲解class文件中的其他信息。 在本…

Function!(计蒜客 - 42386)

Function! fa(x)ax(a>0,a≠1)f_a(x) a ^ x(a > 0, \ a \neq 1)fa​(x)ax(a>0, a​1),我们要求∑a2n(a∑ban⌊fa−1(b)⌋⌈fb−1(a)⌉)\sum\limits_{a 2} ^{n} \left(a \sum\limits_{b a} ^{n} \lfloor f_a ^{-1}(b) \rfloor \lceil f_b ^{-1}(a) \rce…

深入理解 JVM Class文件格式(九)

经过前八篇关于class文件的博客, 关于class文件格式的内容也基本上讲完了。 本文是关于class文件格式的最后一篇。 在这篇博客中, 将会讲解关于方法的几个属性。 理解这篇博客的内容, 对于理解JVM执行引擎起着重要作用。 关于虚拟机执行引擎有…

MongoDB入门及 c# .netcore客户端MongoDB.Driver2.9.1使用

MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。什么场景下使用MongoDBMongoDB虽然是NoSQL(非关系型的数据库),但是实际使用的时候可以当做关系型数据库来用,mysql等数据库中单表数据量…

#4604. The kth maximum number(整体二分 + 树套树)

#4604. The kth maximum number 给定一个大小不超过51055 \times 10 ^ 55105的矩形区域,有一些点有点权。 每次询问给定x1,y1,x2,y2,kx_1, y_1, x_2, y_2, kx1​,y1​,x2​,y2​,k问以x1,y1x_1, y_1x1​,y1​为右下角,x2,y2x_2, y_2x2​,y2​为左上角的…

深入理解 JVM Class文件格式(十)

到此, 所有关于class文件格式的重要内容都已经讲解完了, 不敢说面面俱到, 但是敢说大部分重要的内容都包含在内了。前前后后用了9篇博客来专门讲解class文件结构, 为什么花那么多的时间和精力来介绍class文件呢? 简而言…

《WTM送书活动:向更遥远的星辰大海起航~》

点击上方蓝字关注我们吧是的,没错~这一篇不是大老刘写的 哈哈~啥? 你想知道为啥? 大老刘为了你们不加班,熬夜改BUG,姑娘不乐意了...然后...后面请自行脑补~哎~生活还要继续鸭....那么,接下来由我陪大家唠一段儿~ 单口...各位看官老爷们:注意了!第一件事情呢我们的WTM框…

P4602 [CTSC2018]混合果汁(主席树)

P4602 [CTSC2018]混合果汁 共有nnn种果汁,第iii种果汁的美味度为did_idi​,每升价格为pip_ipi​,在一瓶混合果汁中,最多只能添加lil_ili​升。 有mmm个询问,每次询问给出两个数g,Lg, Lg,L,我们要找出价格…

Java中的对象一定在堆上分配吗?

首先,为解释这个问题,需要的基本知识如下(如果对以下概念不太熟悉, 可以先了解下): 1.JVM内存结构,传送门 2.即时编译(JIT),传送门 3. 逃逸分析,…

最全的 netcore 3.0 升级实战方案

1、哈喽大家中秋节(后)好呀!感觉已经好久没有写文章了,但是也没有偷懒哟,我的视频教程《系列一、NetCore 视频教程(Blog.Core)》也已经录制八期了,还在每周末同步更新中,…

H - Hello Ms. Ze(树状数组套主席树,线段树上二分)

H - Hello Ms. Ze 给定nnn种不同的材料,第iii种材料有aia_iai​个,有mmm个操作,操作分为两类: 把第xxx种材料修改为yyy个,只用[l,r][l, r][l,r]区间的材料制作衣服,每件衣服要用kkk个不同的材料&#xff…

JVM——逃逸分析

首先,为解释这个问题,需要的基本知识如下(如果对以下概念不太熟悉, 可以先Google下): 1.JVM内存结构,传送门 2.即时编译(JIT),传送门 逃逸分析 在编译期间…

ASP.NET Core SignalR:集线器Hub

一、什么是集线器hubs通过SignalR的集线器hubs中定义的方法,服务器可以调用连接中的客户端定义的方法,而客户端也可以调用服务器端集线器中定义的方法。SignalR负责实现了客户端和服务器之间的实时通信。二、配置SignalR的hubsSignalR通过在Startup.Conf…

P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演 + 伯努利数)

P6271 [湖北省队互测2014]一个人的数论 ∑i1nim[gcd⁡(i,n)1]∑d∣nμ(d)dm∑i1ndim由伯努利数可知∑i0nim1m1∑i0mCm1iBi(n1)m−i1设fi1m1Bm−i1Cm1i,则有∑d∣nμ(d)dm(∑i1m1fi(nd)i(nd)m)∑i1m1fini∑d∣nμ(d)dm−i(nm∑d∣nμ(d))考虑后项∑d∣nμ(d)dm−i,迪…