主动发现系统稳定性缺陷:混沌工程 | 京东云技术团队

news2025/4/12 9:47:55

这是一篇较为详细的混沌工程调研报告,包含了背景,现状,京东混沌工程实践,希望帮助大家更好的了解到混沌工程技术,通过混沌工程实验,更好的为系统保驾护航。

一、概述

1.1 研究背景

Netflix公司最早系统化地提出了混沌工程的概念。2008年8月,Netflix公司由于数据库发生故障,导致了三天时间的停机,使得DVD在线租赁业务中断,造成了巨大的经济损失。于是Netflix公司开始尝试利用混沌工程优化稳定性保障体系。2010年,Netflix公司开发了混沌工程程序Chaos Monkey,于2012年在Simain Army项目中开源,该程序的主要功能是随机终止在生产环境中运行的虚拟机实例和容器,模拟系统基础设施遭到破坏的场景,从而检验系统服务的健壮性。2019年,阿里巴巴开源了ChaosBlade混沌工程程序,该程序可以结合阿里云进行混沌工程实验。2020年,PingCap 作为国内优秀的数据库领域开源公司,开源了其公司内部的混沌工程实践平台ChaosMesh。

基于以上开源项目,混沌工程项目在国内受到了多家公司的关注,越来越多的公司开始引入混沌工程进行系统稳定性保障工作,通过混沌工程主动注入故障的方式,避免软件系统带来的未知危机。图1.1展示了软件系统稳定性危机与对策发展时间线的对应关系,可以发现,随着软件系统规模的扩大,系统复杂度的增长及开发周期缩短,陆续爆发了多次软件危机,同时,每次的软件危机都促进了软件系统稳定性保障措施的不断完善。而当下的软件系统的规模,复杂度和开发敏捷程度再次迈入了一个新的阶段,导致系统的稳定性面临着新的挑战。此时,主动发现系统稳定性缺陷的混沌工程应运而生,再次弥补了当下系统稳定性保障方式的短板。

图1.1 软件系统稳定性危机和对策发展时间线图 [来源:中国信息通信研究院]

1.2 研究目的

塔勒布曾经在《反脆弱》一书中阐述了“系统如何在不确定性中获益”的思想,混沌工程基于这一伟大思想,提倡使用一系列实验来真实地验证系统在各类故障场景下的表现,通过频繁地进行大量实验,使得系统本身的反脆弱性持续增强。每一次故障中的获益,让系统不断进化,形成正向循环,逐步提高系统的质量,保证系统的健壮性。因此,混沌工程研究的首要目的就是主动发现系统的稳定性缺陷。表1-1列举了近几年比较严重的几个系统稳定性故障事件,从侧面反映了系统稳定性保障的重要性。

表1-1 系统稳定性故障事件

公司名称发生时间持续时长影响范围故障原因
哔哩哔哩2021年7月约1小时影响了视频播放、直播等多个核心服务机房故障,灾备系统失效
滴滴2021年2月约1小时滴滴打车APP系统内部错误
谷歌2020年12月约1小时谷歌旗下多个业务存储超出限额
亚马逊2020年11月约5小时部分服务器无法访问不当的运维操作触发了系统漏洞
微软2020年9月约5小时Microsoft Office 36办公软件和Azure云产品流量激增导致服务中断

当混沌工程成为常态化的系统稳定性的保障手段后,系统的整体稳定性将得到进一步提升。通过混沌工程平台,主动向系统注入故障,验证和评估系统抵抗故障并保持正常运行的能力,提前识别未知的缺陷并进行修复,保障系统更好得抵御生产环境中的失控条件,有效提升系统的整体稳定性。

1.3 研究意义

混沌工程的主要研究意义在于提高系统的稳定性,通过主动向系统中注入故障的方式,研究和提高系统的健壮性,在一定程度上弥补了系统发生故障时被动响应的短板,降低了系统应对故障的风险和成本。表1-2列举了使用混沌工程前后的系统稳定性保障方式的对比,可以发现,使用混沌工程后,系统稳定性的保障方式更加出色。

表1-2 使用混沌工程前后的系统稳定性保障方式对比

