当前位置: 首页 > 科技观察

混沌工程:苏宁系统稳定之道

时间:2023-03-20 17:00:12 科技观察

【.com原稿】随着苏宁多机房的成功部署,流量分流大大缓解了主机房的流量压力。图片来自Pexels,但存在规划不合理、硬件设备老化、主机房基础设施不完善等因素,短期内无法彻底解决。这些“达摩克利斯之剑”一直悬在苏宁IT人的心头。如果主机房宕机,是否可以整体切换到备用机房?能否快速恢复业务?没有人给出肯定的回答,因为没有人实践过。既然大家没有实践过,最好的办法就是在生产中有一个真正的机房宕机。经过技术调研和评估,我们选择了混沌工程,通过系统的实验,实现了整个机房的停机演练。什么是混沌工程让我们先来了解一下什么是混沌工程。ChaosEngineering最早由Netflix于《chaos engineering》提出,是一门新兴的技术学科。根据Netflix的定义,混沌工程是在分布式系统上进行实验的学科,目的是建立对系统在生产环境中承受失控条件的能力的信心。我们将其与我们熟悉的故障注入测试进行比较。首先,它们有很多重叠之处。它们都是通过制造某种“故障”来测试系统的反馈。其次,它们也有明显的区别。①实现形式:故障注入测试属于测试领域的范畴,主要针对场景的特定方法。混沌工程是一门实验学科,是一种以各种方式探索复制系统不良行为的系统实践。②实现方法:故障注入测试主要针对错误或故障,如接口失效、通信超时等破坏性行为。至于资源抢占、流量暴增、拜占庭式故障这些严格意义上不能称之为错误的事情,我们无能为力。混沌工程对探索这些弱错误或影响级别非常感兴趣。③执行结果:故障测试可以断言结果,给定特定的条件,系统会发出特定的输出。测试通常是二元的,并确定一个属性是真还是假,它不会产生关于系统的新知识,它只是将价分配给它的已知属性。另一方面,混沌工程无法预测结果,而是通过实验产生新知识。混沌工程是一种探索系统新知识的实验形式。这也是混沌工程作为一门实验学科的重要使命。简而言之,混沌工程是一门探索新知识的实验学科。为什么说混沌工程全机房宕机实践具有以下特点:系统性,包括网络、主机、进程等,是涉及基础设施和应用系统层面的综合性实验项目。不可预测性,过程中发现的一些问题是不可预测的。有序性,过程必须有序可控,这是对生产演练的基本要求。这些活动特性与混沌工程的理念高度契合,这也是我们选择混沌工程的主要原因。通过设计和进行混沌实验,我们了解系统脆弱的一面,我们可以在它们对用户造成伤害之前主动发现它们。问题。根据混沌工程的原理,它的实现是有先决条件的。结合实施条件和苏宁的现状,我们评估了以下测试条件:系统的弹性和健壮性是否满足要求。系统的监控能力是否满足,各级监控指标是否全面覆盖。是否满足应急措施和预案,在出现不可预知的情况时能否迅速做出应急响应和回滚。近年来,苏宁的线上流量每年都呈指数级增长,而IT基础设施的不断完善,也逐渐将这些能力提供给了生产实践。不管苏宁易购的业务特点如何,这些执行标准都是通用的。混沌工程的实现原理混沌工程并不意味着“混沌”。其实施过程涉及系统、设施、场景、人员等多种资源。它必须有原则和有序,以组织和协调各方资源。达到最终目标。其实现原则是:①一个目标,即实现整个机房的宕机。混沌工程作为一门新兴学科,包含的场景和内容非常多,需要我们根据自己的目标进行选择。规划和实施都必须有针对性,避免过度工程化。②最小爆炸半径。在生产测试期间,影响在线系统和引起用户投诉是必不可少的。最小爆炸半径是将计划和目标结合起来,减少对用户的影响。图一:爆炸半径的影响范围爆炸半径越小,越容易控制,暴露的问题也越少;爆炸半径越大,影响越大,暴露出的问题也就越多。爆炸半径的选择与各阶段的目标和实施能力相匹配。③循序渐进,分解目标。围绕最终目标,进行目标分解,由简单到复杂,由小到大。图2:实施目标的分解这个过程既可以积累经验,又可以给团队信心。信心很重要:单系统应用节点,单系统应用层,如Jboss、Tomcat节点故障。单系统分库节点,单系统数据层分库,如Redis、MySQL分库节点失效。单系统全库节点,单系统数据层全库,如Redis,MySQL全库节点失效。组件节点主要是指PaaS能力节点,如网关、消息分发、服务注册等节点故障。控制节点是指集群控制节点,如etcd、Zookeeper、Sentinel等故障。接入/汇聚/核心网是指接入/汇聚/核心网断线故障。物理机/机柜掉电是指某台物理机或某个机柜掉电。DCI网络是指DCI(DataCenterInterconnection)网络故障。机房断电,也就是整个机房断电。将以上目标组合起来形成以下阶段性目标:单系统故障是指某个应用系统故障,是单系统应用和全局故障的组合。全链路故障是所有系统故障的组合。机房基础设施故障是接入/汇聚/核心网和设备电源故障的组合。整个机房的基础设施故障是指DCI故障和机房电源故障的组合。整个机房的故障是指所有故障的综合。通过各阶段故障的组合,最终达到完整机房的目的。混沌工程平台认识到“工欲善其事,必先利其器”。结合我们的目标和实施原则,我们开发了混沌工程平台。Netflix在《chaos engineering》中提出,可以进行以下测试输入:模拟整个IDC下行选择网络连接的一部分注入特定的时间延迟随机让一些函数抛出异常强制NTP时间不同步产生IO错误Drainthe系统级Faultinjection的CPU在初始阶段并不会直接杀掉应用进程,而是通过屏蔽虚拟机的源和目的通信端口来中断TCP连接。这样既可以达到让系统无法运行的目的,又可以最大程度的保证系统的快速恢复。对于停电,目前还是靠人工操作。现阶段的混沌工程只涉及全链路级别的故障。功能架构图3:平台功能架构混沌系统的功能架构分为三层,从下到上分别为:能力层,提供各种故障注入指令库,包括网络、存储、虚拟机、应用等。功能层主要包括平台的各种功能,其中最重要的是命令管理和任务管理。命令管理就是维护相关的命令信息和脚本。任务管理是维护相关的任务信息,包括单系统和全链路。任务是有序的动作集合。编排层主要面向系统运维人员。通过一系列配置、编排动作、单系统任务、全链路任务,指定依赖关系和执行顺序,使整个执行过程有序可控。故障注入流程图4:故障注入流程故障注入流程如下:任务安排,混沌工程平台安排注入命令任务,从平台数据系统中获取目标虚拟机数据。下发故障注入命令,启动故障注入任务后,向目标虚拟机下发相关命令。混沌平台需要与各个网络区域相连。具有以下特点:安全控制,验证身份和指令,保证任务执行的安全性;分布式部署,承受并发压力,整个机房系统涉及的虚拟机数量10万+,需要并发执行,减少Fault注入时间,降低业务影响。对于故障注入的执行,Agent部署在各个虚拟机上,接受指令后负责具体的注入操作。告警检测,故障注入虚拟机后,监控系统会检测告警信息。流量切换根据告警机器、告警类型、告警级别触发流量切换。现阶段是否需要进行流量切换,需要人工决策。故障恢复过程故障注入后,需要进行恢复操作,其过程与注入类似。即向Agent发送recovery命令清除之前的故障命令。需要注意的是,Agent的通信端口被当做白名单处理,否则注入后混沌工程系统集群无法连接到虚拟机。注入自愈功能故障后,为了防止某些原因导致网络故障,无法向虚拟机下发恢复命令,导致业务恢复失败,所以需要自愈功能,以及一段时间内没有收到新命令(自定义)。然后Agent会自动执行其对应的恢复命令。综上所述,混沌工程平台上线以来,模拟了各种异常场景,进行了生产各层级的流量切换演练,发现了很多关键问题,为最终的成功打下了坚实的基础。机房停机演练与机房稳定性。混沌工程作为一门领域学科,包含着非常丰富的内容。由于项目的紧迫性和资源的限制,现阶段苏宁混沌工程仍围绕全机房宕机演练目标进行。在此基础上,我们未来会逐步扩展,包括故障注入、自动运行、流量切换、应急联动等场景覆盖,提升苏宁云整体的容灾能力。【原创稿件,合作网站转载请注明原作者和出处为.com】