架构篇24:排除架构可用性隐患的利器-FMEA方法

文章目录

    • FMEA 介绍
    • FMEA 方法
    • FMEA 实战
    • 小结

3ca2b142f86d444aa3b416d27e035848

前面的专栏分析高可用复杂度的时候提出了一个问题:高可用和高性能哪个更复杂,根据墨菲定律“可能出错的事情最终都会出错”,架构隐患总有一天会导致系统故障。因此,我们在进行架构设计的时候必须全面分析系统的可用性,那么如何才能做到“全面”呢?

我今天介绍的FMEA 方法,就是保证我们做到全面分析的一个非常简单但是非常有效的方法。

FMEA 介绍

FMEA(Failure mode and effects analysis,故障模式与影响分析)又称为失效模式与后果分析、失效模式与效应分析、故障模式与后果分析等,专栏采用“故障模式与影响分析”,因为这个中文翻译更加符合可用性的语境。FMEA 是一种在各行各业都有广泛应用的可用性分析方法,通过对系统范围内潜在的故障模式加以分析,并按照严重程度进行分类,以确定失效对于系统的最终影响。

FMEA 最早是在美国军方开始应用的,20 世纪 40 年代后期,美国空军正式采用了 FMEA。尽管最初是在军事领域建立的方法,但 FMEA 方法现在已广泛应用于各种各样的行业,包括半导体加工、餐饮服务、塑料制造、软件及医疗保健行业。FMEA 之所以能够在这些差异很大的领域都得到应用,根本原因在于 FMEA 是一套分析和思考的方法,而不是某个领域的技能或者工具。

回到软件架构设计领域,FMEA 并不能指导我们如何做架构设计,而是当我们设计出一个架构后,再使用 FMEA 对这个架构进行分析,看看架构是否还存在某些可用性的隐患。

FMEA 方法

在架构设计领域,FMEA 的具体分析方法是:

  • 给出初始的架构设计图。
  • 假设架构中某个部件发生故障。
  • 分析此故障对系统功能造成的影响。
  • 根据分析结果,判断架构是否需要进行优化。

FMEA 分析的方法其实很简单,就是一个 FMEA 分析表,常见的 FMEA 分析表格包含下面部分。

  1. 功能点

当前的 FMEA 分析涉及的功能点,注意这里的“功能点”指的是从用户角度来看的,而不是从系统各个模块功能点划分来看的。例如,对于一个用户管理系统,使用 FMEA 分析时 “登录”“注册”才是功能点,而用户管理系统中的数据库存储功能、Redis 缓存功能不能作为 FMEA 分析的功能点。

  1. 故障模式

故障模式指的是系统会出现什么样的故障,包括故障点和故障形式。需要特别注意的是,这里的故障模式并不需要给出真正的故障原因,我们只需要假设出现某种故障现象即可,例如 MySQL 响应时间达到 3 秒。造成 MySQL 响应时间达到 3 秒可能的原因很多:磁盘坏道、慢查询、服务器到 MySQL 的连接网络故障、MySQL bug 等,我们并不需要在故障模式中一一列出来,而是在后面的“故障原因”一节中列出来。因为在实际应用过程中,不管哪种原因,只要现象是一样的,对业务的影响就是一样的。

此外,故障模式的描述要尽量精确,多使用量化描述,避免使用泛化的描述。例如,推荐使用“MySQL 响应时间达到 3 秒”,而不是“MySQL 响应慢”。

  1. 故障影响

当发生故障模式中描述的故障时,功能点具体会受到什么影响。常见的影响有:功能点偶尔不可用、功能点完全不可用、部分用户功能点不可用、功能点响应缓慢、功能点出错等。

故障影响也需要尽量准确描述。例如,推荐使用“20% 的用户无法登录”,而不是“大部分用户无法登录”。要注意这里的数字不需要完全精确,比如 21.25% 这样的数据其实是没有必要的,我们只需要预估影响是 20% 还是 40%。

  1. 严重程度

严重程度指站在业务的角度故障的影响程度,一般分为“致命 / 高 / 中 / 低 / 无”五个档次。严重程度按照这个公式进行评估:严重程度 = 功能点重要程度 × 故障影响范围 × 功能点受损程度。同样以用户管理系统为例:登录功能比修改用户资料要重要得多,80% 的用户比 20% 的用户范围更大,完全无法登录比登录缓慢要更严重。因此我们可以得出如下故障模式的严重程度。

  • 致命:超过 70% 用户无法登录。
  • 高:超过 30% 的用户无法登录。
  • 中:所有用户登录时间超过 5 秒。
  • 低:10% 的用户登录时间超过 5 秒。
  • 中:所有用户都无法修改资料。
  • 低:20% 的用户无法修改头像。