对比内容使用混沌工程前使用混沌工程后
发现缺陷的方式线上缺陷发生时才开始识别主动注入故障发现系统缺陷
应对缺陷的方式被动响应,缺陷应对的开始时间取决于故障何时发生主动响应,缺陷应对的开始时间取决于混沌工程的实验时间
识别缺陷的效率较低,对于触发条件苛刻的潜在缺陷可能需要很长时间较高,通过主动注入故障,使得潜在缺陷尽快暴露
响应缺陷的成本可控性较差可控性良好

另外,实践混沌工程对不同职位的工作人员也有着各自的意义。如表1-3所示,混沌工程有助于帮助系统相关人员发现潜在的脆弱点,降低系统稳定性缺陷可能造成的损失。同时,通过混沌工程注入故障,可以有效锻炼团队发现和定位问题并快速恢复系统的能力。

表1-3 实践混沌工程对不同职位的意义

职位实践混沌工程的意义
软件开发工程师进一步加深对系统的理解,验证系统架构的容错能力
测试开发工程师弥补传统测试方法留下的空白,更主动的方式发现系统的问题
运维开发工程师提高系统故障的应急效率,实现故障告警、定位、恢复的有效应对
产品经理了解产品在突发情况下的表现,提升客户在突发情况下的产品使用体验

1.4 研究方法

图1.2 混沌工程实践体系和软件开发一般流程联系图 [来源:中国信息通信研究院]

根据调研的混沌工程实践经验,混沌工程的研发方法可以概括为图1.2中的混沌工程实践体系。其中,混沌工程实践配套是混沌工程成功实践的关键,因此要求实践团队做好混沌工程实践的战略规划,培养混沌工程实践相关人员,形成混沌工程文化,识别应对潜在的风险并对混沌工程实践做出有效的评估。在此基础上,混沌工程实验是混沌工程研究的核心工作,即混沌工程以实验为最小单元研究发现系统的稳定性缺陷,实验的一般流程是:实验设计、实验实施和结果分析。具体内容一般包括:实验需求和对象、实验可行性评估、观测指标设计、实验场景环境设计、实验工具平台框架选择、实验计划和沟通、实验执行及指标收集、环境清理与恢复、实验结果分析、问题追踪、自动化持续进行验证。当通过混沌工程发现了系统稳定性缺陷时,需要根据实际情况给出对应的解决方案,如果存在架构的缺陷,则需针对性得采用韧性设计对稳定性缺陷进行改进,其他如边界条件和极端情况未考虑或者编码错误的缺陷,若占比较高且反复出现,则需要评估是否需要在制度规范上对软件开发过程进行更好的管控。

关于更加具体理的论和混沌工程的一般实验步骤,可以从该书《混沌工程:Netflix系统稳定性之道》中获取到,电子版书籍见本报告附录。该书对混沌工程进行了非常详细的阐述,图1.3为该书的目录结构。

图1.3 《混沌工程:Netflix系统稳定性之道》目录

二、研究现状

2.1 业界混沌工程工具

目前业界使用的混沌工程工具的种类很多,表2-1汇总了本次调研中发现的业内保持维护更新的几个工具,不同工具侧重于不同种类的故障注入。

表2-1 混沌工程工具汇总

工具名称最新版本核心语言包含场景特定依赖
ChaosBlade1.7.0Go实验框架,支持系统资源、网络、应用层面等多种故障的注入无特定依赖
ChaosMesh2.3.1Go实验框架,支持系统资源、网络、应用层面等多种故障的注入依赖于K8s集群
ChaosToolkit1.12.0Python实验框架,可集成多个IaaS或PaaS平 台,可使用多个故障注入工具定制场景, 可与多个监控平台合作观测和记录指标信息通过插件形式支持多个IaaS、PaaS,包括 AWS/Azure/Goog le/K8s
orchestrator3.2.6Go纯MySQL集群故障场景无特定依赖
powerfulseal3.3.0Python终止 K8s、Pods,终止容器,终止虚拟机支持 OpenStack/AWS/ 本地机器
toxiproxy2.5.0Go网络代理故障,网络故障无特定依赖

