故障树分析法(Fault Tree Analysis,FTA)是在对系统的可靠性进行分析时最常用的方法之一。FTA方法是指在系统设计或改进过程中,通过对可能造成系统故障的各种因素(包括硬件、软件、环境、人为因素等)进行分析,画出逻辑框图(即故障树),从而确定系统故障原因的各种可能组合方式及其发生概率,并以此计算系统的故障概率,采取相应的措施,以提高系统可靠性的一种设计分析方法和评估方法。

故障树分析图经常被用在Six Sigma进程中,特别用在Six Sigma业务改进进程的分析阶段。

故障树分析法对于数据库故障解决的意义

经过在实践和应用中的总结,我发现故障树分析法作为一种分析方法和思路,同样适合数据库故障的分析和解决,如果扩展一步来说,这种方法作为一种思维方式,甚至适合生活中所有事件的分析和处理。

但是需要注意的是,故障分析实际上是一种事后分析的方法,当然我们不希望工作、生活中当事故、问题出现后再来分析,所以,我一直提倡将故障树分析在事前实施,通过参考别人的经验、教训,将故障树引入事前,人类的学习特点应当能够使我们从学习中而不是亲身经历去获得经验。

通过实践我们发现,将应用于传统行业的故障树分析法引入到数据库故障分析及问题解决之中,可以极大地加快问题分析、处理和解决的速度,同时可以帮助我们发现系统的缺陷所在,从而通过实施有效的预防措施显著地提高系统的稳定性和可靠性。

故障树分析模型的建立

如图1所示是数据库系统故障分析树的一个示例,这里以数据库故障为起点,来分析可能导致数据库及应用故障的可能因素。

故障树 逻辑运算 源代码 python 故障树题目_运维


图1 数据库系统故障分析树

分析的过程是一个穷举故障原因的过程,我们可以按照不同的方法对故障的原因进行分类,在这个分析中,首先我将第一层归结为3类问题:客户端/中间层故障、网络故障、服务器端故障。这其中任何一处出现问题都可能会导致数据库服务出现问题。

再来进一步深入分析,在一个数据库系统中,客户端或中间层如果出现问题,就可能会影响数据库系统的使用,但这在用户看来同样是数据库故障。那么对于这一类问题,进一步细分,客户端/中间层有哪些故障会引起数据库的访问不畅呢?

首先如果客户端的应用程序损坏可能造成数据库的无法连接,曾经有很多案例因为客户端感染病毒而导致应用程序异常;然后常见的还有客户端版本及驱动问题,Oracle的版本众多,如果驱动版本不匹配可能也会出现问题;客户端的防火墙有时候也会成为阻碍数据库成功访问的障碍之一;当然更为常见的是客户端的配置文件(tnsnames.ora文件或中间件的配置文件)存在问题,导致无法正确连接数据库的。可能的原因还有很多,更为完善的故障树分析图如图2所示。

故障树 逻辑运算 源代码 python 故障树题目_运维_02

图2 客户端/中间层故障树分支

分析完客户端,在数据库和客户端之间还存在网络,网络问题也是常见数据库故障的问题点之一,可以尝试对网络故障再进行细分,如图3所示。
网络故障的可能原因也很多,首先是物理链路的问题,公网和内网都可能存在链路故障、品质降低等,再加上地址路由等因素,这方面的故障实在很多见,其次防火墙、带宽、流量等因素也是需要考虑的。

故障树 逻辑运算 源代码 python 故障树题目_分类_03

图3 网络故障树分支

当客户端、网络一切正常之后,就到了最重要的一环──数据库服务器端,如果这里出现故障或性能问题,那么原因可能是极其复杂和多样化的。图4列举了一些常见的数据库端故障问题,这张故障分析图是应该存储在每个DBA的头脑中的。

故障树 逻辑运算 源代码 python 故障树题目_故障树 逻辑运算 源代码 python_04

图4 服务器端故障树分支

首先客户端经过网络向数据库发送请求,数据库服务器端最先接受请求的数据库监听器,如果监听器出现问题,则数据库连接肯定会出现异常,所以监听器是一个重要环节和故障点。

数据库服务器还可能会经常出现资源短缺等问题,比如连接数耗尽、用户无法创建新的连接;因为归档或备份,磁盘空间可能被耗尽,导致数据库问题;或者磁盘I/O因为硬件故障或性能问题,都可能导致数据库故障或响应缓慢;内存资源或交换也是重要内容,如果内存不足,可能导致数据库性能低下,严重影响数据库的正常运行;CPU资源不足是实际生产中经常会遇到的问题,其原因多样化,可以沿这个节点进一步深入分析。

此外,应用问题也是经常会导致故障的原因之一,有的是因为SQL编写问题,有的是因为数据结构设计存在问题,有的甚至是数据库软件本身就存在Bug。最后来看一下这张图的全貌,如图5所示。

故障树 逻辑运算 源代码 python 故障树题目_故障树 逻辑运算 源代码 python_05

图5 故障树全貌

事实上,故障树分析法的使用完全可以十分灵活,我们可以以任何一个提出的问题作为分析起点,比如用户经常反映“数据库响应缓慢”的问题,就可以从这里出发进行问题分解和分析,如图6所示。

故障树 逻辑运算 源代码 python 故障树题目_分类_06

图6 数据库响应缓慢故障树

有了这样的分析基础之后,在遇到故障时就可以快速地在大脑里进行根据故障树进行分析导航,从而迅速地定位问题的原因,并根据经验或知识找到解决故障的方法。从这个意义上说,故障树也是一个索引。