BCM混沌平台的建设与落地实践 谷林涛资深开发工程师 谷林涛 Bilibili资深开发工程师 2021加入B站。 在职业生涯中,专注于稳定性平台的体系化、产品化工作。曾负责应急故障平台、变更管控、工单平台研发。 目前的主要工作是负责从0-1建设混沌平台,专注公司混沌技术平台落地,提升公司业务稳定性。 01B站混沌工程背景 目02从演练的生命周期说起 contents 录03混沌平台的架构设计与核心能力 04业务最佳实践 PART01 B站混沌工程背景 GOPS全球运维大会2024·深圳站 B站混沌工程背景 缘由故障频发 可用区切换不生效应用之间依赖不合理中间件异常扩大影响 驱动技术改造 多活能力改造强弱依赖梳理中间件降级策略 验证实战演练 模拟真实故障研发自驱执行常态演练保鲜 挑战演练痛点 演练工具多样演练成本高 演练安全性不可控 PART02 从演练的生命周期说起 演练后 常态化演练 待办跟进 日常演练 不符合跟进 二次验证 突袭演练 催办 演练的标准流程 演练前 业务梳理 业务场景录入验证方案确认影响面评估 方案确认 流量方案确认预案方案确认兜底方案确认 演练中 制定演练范围 配置演练流程 关联验证场景 执行演练 恢复演练 演练操作 环境 演练场景 预期影响 巡检执行 验证是否恢复 集群机器范围 指标观测防护范围 断言配置 演练验证 演练待办 预案执行 用户 稳定性负责人 测试 研发 SRE PART03 混沌平台的架构和核心能力 设计目标 降低用户成本,成为演练「专家」 赋能用户具备演练经验,帮助研发、测试、稳定性负责人、SRE等不同角色的人快速上手,支撑业务稳定性工作。 保障演练安全可控 监控和告警事件的快速介入,并支持紧急中止,控制爆炸半径,保障演练安全 提供标准的SOP规范流程 提供标准操作流程,闭环整个演练的生命周期,帮助用户完善演练前、中、后的关键事项。 提供常态化演练 常态化演练又分为定时调度和突袭演练,意在反复验证已经通过的演练是否会在业务迭代的生命周期中失效。 整体架构 丰富的演练场景标准的流程编排可靠的护栏观测完整的演练报告 核心能力 接入不同演练工具 市面上有很多开源的演练工具,公司内部测试团队也根据公司框架自研了演练工具。平台需要做到快速接入。 统一演练流程 制定标准的演练流程,并对用户透明,针对不同的故障,不同的攻击目标,都具有标 准的演练SOP。 降低用户门槛 演练工具主要重心在原生场景的原子实现,而业务更关心的是故障的实际场景,平台需要搭建桥梁,降低用户的使用成本。 常态化演练 在完整的完成过演练过程后,平台提供常态化演练能力,保障迭代过程中,演练依旧 能够通过验证。 标准的混沌协议 类型 字段名称 字段属性 描述 注册 实验UUID String UUID 实验描述 String 该实验的具体描述 事件名称 String 实验场景描述 实验对象 Enum 攻击对象类型:K8S,VM,Docker等 是否可恢复 Boolean 该实验场景是否可恢复 攻击参数描述Map<String,AttackDetail>攻击参数的描述 攻击方式 Enum 攻击使用的工具 执行 实验UUID String UUID 实验实例UUID String 表达本次实验的唯一值 实验范围 Map 表达攻击的范围,如某个容器,某个集群,某个主机 执行时长 Long 预计攻击执行时长 攻击参数 Map<String,String> 攻击参数描述 恢复 实验UUID String UUID 实验实例UUID String 实验实例UUID 查询 实验UUID String UUID 实验实例UUID String 实验实例的UUID 背景 调研开源社区背景,抽象演练协议,快速接入丰富的演练工具 痛点 演练工具黑屏操作,演练参数构造复杂,普通用户学习成本高 方案 基于业务制定演练场景,提供参数构造转化器,打通内部平台,实现参数转化。 行为协议 实验注入:完成一次攻击 实验撤销:撤销一次已注入的实验实验查询:查询某次实验的实验状态实验验证:验证实验注入是否成功 混沌平台能力设计 BCM平台 背景 通用转化器 场景转化器1 场景转化器2 …… …… Tool Tool Tool 混沌平台接口标准协议 混沌平台事件标准协议 攻击时长 攻击内容 攻击范围 混沌场景 混沌平台接口标准协议表达的更多是技术相关的底层参数,对演练同学来说,学习成本高,并且由于参数复杂,使用方式不正确会出现不符合预期的情况。因此需要有一个 “桥梁”,解决这个问题。 方案 基于平台的演练场景事件描述和混沌平台协议标准的不一致,完成信息转化。降低用户的使用成本。 标准的演练监控和护栏 背景 公司内部具有不同的监控平台,都需要统一接入混沌平台,支撑业务演练的防护护栏。 设计 标准化监控模型,并接入公司内部多种监控平台、告警平台和日志平台。通过对监控系统的抽象,平台能快速接入业务所需的多个异构的监控平台,并通过规则配置实现异构监控的指标计算,以此多重保障演练的安全,杜绝扩大爆炸半径。 PART04 业务最佳实践 混沌底层能力——基于ChaosBlade实践 背景 ChaosBlade能满足我们业务的大部分演练诉求,但是在演练过程中发现如下问题: 1.观测性问题——ChaosBlade和ChaosBlade -operator及其他几个module的日志没有统一接入,在业务排查问题的时候,由于缺乏日志导致无法解决。 2.注入逻辑问题——比如在实战过程中,DNS干扰的演练无法正常恢复;网络不可用命令超长不符合预期;CPULoad注入不符合预期;网络问题恢复不符合预期 3.没有相关的鉴权,也没有业务监控 解决方案 根据开源改造,自建BCM-Engine,由BCM-Agent和BCM-Blade组成,解决上述问题 参数 类型 destination-ip String Interface String remote-port String …… …… 原生networklossdrop场景 业务演练场景 背景 最佳实践——跨可用区断网验证 公司内部多活改造业务持续推进,但缺乏验证手段,需要混沌平台承载验证能力。 设计 参数 类型 zone []string white-ip []string ignore-mw []enum …… …… 通过公司内网络资源对接,可以获取可用区的IP网断,并打通公司缓存平台,数据库平台的数据元信息,提供白名单的能力配置,使用ChaosBlade的网络不可用的原子场景,提供能力。 结果 实现公司内部平台的跨可用区断网演练20+,发现50+不符合预期的业务问题,持续推进该场景的演练验证。 跨机房不可用阻断 混沌底层能力——基于网络不可用的实践 容器资源 缓存信息 主机资源 网络信息 数据库不可用 数据库信息 服务发现信息 NetworkDelay NetworkLoss NetworkDNS ChaosBlade 背景 实验巡检 依赖不可用 各种故障模拟场景都是可以基于网络不可用,但网络元信息数据获取以及攻击参数如何构建对普通用户来说具有一定成本和困难。并且Chaos网络不可用有一些“潜规则”,和每个用户沟通成本比较高。 演练探活 方案 兜底保障 打通公司内部平台,集中元信息。并验证ChaosBlade场景的注入是否符合预期,降低业务的使用成本,复用平台能力 模拟拨测 结果 阻断:数据库、缓存、应用依赖、域名、可用区形式:不可用、延迟(包含抖动) 一次演练流程 演练面板 演练报告 故障场景配置 演练报告 业务演练数据 场景 跨可用区断网验证;缓存不可用;缓存延迟;数据库不可用; 数据延迟;域名不可用;依赖不可用,依赖延迟等业务场景 完善场景 20+个 完成演练 200+次 问题 覆盖应用 30+个 发现问题 50+个 验证出代码边界问题,发现数据库配置错误导致的切流异常,缓存超时不可用导致的业务异常,跨可用区不合理的依赖导致业务无法正常降级以及在历史工程中弱依赖影响了主流程等各种问题。 上线两个月业务数据 业务 完成业务演练,发现业务、架构、中间件不符合预期的问题, 推进业务方持续迭代跟进。 Thanks 高效运维社区DevOps时代 荣誉出品 THANKS 感谢大家观看