2.2 业界混沌工程实践平台

业内的混沌工程平台一般由:用户界面、任务调度模块、故障注入、监控告警系统四个部分组成。

用户界面: 为实验平台提供混沌工程实验任务的编排和配置服务,使得用户方便管理各类混沌工程实验任务。当混沌工程实验开始后,用户可以通过任务进度条、服务器指标等展示图实时的查看实验进度和系统指标情况。当混沌工程实验结束后,用户可以看到最后的混沌工程实验报告。

任务调度模块: 该模块负责用户界面和故障注入之间的交互,核心功能是实现混沌工程任务的批量下发和调度。

故障注入: 故障注入负责接收任务调度模块下发的故障注入任务,实现相应的故障注入事件,并反馈故障注入任务的执行状态。

监控告警系统: 该系统负责记录和管理系统产生的所有数据,生成告警和相关统计并反馈给用户。

2.3 混沌工程实践能力评估

混沌工程实践能力的评估可以帮助团队更好地了解混沌工程实践的状况,表2-2列举了混沌工程实验成熟度的等级,该等级可以用来评估当前系统进行混沌工程实践的能力,主要反映执行混沌工程实践的可行性、有效性和安全性,等级越高则说明可实践混沌工程的能力越强。

表2-2 混沌工程实验成熟度等级

三、京东混沌工程实践

泰山混沌工程平台是基于业界成熟解决方案ChaosBlade并结合京东业务特色设计并落地实现的一款自助式故障演练平台。用户可根据自身服务特点有针对性的场景编排、故障注入,对服务容灾能力进行评估,通过实验探究的方式建立对系统行为重新的认知理解。推动建立混沌文化,通过主动探索的方式发现系统中潜在的、可以导致灾难的、让我们的客户受损的脆弱环节,消灭它们,让我们的系统更加健壮有韧性。

图3.1展示了泰山混沌工程演练的流程图,基于泰山混沌平台,红方的任务是:

(1)创建演练计划:通过访问泰山平台,进入路径:安全生产-混沌工程页面,页面提供“创建演练计划”按钮,点击即可进入演练配置页面。

(2)演练配置:点击创建演练计划按钮后,进入演练配置页面,可录入演练基本信息及任务配置项(演练配置-应用相关(类型、方式、场景)、演练配置-执行相关),图3.1中红色字体为本次演练重点配置项。

(3)执行演练:演练任务创建保存后,生成一条待执行的演练任务,手工点击执行按钮执行演练。

蓝方的任务是:

(1)故障排查:在演练执行中,蓝方通过报警信息,先下掉报警机器,进行排查。

(2)恢复方案:演练中发现问题要及时恢复,演练后要重启恢复演练机器,确保机器正常运行

实验完成后需要进行演练复盘,即对演练中发现问题总结及分析,确保不再出现类似风险问题。

图3.1 泰山混沌工程演练流程图【来源:全渠道混沌工程实践文章】

3.1 核心能力

平台的核心能力可以用四化一灵活概括,即:

一、自动化:演练过程全程自动调度、插件部署、故障注入、现场恢复。

二、可视化:演练期间,可实时观测MDC指标变化、UMP业务监控指标变化以及故障注入进度等。

三、精准化:可通过指定IP、分组、机房、网络POD,针对演练影响范围进行明确限制,演练效果更贴合实际场景。

四、规模化:平台设计目标支持单任务1000+演练目标、多演练任务同时调度的能力,为集团范围内各种预案演练、攻防演练、常态化混沌测试提供强有力的支持。

五、灵活控制:在演练过程中可灵活进行取消、终止、全部终止等操作;针对故障场景可多维度进行配置提调整;演练时长、调度方式执行时可调整。

3.2 支持故障注入类型

泰山混沌工程实验平台支持丰富的混沌场景能力,表3-1列举了平台支持的基础资源类故障场景,主要验证基础资源或者业务监控告警的及时性、有效性(干预手段),从而优化资源规格、部署规模和跨机房部署,同时希望增加进程存活、URL存活的监控。表3-2列举了平台支持的JAVA进程故障和中间件依赖故障场景,主要验证业务、JVM监控告警的及时性、有效性(干预手段),从而调整JVM参数、使用合理垃圾回收器等,同时调整中间件集群配置、治理降级方案、优化缓存策略等,通过演练也可以进一步理解系统架构,梳理强弱依赖、治理服务性能和评估下游服务能力。