对于某个故障的影响到底属于哪个档次,有时会出现一些争议。例如,“所有用户都无法修改资料”,有的人认为是高,有的人可能认为是中,这个没有绝对标准,一般建议相关人员讨论确定即可。也不建议花费太多时间争论,争执不下时架构师裁定即可。

  1. 故障原因

“故障模式”中只描述了故障的现象,并没有单独列出故障原因。主要原因在于不管什么故障原因,故障现象相同,对功能点的影响就相同。那为何这里还要单独将故障原因列出来呢?主要原因有这几个:

  • 不同的故障原因发生概率不相同

例如,导致 MySQL 查询响应慢的原因可能是 MySQL bug,也可能是没有索引。很明显“MySQL bug”的概率要远远低于“没有索引”;而不同的概率又会影响我们具体如何应对这个故障。

  • 不同的故障原因检测手段不一样

例如,磁盘坏道导致 MySQL 响应慢,那我们需要增加机器的磁盘坏道检查,这个检查很可能不是当前系统本身去做,而是另外运维专门的系统;如果是慢查询导致 MySQL 慢,那我们只需要配置 MySQL 的慢查询日志即可。

  • 不同的故障原因的处理措施不一样

例如,如果是 MySQL bug,我们的应对措施只能是升级 MySQL 版本;如果是没有索引,我们的应对措施就是增加索引。

  1. 故障概率

这里的概率就是指某个具体故障原因发生的概率。例如,磁盘坏道的概率、MySQL bug 的概率、没有索引的概率。一般分为“高 / 中 / 低”三档即可,具体评估的时候需要有以下几点需要重点关注。

  • 硬件

硬件随着使用时间推移,故障概率会越来越高。例如,新的硬盘坏道几率很低,但使用了 3 年的硬盘,坏道几率就会高很多。

  • 开源系统

成熟的开源系统 bug 率低,刚发布的开源系统 bug 率相比会高一些;自己已经有使用经验的开源系统 bug 率会低,刚开始尝试使用的开源系统 bug 率会高。

  • 自研系统

和开源系统类似,成熟的自研系统故障概率会低,而新开发的系统故障概率会高。

高中低是相对的,只是为了确定优先级以决定后续的资源投入,没有必要绝对量化,因为绝对量化是需要成本的,而且很多时候都没法量化。例如,XX 开源系统是 3 个月故障一次,还是 6 个月才故障一次,是无法评估的。

  1. 风险程度

风险程度就是综合严重程度和故障概率来一起判断某个故障的最终等级,风险程度 = 严重程度 × 故障概率。因此可能出现某个故障影响非常严重,但其概率很低,最终来看风险程度就低。“某个机房业务瘫痪”对业务影响是致命的,但如果故障原因是“地震”,那概率就很低。例如,广州的地震概率就很低,5 级以上地震的 20 世纪才 1 次(1940 年);如果故障的原因是“机房空调烧坏”,则概率就比地震高很多了,可能是 2 年 1 次;如果故障的原因是“系统所在机架掉电”,这个概率比机房空调又要高了,可能是 1 年 1 次。同样的故障影响,不同的故障原因有不同的概率,最终得到的风险级别就是不同的。

  1. 已有措施

针对具体的故障原因,系统现在是否提供了某些措施来应对,包括:检测告警、容错、自恢复等。

  • 检测告警

最简单的措施就是检测故障,然后告警,系统自己不针对故障进行处理,需要人工干预。

  • 容错

检测到故障后,系统能够通过备份手段应对。例如,MySQL 主备机,当业务服务器检测到主机无法连接后,自动连接备机读取数据。

  • 自恢复

检测到故障后,系统能够自己恢复。例如,Hadoop 检测到某台机器故障后,能够将存储在这台机器的副本重新分配到其他机器。当然,这里的恢复主要还是指“业务”上的恢复,一般不太可能将真正的故障恢复。例如,Hadoop 不可能将产生了磁盘坏道的磁盘修复成没有坏道的磁盘。

  1. 规避措施

规避措施指为了降低故障发生概率而做的一些事情,可以是技术手段,也可以是管理手段。例如:

  • 技术手段:为了避免新引入的 MongoDB 丢失数据,在 MySQL 中冗余一份。
  • 管理手段:为了降低磁盘坏道的概率,强制统一更换服务时间超过 2 年的磁盘。
  1. 解决措施

解决措施指为了能够解决问题而做的一些事情,一般都是技术手段。例如:

  • 为了解决密码暴力破解,增加密码重试次数限制。
  • 为了解决拖库导致数据泄露,将数据库中的敏感数据加密保存。
  • 为了解决非法访问,增加白名单控制。

