微信支付混沌工程实践

本文从业务角度介绍微信支付实践混沌工程落地的思考,通过多分区的架构来控制最小爆炸半径,在高价值的基础组件和微信支付核心业务场景上探索,并基于高可用原则、历史故障分析推导故障原子的开发,是一篇全面的混沌工程建设实践。
业务场景:微信支付服务于千万商户和亿级用户,可用性要求高于 5 个 9; 落地矛盾:注入故障需贴近实际故障环境,对现网业务无影响/弱影响; 实践难点:如何控制最小半径,如何高效、全面挖掘风险; 业务收益:发现多处组件和业务风险,从0到1建设起混沌工程系统; 未来展望:更丰富的故障原子;自动化;支持多类半径实验。

各类引发故障的因素,微信支付采取了相应的应对措施,如
功能/程序缺陷:单元测试,集成测试,UAT 测试,流量回放;
容量不足:常态化压测,自动弹性伸缩;
人为破坏(人因):去登陆 IDC,变更审核,权限控制,模块认证;
但对于软硬件故障,虽然基础组件会涉及一些容错处理,但设计是否全面、开发是否完全实现、真实场景是否有效,没有统一的工具和验收标准,并推动解决。
如何检验系统具备应对软硬件异常的容灾能力,我们调研了公司和业界的方法,其中演习和混沌工程最为常见和有效。它们都强调在线上实施,目的都是提高系统的可靠性和弹性,但方法和侧重点有所不同(区别两者概念和思路,对实际落地影响较大)。
1.2.1 演习
演习通常是有明确的执行计划和预期,要求注入故障的影响已知且明确。
更关注人的反应和应急响应计划,还包括非系统因素都在考量范围。比如验证某个系统失效后的,人为干预流程、机制是否顺畅等。
1.2.2 混沌工程
(公司和业界有非常多的关于混沌工程的概念介绍,如不了解可先自行搜索,不再赘述。)
混沌工程在目标上更强调发现未知的风险,更关注系统的弹性,不涉及系统外的因素。其中 Netflix 提出的混沌工程五大原则是业界落地实践的普遍共识:
建立稳定状态的假设;
用多样的现实世界事件做验证;
在生产环境中进行实验;
自动化实验以持续运行;
控制最小化爆炸半径。
其中多样化的事件和控制爆炸半径的方法,相对演习有明显差异。也正是控制了爆炸半径,混沌工程里注入故障的强度、复杂度远高于演习能力,能更全面、真实的模拟现网故障,以达到”发现未知风险“的目的。
此前,演习是微信支付容灾验证的重要手段,我们发现演习因为没有系统的爆炸半径控制方法,所以从工具开发、监控稳态识别、事件的多样性、自动化等方面,演习都需要较多的定制开发和人工实时观察,人力投入成本较高。
因此,引入混沌工程体系,通过有效的控制爆炸半径,进而更大幅度的注入异常并适当建设自动化能力,来识别系统薄弱点并推动持续治理来提高可用性,是当前值得探索的方向。
1.3 可行性
落地混沌工程有两大矛盾点:
故障有效,注入的故障贴近实际发生故障环境;
业务安全,注入故障对现网业务无影响或者影响较低。
为了贴近真实环境,注入故障离真实环境越近越有效,但这又势必影响业务可用性。且微信支付对可用性要求高,不接受不可预知的风险。如果没有解决业务安全问题,就引入混沌工程“探索未知风险”的期望就较难落地。
在2021年,微信商业支付做了多分区改造,将业务流量路由到不同分区,分区间相互独立、互不影响,分区间环境一致性通过 DevOps 部署保证。在分区隔离的 IDC 环境里注入故障,调配可控的流量,既能贴近生产环境,又能确保故障收敛、控制爆炸半径。这样,微信商户支付落地混沌工程已具备条件和可行性。

安全、有效的实验; 高效、全面的发掘风险。
“修改”类的故障加审批。避免写脏异常影响真实环境,由leader二次评估确认。 非资源负责人执行审批。如对他人模块实验(模块混部对母机实验校常见),避免无法发现其它业务异常。 非工作时间实验审批。避免实验异常,干预时间长。
实施的业务团队人力投入大:人工注入故障,人工观察、分析业务监控,以及监控偏离时是否影响业务、是否会扩散风险、是否有其他潜在风险; 工具团队不能做到有的放矢,不能将有效的人力投入到最有价值的原子开发上来。
单故障注入:18模块 * 15个故障原子 = 270个,即单原子无差别的注入次数; 2个组合空间为 C2270 = 36315,任一组合空间为2270。
模块内构成依赖关联影响(包括三园区容灾设计); 业务内模块间依赖关联影响; 业务间依赖关联影响; 基础设施间依赖关联影响; 潜在依赖关联影响。
业务资产:集群、模块、接口;集群是多个模块的总称,如某个存储集群包括接入模块、存储模块、元数据模块; 系统资源:业务资产执行所依赖的机器、容器、网络、CPU、磁盘、进程、文件、内存、共享内存等; 故障类型:针对每种系统资源的有多种故障,如机器包括机器重启、机器时间错误等,如网络包括慢、丢包、乱序等。 故障程度:除个别的像机器重启这类0-1类型故障,其它大多数涉及一定程度的故障,比如网络丢包30%,不同程度下的表现略有不同,一般将故障程度拆解成几档,如丢包有单机内10%、30%、50%、80%、100%,再组合多机情况。
标记资产类型,如标记为某类存储集群,则套用已设计过的实验模板库生成实验任务; 标记业务所适用的高可用原则,如单机/园区剔除能力、异常防御、分区切换、旁路冗余设计等,裁剪掉全展开的无效程度值,如单机剔除原则只容忍下游单机或单园区机器故障所以不生成多机故障,而做了旁路冗余设计的业务则容许旁路模块的所有机器故障所以生成单机故障的必要性就不大。
手动执行单个故障,主要解决0-1的问题,主要精力放在故障原子建设上; 单次批量执行多个故障,采用 yaml 文件记录编排方式,支持串行、并行调度。应用于业务首次实验和定位问题。 定时执行/事件触发执行,主要用于变更回归和可用性巡检场景,因为定时执行也依赖后续的“自动分析”,所以放在最后。
业务:业务用例维度监控是否触发告警。强优先级,触发后停止实验。 模块:上下游调用关系是否出现告警。中优先级,触发后不停止实验,展示在实验报告中。 IP/容器:机器和容器是否出现资源异常告警。中优先级,触发后不停止实验,展示在实验报告中。 业务自定义监控,上述无法自动覆盖的监控,由业务配置后自动收集。
个性问题:周知组件、业务负责人处理 共性问题,通过 SOA 治理、架构模式化、完善研发流程等手段来大规模消除,达成组织价值最大化。
存量:采用了 SOA 治理平台推动修复(SOA 治理是微信支付风险和异常项治理的平台,提供了统一的异常接入、展示、周知、跟进管理的指标数据,在部门内形成了统一的风险治理共识,以快速治理、收敛风险。混沌工程将发现的风险接入 SOA 治理平台,快速治理大面积的共性风险)。 新增:通过 MR 流水线门禁和变更门禁堵住新增,需处理后才能通过。


本文经授权转载「腾讯云开发者」,点击「阅读原文」直达原文。