表3-1 基础资源类故障场景

混沌场景演练目的实现原理
CPU高负载关注对业务处理吞吐率的影响消耗CPU时间片
内存占用-采用代码申请内存实现
磁盘IO高负载评估对磁盘读写敏感的业务的影响使用dd命令实现
磁盘填充主要验证如日志目录打满对服务的影响使用fallocate、dd命令实现
网络延迟评估业务对网络延迟的容忍程度,评估超时、重试机制设置是否合理,防止级联事故使用tc命令实现
网络丢包评估业务对网络丢包的容忍程度使用tc命令实现
进程假死观测负载均衡时效性、业务敏感性kill -STOP {pids}
进程终止观测负载均衡时效性、业务敏感性(Nginx&Tomcat)kill -9 {pids}

表3-2 JAVA进程故障和中间件依赖故障场景

类型混沌场景演练目的
JAVA进程故障进程CPU满载评估服务节点CPU满载时对服务的影响
内存溢出评估GC对服务的影响
接口延迟评估接口故障对整体SLA的影响
接口抛异常评估接口故障对整体SLA的影响
接口返回值篡改评估针对非预期接口返回的处理
线程池打满评估线程池打满对服务的影响
中间件依赖故障JSF请求延迟评估中间件故障对自身的影响
JSF请求抛异常评估中间件故障对自身的影响
JIMDB请求延迟评估中间件故障对自身的影响
JIMDB请求抛异常评估中间件故障对自身的影响
MYSQL请求延迟评估中间件故障对自身的影响
MYSQL请求抛异常评估中间件故障对自身的影响

表3-3汇总了泰山混沌实验平台的故障使用统计表,从使用情况上可以看出,目前基础资源类故障场景使用居多。图3.2更加直观的展示出泰山混沌工程实践平台的故障使用类型为基础资源类故障。

表3-3 泰山混沌工程实验平台故障类型使用统计表

故障类型演练占比
网络故障31%
内存耗尽13%
CPU打满23%
磁盘故障9%
进程异常3.5%
Java进程故障6.5%
外部依赖故障14%

3.3 常见问题

通过调研泰山混沌工程的实践,可以汇总一些常见问题如下:

(1)报警未配置(MDC、UMP、存活);

(2)报警阈值不合理、间隔时长不合理、联系人缺失、联系人授权不足;

(3)进程假死未报警,需配置URL存活报警;

(4)暂停了告警,未及时开启;

(5)值班人员对预案处理不熟练,内部系统工具使用不熟练(加强内部培训);

(6)群组内反馈问题后,未有相关同事进行处理,职责分工不明确;

(7)内部工具设计不合理,无法应对不同场景(比如:多机房分组出异常);

(8)忽视偶发问题,后期范围扩大不易处理(比如:低版本Linux内核处理)。

四、总结和思考

4.1 调研总结和思考

本次调研涵盖了混沌工程的起源,发展,以及在京东的落地情况。通过研究,我进一步体会到:(1)混沌工程最先进的,是它大胆超前的思维理念和安全受控的方法论。(2)故障注入只是手段,而不是混沌工程的全部。场景再多,也不代表韧性就够好。(3)如果只是根据稳态假说,写测试用例,然后再使用故障注入工具进行试验,最后结果验证,这只能算是混沌工程最基本的内容。(4)混沌工程的使命是探索问题,而不仅仅是验证问题。总体而言,混沌工程的核心就是增强系统信心,保证系统在某个场景下的能力不退化。

4.2 混沌工程未来发展

混沌工程的目标是主动发现问题,因此,未来依然离不开这个核心目标,但是在未来,可以使得这个目标更加智能化的实现。通过调研发现,业界中部分企业已经开始探索将混沌工程和人工智能、机器学习等领域相结合,通过注入故障时系统指标的变化和定位的历史数据进行相关模型的训练,使得模型可以通过指标变化自动识别故障,这将有助于解决混沌工程在结果分析和故障恢复环节的自动化问题。其次,当下的混沌工程演练平台的交互性和可视化等能力在未来可以做到更好。此外,混沌工程的量化指标也需要进一步完善。

