故障原因归类分析及预防和应对措施

每一次故障都是一次宝贵的学习机会。

引语

故障是开发者头上悬着的一把剑。俗语曰:no zuo no die. 可是开发者很难做到 no zuo. 如何在 zuo 的时候防止 die 呢 ?

知己知彼才能百战不殆。要避免故障,就需要对故障有一个相对深入的理解。

故障,一般是指一段时间内较为密集的问题发生导致了一定的负面影响。业务量小的极少影响面的问题不算故障,否则就会混淆真正的故障,导致受限资源投入分配不合理,影响关键问题的解决进度;零星的非密集的问题可能不是故障,因为那可能是小概率事件触发了潜在BUG,需要解决,但定为故障有点勉强。

要避免故障,首先需要深入了解故障发生的原因。以下内容来自于对多起故障的分析、归类和总结。

故障原因

多发源

故障多发源,是指发生故障的最常见原因。谨防这几种情形,可以预防大部分的故障可能性。

核心流程出错

核心流程的某个环节出问题,导致整体流程失败,或者部分业务场景的整体流程失败,都会导致密集问题发生。通常是在主流程中添加了一段代码,而这段代码没有考虑到某个场景或者健壮性不佳,影响了整体。

预防措施:

  1. 评估改动点! 非常重要!哪怕只有一行,只要在主流程中,都要仔细评估其影响范围。在主流程中添加的代码越长,越要警惕。
  2. 增加必要的 try-catch 。如果增加的代码只有局部影响,可以添加必要的 try-catch,防止未预料的情形的处理异常影响整体流程。
  3. 最好不要轻易改动影响全局的通用方法和配置(影响面和回归面非常大); 尽可能只新增而不是修改。
  4. 覆盖全面的核心流程的测试用例,每次发布都需要回归通过。
  5. 有风险性的改动,增加开关。一旦出错,立即关闭改动。

真实案例:

缺乏健壮性

实现服务之后,健壮性是保证服务能够平稳运行、正确应对错误和异常的第一道关卡,也是合格程序员的必备代码素养之一。

健壮性不佳,很容易导致由于未预料的局部细节、脏数据、局部调用失败影响整体的流程和展示。

预防措施:

  1. 思考错误和异常,多多益善。
  2. 善用 try-catch 保驾护航。
  3. 使用空字符串、空列表替代 null 。
  4. 异常分支的测试覆盖。

真实案例:

  • 由于一个 null 值导致整个订单列表加载失败。
  • 由于一个次要的依赖出错导致整个详情页加载失败。
  • 异常分支的代码有问题,但没有测试;当流程走到异常分支代码,任务直接跪掉,反复重启和跪掉。

瞬时大流量

瞬时大流量是造成故障的一大杀手。 瞬时大流量,会导致机器资源短缺,CPU 飙升或内存爆满或网卡、连接数打满,直接影响整体服务的稳定性。

对于消息处理应用来说,瞬时大流量会导致消息处理延迟,业务状态流转滞后,影响后续环节;对于非消息处理应用来说,则会导致任务处理阻塞,接口响应变慢或不响应。

预防措施:

  1. 集群环境:保证集群各机器或 Region 的负载均衡;
  2. 单机环境:有针对性地限流、限速和限数。
  3. 压测演练。容器化后的压测。

真实案例:

极端情况

极端情况是指,一些很罕见的事件的发生挑战了系统的某个局部极限,导致系统出了问题。

比如说,一个订单内的商品种数通常不会超过 10 ,但商家或买家刷单,导致大量含有 50 多个商品的订单,然后密集导出,就会导致应用 FullGC 严重,引起接口响应超时或任务无法进行下去。

预防措施:

  1. 思考极端情形及影响;
  2. 提前做好极端情形测试和设计方案。

真实案例:

依赖失败

依赖失败有如下情形:

  1. 所依赖的服务、配置或变量不存在或处于不合适的版本,导致应用启动失败,或者启动后的服务不能正常运行;
  2. 所依赖的基础服务不稳定出现大量报错时,会导致依赖它的高频应用也出现大量报错,导致雪崩效应。

预防措施:

  1. 当一个项目发布涉及多个系统或许多细节时,就需要编写发布文档,仔细指定发布配置和顺序,保证应用依赖的正确性。在具体发布时,则要严格执行发布文档里指定的检查点清单和发布顺序。检查依赖项:API 版本、Jar 版本、依赖服务、配置项、DB 字段。
  2. 自动降级。严格控制超时,隔离或去掉不必要的弱依赖。

资损

资产是客户非常敏感的私有产权。发生资损时,通常是最高故障级别。

资损一般发生在:1. 直接资损: 系统处理未考虑幂等,导致重复消息多次处理;2. 业务方根据基础服务方的状态字段进行资金业务处理,而基础业务方的状态字段返回有误,导致少算或多算。3. 诱导性资损,由于某些展示信息,诱导用户做出某种难以追回的行为,比如已发货订单展示为待发货;

预防措施: 1. 直接处理资金业务,注意幂等处理;2. 有依赖状态的资金业务处理? 3. 消除诱导性信息。

