写点什么

混沌工程的力量:阿里周洋亲述这一技术背后那些事儿

  • 2019-05-22
  • 本文字数:3508 字

    阅读完需:约 12 分钟

混沌工程的力量:阿里周洋亲述这一技术背后那些事儿

阿里巴巴技术团队对混沌工程的研发迭代持续了数年,对于这一技术,阿里为什么如此坚持?


2010 年底,Netflix 向全世界推出 Chaos Monkey (混乱猴子),该技术以在生产环境中随机关闭服务节点而“恶名远扬”,这就是目前熟知的混沌工程的早期雏形。《Chaos Engineering》书中是这样描述的:


混乱猴子的美妙之处就在于此,它能尽可能地将服务节点失效的痛苦提到最前,同时让所有工程师在构建一个具有足够弹性应对失败的系统上,达成一个一致的目标。


混乱猴子的灵感来自于 Netflix 几年前搬迁上云的过程,主要是为了解决该阶段暴露的问题。然而,目前不少企业的上云进程依旧缓慢,这种状态下是否还需要混沌工程?随着软件的测试流程越来越成熟且完善,是否有必要花费精力搞混沌工程?如果需要,这一领域有哪些开源工具可供快速部署实践?


针对上述问题,InfoQ 记者在QCon 2019 全球软件开发大会的现场采访了阿里巴巴高级技术专家周洋(花名:中亭),并与业内多名技术专家进行了不同程度的交流,本文将试图通俗讲解混沌工程的含义、作用及阿里巴巴的实践经验。

混沌工程的含义

混沌工程是在分布式系统上进行实验的学科 , 目的是建立对系统抵御生产环境中失控条件的能力以及信心 。


这句话同样出自《Chaos Engineering》,粗看起来,这一含义有些晦涩难懂。如果简单概括下,周洋对混沌工程的理解是如下四点:


  • 一种拥抱失败的技术文化

  • 一套抽象严谨的实践原则

  • 一种主动防御的稳定性手段

  • 一个高速发展的技术领域


从原理性角度来讲,周洋认为,实施混沌工程是分布式系统构建业务的必然选择。一方面架构的复杂性让系统负责人员很难自信承诺实际情况一定符合预期设计。另一方面组织对 ROI(投资回报率)的追求,又要求稳定性团队不能只是一个成本中心,所有措施要富有成效。业内不少工程师倾向于将混沌工程比作疫苗,通过"接种疫苗"的方式,让系统具备抵挡"重大疾病"的能力。混沌工程的原则又可以概括为:建立一个围绕稳定状态行为的假说;多样化真实世界的事件;在生产环境中运行实验;持续自动化运行实验;最小化爆炸半径。



想必看到混沌工程的那一刻,不少人脑海中会闪过一个词“测试”。如今,故障注入和故障测试的手段已经非常成熟,为什么还需要混沌工程。周洋认为,这之间存在一定重叠性,但混沌工程是发现新信息的实践。


故障注入和故障测试是通过引入故障,让程序走入一些不常经过的路径,以此提高程序覆盖率,是对特定条件、变量的验证。混沌工程虽然也使用短期度量结果代表系统状态,但该度量结果一般是监控指标,而非具体的接口返回值。混沌工程是围绕稳态进行验证和探索的过程,比如混乱猴子随机杀死部分节点的行为,每次实验都可能产生新的数据。


举例来说,故障注入的典型场景是对系统服务注入通信故障,比如超时、错误等,但无法探究流量激增、资源竞争条件等其他异常行为,这个实践过程本质上并不能发掘系统内未知或尚不明确的认知。而混沌工程的输入条件可能是模拟整个云服务区域或数据中心故障;挑选一个时间段,和针对一部分流量,对其涉及的服务间调用注入一些特定的延时;方法级别的混乱(运行时注入),让方法随机抛出各种异常等。


此外,实施混沌工程的人员也有所不同。周洋表示,以阿里内部的全链路压测为例,实施主要还是研发人员为主。传统意义上,测试人员更关注上线前的状况,之后交由 SRE 团队负责运维。混沌工程可以理解为测试的思想,但并不一定只有测试人员操刀,可以是 SRE、研发、技术支持甚至运营。

不为,就不需要混沌工程?

所谓不为,此处可以理解为较低频次的迭代和平缓的业务变更。如上文所言,Netflix 对混沌工程的探索起源于数据中心迁移上云的过程,因此不乏有企业认为只要不进行大规模的云迁移,就不需要实践混沌工程。


其实,这种想法是非常片面的。无论是激进的架构变迁,还是平缓的系统迭代,很多问题并不是因为迁移上云才出现,只是因为迁移上云才被暴露出来。


只要有过在生产环境中实际运行分布式系统的经历,一定会清楚分布式系统天生包含大量交互、依赖点,可以出错的地方数不胜数,比如硬盘故障、网络不通、流量激增压垮系统等,人力并不能完全阻止故障发生,而应该在异常行为被触发之前,尽可能多地识别出系统中脆弱且易出故障的环节。