一般来说,如果某个故障既可以采取规避措施,又可以采取解决措施,那么我们会优先选择解决措施,毕竟能解决问题当然是最好的。但很多时候有些问题是系统自己无法解决的,例如磁盘坏道、开源系统 bug,这类故障只能采取规避措施;系统能够自己解决的故障,大部分是和系统本身功能相关的。

  1. 后续规划

综合前面的分析,就可以看出哪些故障我们目前还缺乏对应的措施,哪些已有措施还不够,针对这些不足的地方,再结合风险程度进行排序,给出后续的改进规划。这些规划既可以是技术手段,也可以是管理手段;可以是规避措施,也可以是解决措施。同时需要考虑资源的投入情况,优先将风险程度高的系统隐患解决。

例如:

  • 地震导致机房业务中断:这个故障模式就无法解决,只能通过备份中心规避,尽量减少影响;而机柜断电导致机房业务中断:可以通过将业务机器分散在不同机柜来规避。
  • 敏感数据泄露:这个故障模式可以通过数据库加密的技术手段来解决。
  • MongoDB 断电丢数据:这个故障模式可以通过将数据冗余一份在 MySQL 中,在故障情况下重建数据来规避影响。

FMEA 实战

下面我以一个简单的样例来模拟一次 FMEA 分析。假设我们设计一个最简单的用户管理系统,包含登录和注册两个功能,其初始架构是:

img

初始架构很简单:MySQL 负责存储,Memcache(以下简称 MC)负责缓存,Server 负责业务处理。我们来看看这个架构通过 FMEA 分析后,能够有什么样的发现,下表是分析的样例(注意,这个样例并不完整,感兴趣的同学可以自行尝试将这个案例补充完整)。

img

经过上表的 FMEA 分析,将“后续规划”列的内容汇总一下,我们最终得到了下面几条需要改进的措施:

  • MySQL 增加备机。
  • MC 从单机扩展为集群。
  • MySQL 双网卡连接。

改进后的架构如下:

img

小结

今天我们讨论了 FMEA 高可用分析方法,并且给出了一个简单的案例描述如何操作。FMEA 是高可用架构设计的一个非常有用的方法,能够发现架构中隐藏的高可用问题,希望对你有所帮助。


【星猿杂谈】:在这里我们共同探索科技新趋势,分享积累的点滴,从编程语言到系统架构,从人工智能到高性能计算,我们追求技术的进步,同时珍视分享的力量。欢迎关注我们,在技术的精彩世界中一起遨游,发现更多未知!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/346850.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

shopee的AI学习之路——GPTs通过AdInteli 广告变现

GPTs|AdInteli 广告变现 一、什么是 AdInteli AdIntelli 是一个旨在为生成 GPTs 接入广告并实现变现的平台。它连接了全球最大的广告联盟,允许广告商进行竞价,确保展示最有价值的广告。AdIntelli 采用 AI 驱动的收入生成技术,优化广告选择。…

【github】使用github action 拉取国外docker镜像

使用github action 拉取国外docker镜像 k8s部署经常用到国外镜像,如果本地无法拉取可以考虑使用github action环境 github action的ci服务器在国外,不受中国防火墙影响github action 自带docker命令运行时直接将你仓库代码拉取下来 步骤 你的国内dock…

SAP PO平台配置

多个系统分配 : XPATH : /p1:mt_ERP_ZSSF_HFM_001/sapClient SPACE : p1 http://lstech.com/erp/IF0523/ZSSF_HFM_001

qml与C++的交互

qml端使用C对象类型、qml端调用C函数/c端调用qml端函数、qml端发信号-连接C端槽函数、C端发信号-连接qml端函数等。 代码资源下载: https://download.csdn.net/download/TianYanRen111/88779433 若无法下载,直接拷贝以下代码测试即可。 main.cpp #incl…

HDMI之ALLM