新旧迁移出错

多发生于技术重构优化的时候。比如旧的领域模型迁移新模型、旧的技术栈迁移新技术栈、旧的页面迁移新页面。做技术改造,侧重点往往在于新服务的测试,而容易忽略老服务的测试兼容。

新旧迁移存在一个权衡:彻底还是减少出错。更为彻底的迁移,出错和故障概率会更大,但新系统会更加清爽;向老系统作一些妥协,可以减少一些出错和故障概率,但新系统会带着老系统的包袱前行,后续依然会出问题。

预防措施:

  1. 分流。 分流可以确保新服务上线之后的影响面逐渐扩大,即使有未考虑的点,也会将影响面控制在最小范围。
  2. 充分测试,事先评估好测试用例并严格执行。
  3. 旧接口迁移到新接口时,返回值的结构和值约定最好一致。如果要改动,需要谨慎先评估好。

老代码

不可否认,老代码在企业初创期曾立下汗马功劳。可是,随着时间推移,业务量越来越大,复杂度也在快速增加,很多老代码的简单处理就逐渐变成了“定时炸弹”,冷不防让地震一震,让人抖一抖。

预防措施: 定期梳理和清除。

真实案例:

数据泄露

数据安全性越来越成为企业的重要关注点。对于 SaaS 来说,要保证各个租户的数据和操作互不影响,不能看到和操作未授权的数据。

预防措施: 1. 敏感数据脱敏; 2. 避免覆盖; 3. 权限控制; 4. XSS 安全问题。

真实案例:

性能问题

低性能、低吞吐量在面临短时间内大业务量的冲击时,很容易出现阻塞、延迟,从而导致故障。

预防措施:1. 批量调用替换循环单个调用; 2. O(nlogn) 算法; 3. 多进程或多线程并发; 4. 减少不必要的访问和服务依赖。

其他原因

设备及网络

设备及网络属于互联网的基础设施,位于最底层,一旦出现问题,影响面也是巨大的。当设备老旧出现硬件故障或宕机,或者网络抖动或突然断开,也是很容易导致大面积失败。

预防措施:

  1. 及时检查和更换老旧设备。花点钱更换老旧设备,比宕机出现问题花费时间、精力和金钱补偿,要划算得多。
  2. 备用链路和机房。
  3. 避免单点故障。

脏缓存

缓存通常用来提升应用性能。但若缓存在多处更新,多处读取,而缓存又存在脏数据,应用很可能会读取到脏缓存数据,导致处理出错。

预防措施: 1. 集中管理缓存的更新和读取; 2. 检测和消除脏缓存。

操作不当

操作不当主要有如下情形:

  1. 两种操作并发执行,导致出错;
  2. 代码合并冲突解决不当;
  3. 操作不规范,引发系统处理失常或失控。

预防措施:

  1. 代码合并冲突解决,双方确认。
  2. 同时更改系统配置,需要协调顺序,避免并发。
  3. 数据修复工作在业务低峰期进行。
  4. 数据修复方案要 check , 确保不引发新的问题。

故障处理

发生故障时,第一反应不是立即排查原因,而是立即止损,将影响面最小化。

  • 若能确定是发布导致,立即回滚发布。 回滚发布后,再仔细排查原因。
  • 及时同步进度,让关注方知悉;
  • 建立快速同步机制,预防小问题演变成大故障。

为了更好地减少故障的可能性,还需要事先做好故障应急预案。

  • 梳理底层的强弱依赖,确定强依赖不可用时导致的影响面;
  • 当强依赖不可用时,能够快速恢复的方案,将影响面降低到最小。
  • 故障演练。模拟大流量、极端情况和故障情形发生,检测应急预案是否生效和快速恢复。

小结

故障,是每个开发者乃至企业法人都不愿意经历的事情。可是,每一次故障,都蕴含着不同形式的疏忽、未知、真理,正向思考,其实是一次非常珍贵的学习机会。故障,也会引导人抵达更深入的境地,去理解事情的本质与关联。正视故障,从故障里学习真知,预防和避免故障,乃是更佳的姿势。

要预防故障:

  • 第一是细心。多个心眼,准确评估影响面,兼顾考虑老业务老功能的回归, 仔细检查依赖项,保证返回约定的一致性,规范执行;
  • 设计和实现要考虑健壮性、大流量和极端情形,避免低性能。
  • 有针对性避免安全性和资损问题。
  • 设置严密的监控报警,在问题的萌芽期掐灭。

原文地址:https://www.cnblogs.com/lovesqcc/p/11392064.html

时间: 2024-08-11 14:56:04

故障原因归类分析及预防和应对措施的相关文章

托管香港服务器常见故障原因分析

1.应用服务无法正常运行 当客户把香港服务器托管后,会在服务器上运行多种应用服务,比如WWW服务.Mail服务.Ftp服务等等.提供的服务类型越多,那么出问题的可能性就越大.当出现某种服务无法启动或死机时,比如sql查询过于频繁容易导致数据库挂掉.可以通过远程重启这项服务,经过重启机器或是相关处理后即可很快恢复正常. 2.服务器硬件故障 服务器硬件可能出现问题的地方,主要有主板.内存.硬盘等方面.比如大量的读写,容易造型硬盘坏道.在排除其它可能的原因后,经技术人员检查出是服务器硬件问题,则需客户

