当前,业界主流的混沌工程项目基本只关注如何制造故障的问题,而经常做演练相关工作的工程师应该明白,每次演练时还会遇到以下痛点:
检测当前环境是否符合演练预设条件(演练准入);
业务流量是否满足(流量注入);
注入后判断故障效果是否符合预期(故障度量);
是否在预设时间内恢复了业务服务(恢复度量);
复盘分析总结风险点。
这也是蚂蚁集团内部混沌工程平台 XMonkey 在多年复杂故障演练场景中时常遇到的问题。
作为蚂蚁集团研发、测试、质量、SRE 等人员进行历史故障演练和挖掘系统潜在风险的重要平台,XMonkey 在公司级大规模红蓝攻防演练实践中沉淀了丰富且专业的方法论,在业界有极高的分享价值。基于经验共享与探讨的角度,XMonkey 的对外开源版本 ChaosMeta 在近日宣布正式开源。同时,ChaosMeta 也成为了 OceanBase 生态伙伴的新成员。
ChaosMeta 能做什么?
ChaosMeta 是一款面向云原生、自动化演练而设计的混沌工程平台,基于业界现状和攻防演练的常见痛点,结合蚂蚁集团在混沌工程领域的多年经验,提出了混沌工程生命周期模型(见图1)。该模型覆盖了“准入检测”“流量注入”“故障注入”“故障度量”“恢复度量”“注入恢复”等各个阶段的技术支撑,为自动化混沌工程提供技术依据。
图1 混沌工程生命周期模型
也就是说,ChaosMeta 提供了完整的混沌工程生命周期的一站式演练综合解决方案,助力用户快速挖掘业务应用和系统的潜在风险。除此之外,ChaosMeta 还内置了蚂蚁集团在技术风险领域多年沉淀的“风险目录”,这是一份对各技术领域的基础通用风险的汇总。
蚂蚁集团内部每年都会举行公司级大规模红蓝攻防演练活动,面向公司全体业务,并且也有不少业务进行 7X24 小时演练以及月度常态演练。
演练对象类型覆盖云产品、Kubernetes、Operator 应用、数据库( OceanBase、MySQL 等)、中间件(消息队列、分布式调度、配置中心等)、业务应用(交易系统、营销系统等)等。
以 OceanBase 的攻防演练为例,使用 ChaosMeta 对 OceanBase 集群的任意节点注入磁盘 I/O 夯的故障,其底层原理是通过使用 cgroup 的 blkio 子系统对 OBServer 进程进行 I/O 限制,考查 OceanBase 集群对磁盘 I/O 类故障的发现、定位、自愈的效率;还会随机对 OceanBase 集群中任意节点的 clog、ilog、slog 等日志目录的磁盘填满,考查能否快速定位哪个节点的哪个日志目录被填满并进行相应的应急处理。
对于每种类型的应用,都能抽象出一些比较通用的公共风险:
比如消息队列,会有消息堆积、消息丢失、消息顺序混乱、依赖方网络不稳定等风险;
比如交易系统,会有分布式事务、金额一致性、并发冲突等风险;
比如数据库,会有磁盘 I/O 故障、磁盘填满、节点间网络故障等风险。
“风险目录”是蚂蚁集团在大型金融互联网架构环境下,多年打磨、沉淀而来的一份“风险百科全书”,其中,开源界通用的风险,将会内置到 ChaosMeta 中,作为自动化混沌工程的理论依据。
大规模高频率的演练活动,推动了各种各样的故障注入能力建设。除了业界常见的系统资源故障、内核故障、网络故障、JVM 注入等,ChaosMeta 还提供了丰富的云原生故障注入能力。例如:
给 Kubernetes 集群堆积大量 pending 状态的 pod,拖垮调度系统;
给某个资源对象的创建流程注入动态校验 Webhook,延长校验时间,影响创建效率;
注入动态变更 Webhook 使特定字段变异;
建立大量 Watch&List 链接,加重 APIServer 回调 Operator 的负担等。
以混沌工程生命周期的平台能力为技术支撑,“风险目录”作为理论支撑,使 ChaosMeta 得以朝着自动化混沌工程演进。
ChaosMeta 是如何实现的?
ChaosMeta 的核心平台能力是基于 Operator 开发模式实现的,因此,其天然支持云原生。ChaosMeta 分为三层设计(见图2 ),详见官方文档,地址
https://chaosmeta.gitbook.io/chaosmeta-cn
图2 ChaosMeta 架构设计
最上层的用户层由 chaosmeta-platform 组件构成,其主要任务是降低用户的使用门槛,提供可视化界面,方便用户使用计划、编排、实验配置、实验记录详情等平台功能。
中间的引擎层包含了 ChaosMeta 的远程注入、编排、度量等核心平台能力以及部分云原生故障能力的实现。
作为底层的内核层,主要为单机故障注入能力的实现,包含了 chaosmetad 组件,提供了常驻 HTTP 服务的方式以及命令行执行的方式,还封装了对应的 daemonset 组件(chaosmeta-daemonset),可灵活搭配不同需求的演练平台。
ChaosMeta 的后续规划
ChaosMeta 的规划分为平台能力和故障注入能力两个主体路线,当前主要任务是把架构图中的主体能力都完成对外版改造,并进行开放。
另外,ChaosMeta 会继续加强与 OceanBase 社区的合作,支持 OceanBase 的故障演练能力。
ChaosMeta 平台能力的未来演进分为三大阶段。
第一阶段,人工配置。此阶段的目标是将架构图中的组件都对外开放,此时,即可支撑完整的混沌工程生命周期,进入初级自动化混沌工程领域,以“风险目录”作为理论参考,一次人工配置,多次自动执行。
第二阶段,自动化。此阶段下,“风险目录”会发挥更大的价值,它不仅能分析一类应用会有什么风险,作出风险评估,还会给出对应的预防以及应急建议。ChaosMeta 会将“风险目录”集成为通用组件的风险体检套餐,实现一键“体检”能力,用户输入目标应用信息后,得到风险评分以及风险分析报告。
第三阶段,智能化。探索结合人工智能的方向,自动生成更多未知的风险场景。
图3 仅为故障能力分类,具体提供的原子故障能力详见官方文档(欢迎提交 issue,提出新能力需求,需求较高的优先提供):
图3 故障能力分类
ChaosMeta 的内部版本 XMonkey 近几年持续支持 OceanBase 的常态攻防演练,达500+次,包含:磁盘 I/O 故障、磁盘填满(日志盘/数据盘)、节点间网络异常等场景,这些攻防演练经验将分享到 OceanBase 开源社区中。