根据 Netflix 的实践历程,尝试破坏系统和服务很简单,但并不是全都可以有建设性、高效地发现问题。周洋认为,严格来讲,混沌工程与云的关系不大,但目前大部分企业都处于云迁移、云就绪或者云原生的不同阶段,上云已经成为无法阻挡的趋势,该阶段正是故障爆发的高发期,这些问题可能潜藏在系统中良久,只是一直未被集中发现。虽然上云集中变革的是基础设施层面,但需要某种手段验证上层技术平台是否可以在这个过程中不受影响并保持一致,混沌工程的引入可以让问题提前暴露、提前解决,让企业更全面地理解这些系统性固有现象,从而在分布式系统中实现更好的工程设计,不断提高系统弹性。


此外,周洋特别强调,混沌工程并不是大公司的专属,除非企业完全不在乎系统运行情况。相比较而言,金融、游戏、电商、航空航天等业务发展较快且对可用性具备高要求的领域更加需要混沌工程。如果本身的研发团队或者业务团队规模较小,同样需要混沌工程提高效率和产出比。

阿里巴巴混沌工程实践

早在 2011 年,阿里电商就开始尝试通过故障注入技术去解决微服务的依赖问题,从注入实现、实验效率、业务影响等多个方面进行演进;2012 年,阿里推出同城容灾,进行断网演练;2015 年,异地多活上线;2016 年,MonkeyKing 被用于故障演练;2019 年,阿里开源混沌工程工具ChaosBlade(混沌之刃)。



周洋介绍,阿里之所以下定决定做这件事情,源自大促备战的反思,虽然内部有完善的体系和流程,但真实情况下的系统稳定性是未知的。因此,阿里决定手段与技术并行,通过混沌工程解决技术和组织层面的问题。


实践早期,团队希望通过混沌工程解决微服务依赖治理的问题,因为当时的微服务拆分还没有特别彻底。举例来说,一个核心服务与某个非核心服务之间可能存在强依赖关系,非核心服务出现问题时,可能拖垮核心服务,这肯定是不合理的,也是业务无法接受的。因此,团队通过引入混沌工程进行强依赖治理,优化整个流程。


一些基础技术团队也尝试通过混沌工程解决容器相关的问题。周洋介绍,作为云服务,容器平台本身属于 PaaS 层,通过实施混沌工程可以保证系统本身没有问题;其次,传统企业上云时,面临着应用向容器转换的过程,设计模式等都需要进行改变,如果对业务稳态具有要求,混沌工程的引入可以解决这一阶段出现的问题。


目前,集团安全生产团队开始牵头运作"突袭演练"这种跨公司的稳定性战役。在一个可控的环境下,通过有计划的打擂和无计划的突袭,让安全生产蓝军和业务红军进行对抗,通过实战演练的方式验收稳定性措施的全面性和有效性。


回顾整个发展过程,周洋认为,比较难的事情,一是让团队意识到可以通过混沌工程技术趋同整个稳定性链条,更自动化、智能化得提升平台稳定性。因为,平台能力越差,支持各个团队的人力成本就越高,平台能力越高,防御相应就越差;二是,让更多人接受并实施该理念,无论是内部还是云上的客户,都可以了解平台的问题,阿里团队也希望将内部稳定性的经验通过平台化的方式对外输出,ChaosBlade 便由此开源。


ChaosBlade 经历了 6 年改进和实践,累计在线上执行演练场景达数万次,是一款遵循混沌实验模型,提供丰富故障场景实现,帮助分布式系统提升容错性和可恢复性的混沌工程工具,其特点是操作简洁、无侵入、扩展性强。基于 Apache License v2.0 开源协议,目前有 chaosblade 和 chaosblade-exe-jvm 两个仓库,后续还会添加 C++、Node.js 等其他语言的混沌实验执行器。


目前,混沌工程领域已经出现不少优秀的开源工具,比如 kube-monkey、ChaosIQ 等,但很多开源工具的功能存在高度重叠,或者难以满足实际诉求。阿里希望可以同用一套工具体系,解决所有故障场景问题,未来通过开源社区的力量完善实验场景,共同推进混沌工程领域的发展。


周洋强调,AHAS(阿里云应用高可用服务)是面向业务稳定性的云服务,这对企业而言非常重要。企业上云,并不仅仅是为了享受稳定的基础设施,也需要保证业务稳定性,而目前很少有厂商注意到这一点,AHAS 的出现不是为了拉动营收,而是帮助云上用户更好得搭建云原生系统。



目前,ChaosBlade 已经可用并处于快速演进阶段,团队大概每周都会发版,按照微服务、容器和云原生的路线迭代。近期,该项目会增强 JVM 演练场景;支持更多 Java 主流产品,比如 Redis,gRPC;增强 Kubernetes 演练场景以及对 C++、Node.js 等应用的支持。周洋透露,目前团队也希望更多志同道合的朋友加入,感兴趣的朋友可以通过 Github 平台了解该项目


2019-05-22 08:2018052
用户头像
赵钰莹 极客邦科技 总编辑

发布了 894 篇内容, 共 679.5 次阅读, 收获喜欢 2694 次。

关注

评论 9 条评论

