为了应对用户体验需求的日益增长、业务敏捷化的持续发展,金融行业分布式架构转型工作逐步深入。随之而来引入的DevOps工程、云原生和微服务治理等技术,在提升应用交付能力的同时,极大地增加了应用架构复杂度和系统潜在风险。混沌工程作为分布式系统稳定性保障的主流技术,近年来备受关注。混沌工程就是利用受控的经验导向实验提前探知系统潜在风险,通过优化架构和改进运维模式来解决该风险,真正实现韧性架构,降低损失,提高故障免疫力。浦发银行从2021年开始探索混沌工程核心理论,并在仿真环境完成了应用实践。通过混沌工程实施提前探知诸多风险,提升对系统稳定运行的信心。同时混沌理念随着实施范围的扩大,逐步深入人心,提升了研发过程中对系统可用性、容错性、可恢复性的关注程度。
上海浦东发展银行信息科技部(金科中心)副总经理张国栋
混沌工程的背景
1.混沌工程VS传统演练
为了提升系统的稳定性,在传统研发运维过程中会开展大量的健壮性测试或高可用演练,这些均是对系统已具备的特性的验证,有明确的目标及系统表现预期。而混沌工程更注重基于生产事件分析,将历史发生过的故障注入到未发生的系统中,探知系统会如何应对,通过不断实验,沉淀经验,指导系统架构优化,从源头推动系统稳定性建设,从而融入研发全流程,促使系统稳定性持续改进。因此,混沌工程其实是一项涉及检测、治理、提升的闭环工作。
2.混沌工程模式
混沌实验是混沌工程的核心关键,也是工程应用实践的最重要环节。混沌实验在创始公司Netflix被称为“GAMEDAY”,是一场开发、测试、运维等各个环节人员共同参与的“游戏”。混沌实验有定义系统稳态假设、在系统上模拟可能发生的故障(即故障注入)、观察发现潜在问题三个主要环节,可在开发自测、集成测试、投产运行等多个阶段开展。随着工程成熟度的提升,故障注入的模式由手工命令、工具注入、平台规模化编排、逐步向自动化演练转变。初期探索阶段,通过手工命令和工具注入方式可以快速地实践和了解混沌工程,并收集到一些基本的系统运行问题,累积实施经验。混沌工程推广阶段,则需要通过实验平台等工具建设来满足日益增长的实验复杂度和系统规模化增长。最后,“游戏”的模式逐步演化成红蓝对抗、生产突袭等。
浦发银行混沌工程实践
浦发银行的混沌工程实践主要涉及两大部分:作为关键的核心实验流程;人员培养、平台建设、技术指引等配套支持(见图1所示)。
图1 混沌工程实践要点
1.混沌实验流程
经过在分布式改造、系统上云、生产高可用演练等多项重大科技项目配套混沌工程实践路径的探索,浦发银行逐步形成了标准化的实施流程,涵盖团队组建、实验设计、实验执行、风险分析、优化验证等流程节点。
混沌工程是一项系统工程,每次实施前需要召集开发、测试、运维三方核心人员组建实施团队,并根据系统特性邀请相关技术专家参与。实验设计、实验执行、风险分析、架构优化则是一个持续的过程。通过实验故障注入得以观察系统的故障应对表现,总结相关的问题风险,完成架构优化或形成应急手册,并在后续实验过程中再次验证。
2.混沌实验设计
故障实验是整个混沌工程的核心部分。为了保障实验的有效性和完整性,设计时需从实验对象、故障场景、爆炸半径、预期表现等四个方面进行分析。
(1)实验对象:实验对象即被注入故障的关键节点。实验对象设计来源于对系统内部调用链路,上下游依赖与流转关键点的分析。通常系统的实验对象按功能分为应用、中间件、转发组件、转发硬件、数据库、公共组件、公共平台等。进行设计时,一般会预先设置单个或多个实验对象。为了强化实验的探索性,也可采用随机选择实验对象及故障的设计方法,形成更复杂的故障场景。
(2)故障场景:实验中故障场景主要来源于浦发银行混沌知识库。知识库是根据浦发银行现有技术栈情况,着力于历史发生故障记录及共性系统风险分析,逐步形成的基于容器、虚机、负载均衡设备等基础分类标准实验场景及对应执行策略的集合。知识库优先吸纳发生频率高,风险高的问题对应场景,并在后续实践中不断更新完善。知识库的建立一定程度上降低了后续场景设计的成本。需要注意的是,如果发现系统不具备应对某些故障的措施,那么在场景设计时不建议将这些故障点纳入实验,而应该考虑先期进行优化,以规避风险问题发生。
(3)爆炸半径:实验爆炸半径代表着故障对系统影响范围的控制。通过分析实验选择的业务交易链路及注入的故障,可以初步圈定会受影响的系统节点。实验爆炸半径定义的越准确,实验的受控程度和安全性越高。
(4)预期表现:预期表现是稳态假设的具体实现,通常是针对系统故障处理技术分析后,给出的故障注入后系统可能发生的行为。一般重点关注故障期间和故障销毁后的运行表现。通过设置量化的业务指标(如系统处理能力)、资源监控指标(如CPU使用率),定义具体处理措施表现,如前端显示兜底数据、系统警告日志等,实现预期表现的具体观测方案。
实验中通过模拟或导入相对稳定的业务流量压力,可以让故障注入后的预期指标偏离度更易观察及分析。实验数据分析时,将实际监测到的数据与预期表现(稳态假设)作比较,分析二者的偏差值后,就可以评估出系统故障应对措施的有效性以及故障影响范围。
3.混沌工程实施架构
混沌工程实施架构主要包括流量模拟平台、监控平台、故障注入平台、实验环境四个部分(如图2所示)。
图2 混沌工程实施架构
(1)流量模拟平台。以浦发银行性能测试一体化实施平台为基础,通过脚本录制回放等方式,产生业务流量,并通过分流网关引导至实验节点。在模拟的固定业务压力流量下,系统呈现相对稳定运行的状态,为后续实验创建理想的参照指标,并对业务数据指标进行详细汇总分析,供可视化监控平台取数。
(2)可视化监控平台。实验过程中实时可视化监控指标展示,有助于对问题及时进行定位,更好地分析出运行中的风险。监控平台环境部署了智能监控平台、日志分析平台、邮件报警系统,监控指标项覆盖了系统处理能力、交易响应时间等业务指标,服务器CPU、磁盘等基本资源使用率,容器资源使用情况,进程级别使用情况,JVM运行情况等。部分系统强化部署了日志分析平台及定制化的告警邮件,用于对抗演练中快速汇报问题。
(3)故障注入平台。浦发银行混沌工程平台,以支持工程化混沌工程实施为建设目标,平台主体含5个主要功能模块:故障注入、实验编排、实验检测、实验报告及平台管理。平台一期已具备X86服务器、容器等基础资源级、应用进程级、应用方法级等故障注入能力;能提供灵活的实验编排,支持组合式多故障注入,可演化出丰富的实验场景。通过平台的建设,混沌实验的注入操作步骤能够更加规范化,避免出现故障歧义导致不可控风险。未来二期建设将重点关注实验保护、外部流程平台对接等特性,进一步提升实验安全性,并着力于平台能力输出,将混沌工程以更规范、更便捷的方式融入研发工作各环节。
(4)实验环境。在业务连续性保障的要求下,银行对系统稳定性有着非常高的要求。混沌工程理念在于鼓励故障实践,意味着在越接近生产的环境中实施,探知的风险越真实。因此,建立贴近生产的仿真环境,对于开展混沌实验是一个较为合适的方案。为了保障对客互联网类系统能顺利承接各类业务获客、促活、引流等活动,浦发银行按照生产架构分步搭建了仿真环境,涉及30多个重要系统,覆盖多条关键业务链路,并配套部署了监控告警、日志分析系统。目前仿真环境承接了日常权益类业务活动、“双十一”支付等重要业务全链路性能测试以及保障工作。同时承担了这些重要系统及关键交易链路的混沌实验。
实验过程中,需要将实验环境拆分成2个对照组。对照组可以是完整的镜像环境,如2个互备集群,也可以是同一集群中的不同业务链路,如涉及微服务、虚机等有一定的交叉调用。镜像环境对照组用来比较在同等业务流量下,故障发生前后系统应对表现,如熔断、隔离等特性的实现情况。同一集群中的不同业务链路,用来观察业务间故障的隔离性,避免级联故障的发生。
总结与展望
混沌工程不仅是一项IT系统分布式转型下诞生新的技术,更是一门推进整个研发流程协同并进、实现成效优化内循环的工程化学科。通过混沌工程的实践,不仅能让未知的风险在发生前提前被暴露并优化;同时,也将研发流程上不同角色的工程师紧密联系在一起,共同思考如何实现系统稳定性。在混沌工程的收益显现后,技术架构团队总结的各种共性问题以及通用解决方案,可以让其他系统在建设以及故障排查过程中借鉴采纳,使得混沌工程融入整个研发流程。
目前浦发银行的混沌工程实践主要基于上云架构改造系统投产前韧性能力获取、系统高可用演练、特定问题分析、系统故障定位、对抗演练等目的开展。2022年已累计完成50多次实验,发现了系统故障期间熔断策略漏洞、公共组件异常后应用流量无法切换、演练步骤中部分预期外的节点影响等问题;总结并编撰了《混沌工程实施技术指引》,整理发布多期混沌工程实施理论与案例的宣贯文章;并通过流量平台、故障注入平台以及监控平台的建设,加强对于复杂故障场景的验证,逐步实现了标准化、工程化、规模化的混沌工程实施模式,有效提升系统稳定性。
为进一步提升混沌工程的应用成效,未来考虑从以下三方面推进混沌工程向纵深发展:第一,实验开展节点逐步前移至开发自测阶段,纳入DevOps流程,实现问题早发现、早排除。第二,针对混沌实验发现的问题,进一步提炼形成公共解决方案,建立从需求、开发、测试、运维等全流程信息共享的机制,从系统设计初期排除隐患。第三,针对目前问题分析大量依赖于人工的情况,考虑建设全链路跟踪平台、智能监控平台实现部分问题的自动验证对接,提高实验和分析的自动化程度,降低实施成本。
浦发银行通过实践混沌工程,形成了一套适配上云及分布式改造转型的技术指引和实施框架,并获取及解决部分系统隐患。未来将进一步研究和完善混沌工程实验技术,以期在更多领域发挥所长。