共计 6652 个字符,预计需要花费 17 分钟才能阅读完成。
这是一篇较为具体的混沌工程调研报告,蕴含了背景,现状,京东混沌工程实际,心愿帮忙大家更好的理解到混沌工程技术,通过混沌工程试验,更好的为零碎保驾护航。
一、概述
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 混沌工程工具汇总
工具名称 | 最新版本 | 外围语言 | 蕴含场景 | 特定依赖 |
---|---|---|---|---|
ChaosBlade | 1.7.0 | Go | 试验框架,支持系统资源、网络、利用层面等多种故障的注入 | 无特定依赖 |
ChaosMesh | 2.3.1 | Go | 试验框架,支持系统资源、网络、利用层面等多种故障的注入 | 依赖于 K8s 集群 |
ChaosToolkit | 1.12.0 | Python | 试验框架,可集成多个 IaaS 或 PaaS 平 台,可应用多个故障注入工具定制场景,可与多个监控平台单干观测和记录指标信息 | 通过插件模式反对多个 IaaS、PaaS,包含 AWS/Azure/Goog le/K8s |
orchestrator | 3.2.6 | Go | 纯 MySQL 集群故障场景 | 无特定依赖 |
powerfulseal | 3.3.0 | Python | 终止 K8s、Pods,终止容器,终止虚拟机 | 反对 OpenStack/AWS/ 本地机器 |
toxiproxy | 2.5.0 | Go | 网络代理故障,网络故障 | 无特定依赖 |
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
作者:京东批发 贾安
起源:京东云开发者社区