发布
用户头像
太缺这种产品和技术理念了
2019-05-22 12:20
回复
希望有所助益
2019-05-22 14:07
回复
用户头像
感谢小编的整理,大家一起来探讨混沌工程的技术和实践。
杭州高可用专家/高级专家岗位 持续招聘中,有兴趣请联系:zhongting.zy@alibaba-inc.com
2019-05-22 10:29
回复
本尊现身,感兴趣的伙伴不要错过这一机会哈~
2019-05-22 10:56
回复
本尊太棒了啊,哈哈,热烈鼓掌
2019-05-22 14:08
回复
2019-05-22 15:47
回复
用户头像
太好了 这正是我所需要的
2019-05-22 08:58
回复
感谢反馈
2019-05-22 10:56
回复
用户头像
有几个关键问题希望文章已经解释清楚:混沌工程与故障注入、故障测试之间的关系,混沌工程与云之间的关系(并不是只有上云才会用到,但上云这个过程暴露出来的问题较多),混沌工程的实施方不单单是测试人员,有关阿里开源ChaosBlade的具体情况可以通过Github查看
2019-05-22 08:32
回复
没有更多了
发现更多内容

代码注释的艺术,优秀代码真的不需要注释吗?

阿里技术

代码注释

被 ChatGPT 点燃的向量数据库们

Bytebase

人工智能 数据库 openai AIGC ChatGPT

低代码为什么需要专业代码

牛刀专业低代码

如何选择合适的共享电动车厂商

共享电单车厂家

共享电动车厂家 共享电单车厂商 景区共享电单车 校园共享电动车 共享电动车生产

一顿饭的事儿,搞懂了Linux5种IO模型

Java你猿哥

Java Linux 后端 ssm io

KubeEdge在边缘计算领域的安全防护及洞察

华为云开发者联盟

开源 边缘计算 华为云 华为云开发者联盟 企业号 5 月 PK 榜

一站式统一返回值封装、异常处理、异常错误码解决方案—最强的Sping Boot接口优雅响应处理器 | 京东云技术团队

京东科技开发者

Spring Boot 处理器 企业号 5 月 PK 榜 Graceful Response web接口开发

学习java没规划?2023最新路线图,大堆资源秒变大神

Java你猿哥

Java 数据库 前端 后端 java基础

Istio权威指南,华为云云原生团队倾情巨献!

博文视点Broadview

发布会实录|悠易科技CTO李旸:洞察新引擎 品牌新增长

游读分享

面对职业焦虑,我们能做些什么?| 社区征文

三掌柜

三周年征文

项目终于用上了 DDD 领域驱动,太强了!

Java 架构 DDD

精品!阿里P8爆款《SpringBoot+vue全栈开发实战项目》笔记太香了

Java 架构 Spring Boot Vue 前后端分离

华为研究院19级研究员几年心得终成趣谈网络协议文档,附大牛讲解

Java 计算机网络 网络协议

ThottleStop 软件的应用场景

汪子熙

cpu intel 三周年连更

深入理解 MySQL 索引底层数据结构

Java你猿哥

Java MySQL 算法 ssm sql

精准测试之过程与实践 | 京东云技术团队

京东科技开发者

精准测试 质量保障 企业号 5 月 PK 榜

LinkFlow发布会实录|食品饮料品牌洞察应用实践分享

游读分享

mosn基于延迟负载均衡算法 -- 走得更快,期待走得更稳

Java你猿哥

Java 负载均衡 ssm 架构师

看火山引擎DataLeap如何做好电商治理(二):案例分析与解决方案

字节跳动数据平台

短视频 DataLeap 电商治理 达人治理 商品安全

面对本地缓存和分布式缓存,我们该如何选择?

美团太细了!HashMap可以存null,ConcurrentHashMap不可以为什么

Java你猿哥

Java hashmap ssm

主网NFT铸造交易商城dapp系统开发搭建

开发v-hkkf5566

鬼知道我经历什么,从Java外包到了阿里P7,没想到我也有今天

Java你猿哥

Java Spring Boot JVM java面试 Java八股文

HTAP for MySQL 在腾讯云数据库的演进

NineData

MySQL 腾讯云 NineData HTAP for MySQL 2023云数据库技术沙龙

行走的Offer收割机!首次公布Java10W字面经,Github访问量破百万

Java java面试 Java八股文 Java面试题 Java面试八股文

真香! GitHub大牛呕心沥血整理的5000页Java学习手册

Java你猿哥

Java MySQL redis Spring Boot java基础

技术领先、“忠”于业务,用友走出多维数据库的价值之路

用友BIP

数字人是否能成为企业智能化的门户?

Onegun

人工智能 数字人

最具有中国特色的微服务组件!阿里新一代SpringCloud学习指南

Java 架构 微服务 Spring Cloud spring cloud alibaba

真香!阿里P8微服务实战心得首次公开,涵盖架构设计所有知识点

Java你猿哥

Java 架构 微服务架构 架构设计 架构师

混沌工程的力量:阿里周洋亲述这一技术背后那些事儿_服务革新_赵钰莹_InfoQ精选文章