概述 ALLM(Auto Low-latency Mode)即自动低延迟模式,在自动低延迟模式下智能电视的用户不用根据电视播放的内容手动来切换低延迟模式,而会根据电视播放的内容自动启用或者禁用低延迟模式。这里的启用或者禁用低延迟功能通常是信号源设备控制的(如游戏设备 Xbox One,或 PS5…

LIMS源码,实验室信息系统源码,后端框架:asp.net

LIMS(laboratory information management system)即实验室信息管理系统是实验室管理科学发展的成果,是实验室管理科学与现代信息技术结合的产物,是利用计算机网络技术、数据存储技术、快速数据处理技术等,对实验室进行全方位管理的计算机软件…

66.Spring是如何整合MyBatis将Mapper接口注册为Bean的原理?

原理 首先MyBatis的Mapper接口核心是JDK动态代理 Spring会排除接口,无法注册到IOC容器中 MyBatis 实现了BeanDefinitionRegistryPostProcessor 可以动态注册BeanDefinition 需要自定义扫描器(继承Spring内部扫描器ClassPathBeanDefinitionScanner ) 重…

微信小程序如何自定义单选和多选

实现单选 实现效果&#xff1a;点击显示单选状态&#xff0c;每次仅能点击一个元素。 实现方式&#xff1a; wxml&#xff1a; <view wx:for"{{item_list}}" data-info"{{index}}" class"{{menu_indexindex?choose:no_choose}}" bind:ta…

【Linux】shell外壳和权限

文章目录 shell外壳用户切换权限 shell外壳 什么是shell外壳呢&#xff1f;首先我们应该知道&#xff0c;用户和操作系统内核是不能直接接触的&#xff0c;因为首先操作系统本身就很难去操作&#xff0c;另一方面也是为了操作系统安全考虑&#xff0c;不能让用户直接去操作内核…

Matlab图像处理——谷物颗粒计数

针对目前谷物人工计数和光电计数方法存在的不足 , 提出了一种基于 Matlab 图像识别和处理技术的谷物计数方法 , 并用实例验证了其可靠性。该方法减轻了操作者劳动强度 , 弥补了人视觉的不足之处 , 提高了效率及准确率 , 为今后进一步研究奠定了必要的理论与实践基础 , 对完善“…

有趣的数学 了解TensorFlow的自动微分的实现

一、简述 这里主要介绍了TensorFlow的自动微分(autodiff)功能如何工作,以及与其他解决方案的比较。假设您定义了一个函数,并且需要计算它的偏导数和,通常用于执行梯度下降(或某些其他优化算法)。可用的主要选择是手动微分、有限差分近似、正向模式自动微分和反向模式自动…

uniapp微信小程序图片上传功能实现,页面显示文件列表、删除功能

uniapp小程序图片上传功能效果预览 一、template 页面结构 <view class"upload-box"><view class"upload-list"><view class"upload-item" v-for"(item,index) of fileList" :keyindex><image class"img…

SMD NTC Thermistor NTC热敏电阻在锂电池充放电中的作用(NYFEA徕飞)

热敏电阻器&#xff08;Thermistor&#xff09;是一种电阻值对温度极为灵敏的半导体元件&#xff0c;温度系数可分为正温度系数热敏电阻PTC和负温度系数热敏电阻NTC。 NTC热敏电阻用于温度测量&#xff0c;温度控制&#xff0c;温度补偿等&#xff0c;称为温度传感器。 PTC热…

【python】—— 文件操作

目录 &#xff08;一&#xff09;文件是什么 &#xff08;二&#xff09;文件路径 &#xff08;三&#xff09;文件操作 3.1 打开文件 3.2 关闭文件 3.3 写文件 3.4 读文件 &#xff08;四&#xff09;关于中文的处理 &#xff08;五&#xff09;使用上下文管理器 &…

打印机怎么连接到电脑?完整指南助你顺利连接

随着科技的不断发展&#xff0c;打印机作为一种常见的办公设备&#xff0c;已经成为我们日常工作不可或缺的一部分。可是打印机怎么连接到电脑呢&#xff1f;本文将介绍三种常见的方法&#xff0c;详细解释如何将打印机连接到电脑&#xff0c;以便用户在面对这一操作时能够迅速…

【软件测试】学习笔记-Nginx 在系统架构中的作用

本篇文章你探讨 Nginx 在应用架构中的作用&#xff0c;并从性能测试角度看如何利用 Nginx 数据统计用户访问量。 Nginx 重要的两个概念 代理 首先要来解释一下什么是代理&#xff0c;正向代理和反向代理是什么意思&#xff1f;各自作用是什么&#xff1f;不少同学经常听到这…

[BSidesCF 2020]Had a bad day

先看url&#xff0c;发现可能有注入 http://655c742e-b427-485c-9e15-20a1e7ef1717.node5.buuoj.cn:81/index.php?categorywoofers 试试能不能查看index.php直接?categoryindex.php不行&#xff0c;试试伪协议 把.php去掉试试 base64解码 <?php$file $_GET[category];…

多域名SSL证书免费申请

在互联网信息安全日益受到重视的今天&#xff0c;SSL证书已经成为了网站安全的重要组成部分。那么&#xff0c;什么是SSL证书呢&#xff1f;简单来说&#xff0c;SSL证书是一种用于保证网络传输过程中数据安全的认证机制&#xff0c;它可以确保网站和用户之间的数据传输是加密的…

OpenCV读取摄像头窗口变大且很卡的解决方法

视频讲解 OpenCV读取摄像头窗口变大且很卡的解决方法 测试过程 读取摄像头窗口变大且很卡的代码 import cv2 cap cv2.VideoCapture(0) if not cap.isOpened():print("Cannot open camera")exit() while True:ret, frame cap.read()if not ret:print("no str…