参考文献

1.ChaosMesh https://github.com/chaos-mesh/chaos-mesh

2.ChaosBlade https://github.com/chaosblade-io/chaosblade

3.ChaosToolkit https://github.com/chaostoolkit/chaostoolkit

4.orchestrator https://github.com/openark/orchestrator

5.powerfulseal https://github.com/powerfulseal/powerfulseal

6.toxiproxy https://github.com/Shopify/toxiproxy

7.混沌工程深度实战专场 https://live.juejin.cn/4354/xdc2021-01

作者:京东零售 贾安

来源:京东云开发者社区

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

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

相关文章

SpringBoot自动配置的模版引擎

文章目录 目录 一、Thymeleaf 1.什么是Thymeleaf? 2.什么是模版引擎? 3.JAVA中的SPI(Service Provider interface)机制? 4.META-INF目录是干嘛用的? 总结 前言 一、Thymeleaf 1.什么是Thymeleaf? hymeleaf是试用于Web和独立环境的现代服务器端Java模版引擎 目的:…

使用Photoshop证件照制作

利用Photoshop从普通照片制作出证件照 先取一张普通照片 首先新建一个证件照的图片 分辨率350dpi尺寸大小26mm32mm像素大小358像素(宽)441像素 颜色模式24位RGB真彩色 1,抠图,用魔棒工具三秒钟搞定,如果不太复杂的图像…

USB EHCI知识点

1 EHCI和Companion UHCI端口切换 1.1 ICH6 EHCI 如果PCI控制器包括了伴随控制器,那么USB 2.0 HC(Host Controller)必须作为一个多功能PCI设备使用。伴随HC的功能码必须小于EHCI HC功能码。如果一个 PCI设备仅仅包括一个EHCI控制器&#xff08…

一站式完成车牌识别任务:从模型优化到端侧部署

交通领域的应用智能化不断往纵深发展,其中最为成熟的车牌识别早已融入人们的日常生活之中,在高速公路电子收费系统、停车场等场景中随处可见。一些企业在具体业务中倾向采用开源方案降低研发成本,但现有公开的方案中少有完成端到端的车牌应用…

Blindly Assess Image Quality in the Wild Guided by ASelf-Adaptive Hyper Network

Abstract 真实失真图像的盲图像质量评估(BIQA)一直是一个具有挑战性的问题,因为在野外采集的图像包含各种各样的内容和各种类型的失真。目前绝大多数的BIQA方法都专注于如何预测合成图像的质量,但当应用于真实世界的失真图像时却失败了。为了应对这一挑…

Android Activity和Fragment的对比

参考来源 参考来源 参考来源 状态方法对比 onAttach() 作用:fragment已经关联到activity,这个时候 activity已经传进来了, 获得activity的传递的值 就可以进行 与activity的通信里, 当然也可以使用getActivity(),前提是这个fragm…

在CSDN逮到一个阿里10年老测试,聊过之后收益良多...

老话说的好,这人呐,一但在某个领域鲜有敌手了,就会闲得蛋疼。 前几天我在上班摸鱼刷CSDN的时候认识了一位阿里测试大佬,在阿里工作了10年,因为本人天赋比较高,平时工作也兢兢业业,现在企业内有…

ChatGPT - 基于 ChatGLM-6B 搭建私有 ChatGPT 在线聊天服务

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/131104546 Paper:GLM: General Language Model Pretraining with Autoregressive Blank Infilling 一篇于2022年发表在ACL会…

平面坐标变换(单应性变换/Homography变换)

单应性(homography)变换用来描述物体在两个平面之间的转换关系,可以用于描述平移、翻转、缩放、旋转、仿射变换等。其是对应齐次坐标下的线性变换,可以通过矩阵表示: 其中,H为单应性变换矩阵,假设变换前坐标为(x,y)&am…

指针--按值调用与模拟按引用调用,非法访问内存