公司网站故障原因分析

1.17:20分左右部分页面出现mysql 报错. 此时带宽情况如图. 2.流量监控显示101.66.246.22占用了大量带宽,导致带宽爆满. 封锁该ip流量下降,开启该ip流量立马上升. 3.导出近十分钟日志发现如下:(该ip访问的文件) 101.66.246.22 - - [13/May/2014:17:40:09 +0800] "GET /sso_server/uploadfile/avatar/1/10/9041/web.tar.gz HTTP/1.1" 206 102623

nginx 502 bad故障原因及解决方法收集

如题,最近网站频繁出现502错误,简直无法正常运转,出现这种情况大多是php-cgi超时没有返回信息,或进程僵死等情况造成的.我们的nginx已经配置到极致这些都已经老早做过修改了,但现在又出然出现. 经过分析将nginx的error log打开,发现”pstream sent too big header while reading response header from upstream”这样的错误提示,查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区

kubernetes 故障排除、处理、预防

kubernetes 故障排除.处理.预防 故障排除顺序和思路 第一步: 我们可以通过查看节点是否正常,一是保证 K8S API Server 是正常的,二是可以查看节点集群网络中是否存在节点异常.如果我们在第一步发现哪个节点挂掉了,这时候我们可以重启节点,对节点上的应用进行恢复.假如我们发现这个节点挂掉是因为集群资源不够,这时候我们要及时增加集群节点,否则哪怕是重启集群,可能还是会挂掉. 第二步: 通过第一步,我们并没有发现集群中的节点有什么问题,我可能需要看到应用本身的部分,我们需要查看应用

mysql--error150错误原因初步分析

1, 两个字段的类型或者大小不严格匹配,例如,如果一个是INT(10), 那么外键也必须设置成INT(10), 而不是 INT(11) 也不能是 TINYINT. 你得使用 SHOW 命令来查看字段的大小,因为一些查询浏览器有时候把 int(10) 和int(11) 都显示为integer.另外,你还必须确定两个字段是否一个为 SIGNED,而另一个又是UNSIGNED, 这两字段必须严格地一致匹配. 2, 你试图引用的其中一个外键没有建立起索引,或者不是一个primary key , 如果其中

断路器越级跳闸故障原因

断路器越级跳闸故障原因与处理方法 时间:2015-07-21 22:27:51编辑:电工栏目:电工总结 导读:有关断路器越级跳闸故障的发生原因,断路器的“拒跳”严重威胁系统安全,断路器拒动,造成上一级断路器跳闸,称为“越级跳闸”,这里总结了断路器越级跳闸的处理方法. 断路器越级跳闸故障:断路器的“拒跳”对系统安全运行威胁很大,一旦某一单元发生故障时,断路器拒动,将会造成上一级断路器跳闸,称为“越级跳闸”. 断路器越级跳闸故障的处理方法: 一.根据事故现象,可判别是否属断路器“拒跳”事故. “拒跳

传智播客c/c++公开课学习笔记--黑客代码分析与预防

黑客代码分析与预防 笔记 [课程简介] C/C++语言是除了汇编之外,最接近底层的计算机语言,目前windows,linux,iOS,Android等主流操作系统都是用C/C++编写的,所以很多病毒.木马也都是用C/C++实现的.课程的目的就是通过C语言揭秘木马和各种远程控制软件的实现原理以及如何防护. [课程知识点] 1.木马入侵系统的方式: 2.木马入侵到宿主目标后的关键行为分析: 3.可信任端口以及端口扫描技术: 4.远程控制的实现代码实现: 5.恶意代码中使用TCP.UDP协议与防火墙穿

参数化查询速度慢的原因及分析

测试环境:sql2005 + .NET2.0 同样的SQL语句,参数化查询和SQL语句直接执行的速度对比.数据库中存放的字段类型是varchar 结论: 1.对参数要设置正确的 DbType(varchar = AnsiString, nvarchar=String,char=AnsiStringFixedLength,nchar=StringFixedLength) 2.尽量使用数据库类型对应的DbType的. 3.尽量给参数的size设置大小 Code: class Program { pr

IT运维面临的3大难题及应对措施

 网络设备 在企业IT基础设施的搭建过程中,底层的网络设备厂商和类型多样且复杂.随之而来的问题是:如何将不同厂商的网络和应用管理产品在界面级.消息 级和数据级集成起来实现统一管理?如何让IT管理员了解到整个网络全局的运行情况.发展趋势和可能存在的故障隐患点,以便及时采取相应措施,实现事前管 理. 科学的运维管理思路告诉我们,首先需要解决的是对IT基础设施的管理,管理范围要能覆盖到机房所有硬件设备.这一点是前提和基础.其次,才是对各种应用系统做到很好的监控.最后,才能为业务系统提供足够的保障.