在前面的章节介绍过普通变量作函数参数的方法&#xff0c;它其实是一种按值调用&#xff08;Call by Value&#xff09;的方法&#xff0c;即程序将函数调用语句中的实参的一份副本传给函数的形参。 例题&#xff1a;演示程序按值调用的例子。 #include <stdio.h> void…

关于ASO优化的搜索指数

搜索指数指数可以看出该关键词的热度&#xff0c;每一个关键词都对应着相应的指数&#xff0c;它代表着有多少人在搜索这个词。同一个词搜索的人越多&#xff0c;该关键词的热度指数就越高。 在应用商店内每天都会有用户去搜索应用&#xff0c;那么关键词的热度值至少是100。热…

三分钟免费将 Claude API 接入个人服务

首先我们介绍一下今天的主角 Claude Claude 是最近新开放的一款 AI 聊天机器人&#xff0c;是世界上最大的语言模型之一&#xff0c;比之前的一些模型如 GPT-3 要强大得多&#xff0c;因此 Claude 被认为是 ChatGPT 最有力的竞争对手。Claude 的研发公司是专注人工智能安全和研…

干货|SpringCloud-Eureka注册中心、服务提供者与消费者

内容速览&#xff1a; 一、关于注册中心、服务注册、服务发现 1问&#xff1a;为什么需要注册中心&#xff1f;2问&#xff1a;什么是服务注册&#xff1f;3问&#xff1a;什么是服务发现&#xff1f; 二、关于 Eureka 实现服务注册与服务发现 1.Eureka的特点2.Eureka注册中心…

Linux防火墙学习笔记3

iptables链的概念&#xff1a; 当客户端访问服务器端的Web服务的时候&#xff0c;客户端发送请求报文到网卡&#xff0c;而TCP/IP协议栈是属于内核的一部分。客户端的请求报文会通过内核的TCP协议传输到用户空间的Web服务&#xff0c;而客户端报文的目的地址为Web服务器所监听的…

裸辞后,过于真实...

前言 我从事软件测试行业&#xff0c;我仅从个人体验上说一下裸辞一个月的心路历程。 本人从事软件测试行业9年&#xff0c;主流测试软件都会用&#xff0c;功能&#xff0c;性能&#xff0c;接口&#xff0c;自动化测试都能独立搞定&#xff0c;近5年测试管理经验。年龄31岁…

城市内涝的原因及解决措施

城市内涝是城市面临的一个严重问题&#xff0c;它不仅会影响城市的交通、生产和生活&#xff0c;还会对城市的环境和生态造成破坏。 城市内涝是指由于强降水或连续性降水超过城市排水能力致使城市内产生积水灾害的现象。造成内涝的客观原因是降雨强度大&#xff0c;范围集中。…

Stable Diffusion使用入门教程

本文参考bilibili的链接&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 目录 一、prompt提示词 1、概况 2、prompt分类 3、提示词的权重分配 4、…

使用 ChatGPT(简单)+ GitHub 存储库创建 C# 聊天机器人

在本指南中&#xff0c;我们将深入探讨使用 ChatGPT 和 C# 构建聊天机器人的过程。我们将涵盖从设置 ChatGPT API 访问到部署聊天机器人的所有内容。让我们开始吧&#xff01; 最后你会发现 GitHub Repo 设置您的 ChatGPT API 访问权限 在我们开始构建我们的聊天机器人之前&…

day4 ARM异常处理

目录 异常 概念 处理机制 ARM异常源 ARM异常模式 ARM异常响应 异常向量表 FIQ和IRQ ARM微架构 指令流水线 多核处理器 异常 概念 处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生这时处理器就要将当前的程序暂停下来转而去处理这个异常的时间异常事件处…

为什么CRM一定要走行业化?

很多企业、很多销售对CRM的负面评价集中在不够贴合行业、不人性化&#xff0c;也就是功能不够细分和实用。因为CRM几乎是所有企业管理系统中最贴近业务实际的&#xff0c;但各行各业的业务千差万别&#xff0c;所以功能完备、使用满意度高的CRM一定是深度行业化、与不同行业业务…