1. CAP理论
CAP定理又被称作布鲁尔定理,是加州大学伯克利分校的计算机科学家埃里克·布鲁尔在2000年提出的一个猜想。2002年,麻省理工学院的赛斯·吉尔伯特和南希·林奇发表了布鲁尔猜想的证明,使之成为分布式计算领域公认的一个定理。对于设计分布式系统的架构师来说,CAP是必须掌握的理论。
布鲁尔在提出CAP猜想的时候,并没有详细定义Consistency、Availability、Partition Tolerance三个单词的明确定义。
1.1. 理论阐释
下面以Robert Greiner(http://robertgreiner.com/about/)的两篇文章来阐述CAP理论,第一篇被标记为“outdated”。
第一版解释:(http://robertgreiner.com/2014/06/cap-theorem-explained/)
Any distributed system cannot guaranty C, A, and P simultaneously.
翻译为:对于一个分布式计算系统,不可能同时满足一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三个设计约束。
第二版解释:(http://robertgreiner.com/2014/08/cap-theorem-revisited/)
In a distributed system (a collection of interconnected nodes that share data.), you can only have two out of the following three guarantees across a write/read pair: Consistency, Availability, and Partition Tolerance - one of them must be sacrificed.
翻译为:在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。
差异点:
第二版定义了什么才是CAP理论探讨的分布式系统,强调了两点:interconnected和share data(互相连接并共享数据),为何要强调这两点呢? 因为分布式系统并不一定会互联和共享数据。最简单的例如Memcache的集群,相互之间就没有连接和共享数据,因此Memcache集群这类分布式系统就不符合CAP理论探讨的对象;而MySQL集群就是互联和进行数据复制的,因此是CAP理论探讨的对象。
第二版强调了write/read pair,这点其实是和上一个差异点一脉相承的。也就是说,CAP关注的是对数据的读写操作,而不是分布式系统的所有功能。例如,ZooKeeper的选举机制就不是CAP探讨的对象。
相比来说,第二版的定义更加精确。
1.2. 约束点阐释
1.2.1. 一致性(Consistency)
第一版解释:
All nodes see the same data at the same time.
所有节点在同一时刻都能看到相同的数据。
第二版解释:
A read is guaranteed to return the most recent write for a given client.
对某个指定的客户端来说,读操作保证能够返回最新的写操作结果。
差异点:
第一版从节点node的角度描述,第二版从客户端client的角度描述
第二版更加符合我们观察和评估系统的方式,即站在客户端的角度来观察系统的行为和特征。
第一版的关键词是see,第二版的关键词是read。
第一版解释中的see,其实并不确切,因为节点node是拥有数据,而不是看到数据,即使要描述也是用have;第二版从客户端client的读写角度来描述一致性,定义更加精确。
第一版强调同一时刻拥有相同数据(same time + same data),第二版并没有强调这点。
这就意味着实际上对于节点来说,可能同一时刻拥有不同数据(same time + different data)
对于系统执行事务来说,在事务执行过程中,系统其实处于一个不一致的状态,不同的节点的数据并不完全一致,因此第一版的解释“All nodes see the same data at the same time”是不严谨的。而第二版强调client读操作能够获取最新的写结果就没有问题,因为事务在执行过程中,client是无法读取到未提交的数据的,只有等到事务提交后,client才能读取到事务写入的数据,而如果事务失败则会进行回滚,client也不会读取到事务中间写入的数据。
A system has consistency if a transaction starts with the system in a consistent state, and ends with the system in a consistent state. In this model, a system can (and does) shift into an inconsistent state during a transaction, but the entire transaction gets rolled back if there is an error during any stage in the process.
如果一个事务开始时系统处于一致状态,结束时系统也处于一致状态,那么该系统就具有一致性。在此模型中,系统在事务执行过程中可能会(并且确实会)转变为不一致状态,但如果过程中的任何阶段出现错误,整个事务将被回滚。
1.2.2. 可用性(Availability)
第一版解释:
Every request gets a response on success/failure.
每个请求都能得到成功或者失败的响应。
第二版解释:
A non-failing node will return a reasonable response within a reasonable amount of time (no error or timeout).
非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应)。
差异点:
第一版是every request,第二版强调了A non-failing node。
第一版的every request是不严谨的,因为只有非故障节点才能满足可用性要求,如果节点本身就故障了,发给节点的请求不一定能得到一个响应。
第一版的response分为success和failure,第二版用了两个reasonable:reasonable response 和reasonable time,而且特别强调了no error or timeout。
第一版的success/failure的定义太泛了,几乎任何情况,无论是否符合CAP理论,我们都可以说请求成功和失败,因为超时也算失败、错误也算失败、异常也算失败、结果不正确也算失败;即使是成功的响应,也不一定是正确的。
第二版只要结果“合理”即可
1.2.3. 分区容忍性(Partition Tolerance)
第一版解释:
System continues to work despite message loss or partial failure.
出现消息丢失或者分区错误时系统能够继续运行。
第二版解释:
The system will continue to function when network partitions occur.
当出现网络分区后,系统能够继续“履行职责”。
差异点:
第一版用的是work,第二版用的是function。
work强调“运行”,只要系统不宕机,我们都可以说系统在work,返回错误也是work,拒绝服务也是work;而function强调“发挥作用”“履行职责”,这点和可用性是一脉相承的。也就是说,只有返回reasonable response才是function。相比之下,第二版解释更加明确。
第一版描述分区用的是message loss or partial failure,第二版直接用network partitions。
对比两版解释,第一版是直接说原因,即message loss造成了分区,但message loss的定义有点狭隘,因为通常我们说的message loss(丢包),只是网络故障中的一种;第二版直接说现象,即发生了分区现象,不管是什么原因,可能是丢包,也可能是连接中断,还可能是拥塞,只要导致了网络分区,就通通算在里面。
1.3. CAP理论的应用
虽然CAP理论定义是三个要素中只能取两个,但放到分布式环境下来思考,我们会发现必须选择P(分区容忍)要素,因为网络本身无法做到100%可靠,有可能出故障,所以分区是一个必然的现象。如果我们选择了CA而放弃了P,那么当发生分区现象时,为了保证C,系统需要禁止写入,当有写入请求时,系统返回error(例如,当前系统不允许写入),这又和A冲突了,因为A要求返回no error和no timeout。因此,分布式系统理论上不可能选择CA架构,只能选择CP或者AP架构。
1.3.1. CP
为了保证一致性,而牺牲可用性。
如下图所示,为了保证一致性,当发生分区现象后,N1节点上的数据已经更新到y,但由于N1和N2之间的复制通道中断,数据y无法同步到N2,N2节点上的数据还是x。这时客户端C访问N2时,N2需要返回Error,提示客户端C“系统现在发生了错误”,这种处理方式违背了可用性(Availability)的要求,因此CAP三者只能满足CP。

1.3.2. AP
为了保证可用性,而牺牲一致性。
如下图所示,为了保证可用性,当发生分区现象后,N1节点上的数据已经更新到y,但由于N1和N2之间的复制通道中断,数据y无法同步到N2,N2节点上的数据还是x。这时客户端C访问N2时,N2将当前自己拥有的数据x返回给客户端C了,而实际上当前最新的数据已经是y了,这就不满足一致性(Consistency)的要求了,因此CAP三者只能满足AP。注意:这里N2节点返回x,虽然不是一个“正确”的结果,但是一个“合理”的结果,因为x是旧的数据,并不是一个错乱的值,只是不是最新的数据而已。

1.4. CAP关键细节
https://www.infoq.cn/article/cap-twelve-years-later-how-the-rules-have-changed/
1.4.1. CAP关注的粒度是数据,而不是整个系统
CAP理论的定义和解释中,用的都是system、node这类系统级的概念,这就给很多人造成了很大的误导,认为我们在进行架构设计时,整个系统要么选择CP,要么选择AP。但在实际设计过程中,每个系统不可能只处理一种数据,而是包含多种类型的数据,有的数据必须选择CP,有的数据必须选择AP。而如果我们做设计时,从整个系统的角度去选择CP还是AP,就会发现顾此失彼,无论怎么做都是有问题的。
以一个最简单的用户管理系统为例,用户管理系统包含用户账号数据(用户ID、密码)、用户信息数据(昵称、兴趣、爱好、性别、自我介绍等)。通常情况下,用户账号数据会选择CP,而用户信息数据会选择AP,如果限定整个系统为CP,则不符合用户信息数据的应用场景;如果限定整个系统为AP,则又不符合用户账号数据的应用场景。
在CAP理论落地实践时,我们需要将系统内的数据按照不同的应用场景和要求进行分类,每类数据选择不同的策略(CP还是AP),而不是直接限定整个系统所有数据都是同一策略。
1.4.2. CAP是忽略网络延迟的
这是一个非常隐含的假设,布鲁尔在定义一致性时,并没有将延迟考虑进去。也就是说,当事务提交时,数据能够瞬间复制到所有节点。但实际情况下,从节点A复制数据到节点B,总是需要花费一定时间的。如果是相同机房,耗费时间可能是几毫秒;如果是跨地域的机房,例如北京机房同步到广州机房,耗费的时间就可能是几十毫秒。这就意味着,CAP理论中的C在实践中是不可能完美实现的,在数据复制的过程中,节点A和节点B的数据并不一致。技术上是无法做到分布式场景下完美的一致性的。
不要小看了这几毫秒或者几十毫秒的不一致,对于某些严苛的业务场景,例如和金钱相关的用户余额,或者和抢购相关的商品库存,技术上是无法做到分布式场景下完美的一致性的。而业务上必须要求一致性,因此单个用户的余额、单个商品的库存,理论上要求选择CP而实际上CP都做不到,只能选择CA。也就是说,只能单点写入,其他节点做备份,无法做到分布式情况下多点写入。
需要注意的是,这并不意味着这类系统无法应用分布式架构,只是说“单个用户余额、单个商品库存”无法做分布式,但系统整体还是可以应用分布式架构的。例如,下面的架构图是常见的将用户分区的分布式架构。

可以将用户id为0 ~ 100的数据存储在Node 1,将用户id为101 ~ 200的数据存储在Node 2,Client根据用户id来决定访问哪个Node。对于单个用户来说,读写操作都只能在某个节点上进行;对所有用户来说,有一部分用户的读写操作在Node 1上,有一部分用户的读写操作在Node 2上。
这样的设计有一个很明显的问题就是某个节点故障时,这个节点上的用户就无法进行读写操作了,但站在整体上来看,这种设计可以降低节点故障时受影响的用户的数量和范围
1.4.3. 正常运行情况下,不存在CP和AP的选择,可以同时满足CA
CAP理论告诉我们分布式系统只能选择CP或者AP,但其实这里的前提是系统发生了“分区”现象。如果系统没有发生分区现象,也就是说P不存在的时候(节点间的网络连接一切正常),我们没有必要放弃C或者A,应该C和A都可以保证,这就要求架构设计的时候既要考虑分区发生时选择CP还是AP,也要考虑分区没有发生时如何保证CA。
以用户管理系统为例,即使是实现CA,不同的数据实现方式也可能不一样:用户账号数据可以采用“消息队列”的方式来实现CA,因为消息队列可以比较好地控制实时性,但实现起来就复杂一些;而用户信息数据可以采用“数据库同步”的方式来实现CA,因为数据库的方式虽然在某些场景下可能延迟较高,但使用起来简单。
1.4.4. 放弃并不等于什么都不做,需要为分区恢复后做准备
CAP理论告诉我们三者只能取两个,需要“牺牲”(sacrificed)另外一个,这里的“牺牲”是有一定误导作用的,因为“牺牲”让很多人理解成什么都不做。
实际上,CAP理论的“牺牲”只是说在分区过程中我们无法保证C或者A,但并不意味着什么都不做。
因为在系统整个运行周期中,大部分时间都是正常的,发生分区现象的时间并不长。
99.99%可用性(俗称4个9)的系统,一年运行下来,不可用的时间只有50分钟;99.999%(俗称5个9)可用性的系统,一年运行下来,不可用的时间只有5分钟。
分区期间放弃C或者A,并不意味着永远放弃C和A,我们可以在分区期间进行一些操作,从而让分区故障解决后,系统能够重新达到CA的状态。
最典型的就是在分区期间记录一些日志,当分区故障解决后,系统根据日志进行数据恢复,使得重新达到CA状态。
以用户管理系统为例,对于用户账号数据,假设我们选择了CP,则分区发生后,节点1可以继续注册新用户,节点2无法注册新用户(这里就是不符合A的原因,因为节点2收到注册请求后会返回error),此时节点1可以将新注册但未同步到节点2的用户记录到日志中。当分区恢复后,节点1读取日志中的记录,同步给节点2,当同步完成后,节点1和节点2就达到了同时满足CA的状态。
而对于用户信息数据,假设我们选择了AP,则分区发生后,节点1和节点2都可以修改用户信息,但两边可能修改不一样。例如,用户在节点1中将爱好改为“旅游、美食、跑步”,然后用户在节点2中将爱好改为“美食、游戏”,节点1和节点2都记录了未同步的爱好数据,当分区恢复后,系统按照某个规则来合并数据。例如,按照“最后修改优先规则”将用户爱好修改为“美食、游戏”,按照“字数最多优先规则”则将用户爱好修改为“旅游,美食、跑步”,也可以完全将数据冲突报告出来,由人工来选择具体应该采用哪一条。
1.5. CAP与ACID
ACID是数据库管理系统为了保证事务的正确性而提出来的一个理论,ACID包含四个约束
Atomicity(原子性)
一个事务中的所有操作,要么全部完成,要么全部不完成,不会在中间某个环节结束。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
Consistency(一致性)
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
Isolation(隔离性)
数据库允许多个并发事务同时对数据进行读写和修改的能力。隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
Durability(持久性)
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
可以看到,ACID中的A(Atomicity)和CAP中的A(Availability)意义完全不同,而ACID中的C和CAP中的C名称虽然都是一致性,但含义也完全不一样。ACID中的C是指数据库的数据完整性,而CAP中的C是指分布式节点中的数据一致性。再结合ACID的应用场景是数据库事务,CAP关注的是分布式系统数据读写这个差异点来看,其实CAP和ACID的对比就类似关公战秦琼,虽然关公和秦琼都是武将,但其实没有太多可比性。
1.6. CAP与BASE
BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency),核心思想是即使无法做到强一致性(CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性。
基本可用(Basically Available)
分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。
这里的关键词是“部分”和“核心”,具体选择哪些作为可以损失的业务,哪些是必须保证的业务,是一项有挑战的工作。例如,对于一个用户管理系统来说,“登录”是核心功能,而“注册”可以算作非核心功能。因为未注册的用户本来就还没有使用系统的业务,注册不了最多就是流失一部分用户,而且这部分用户数量较少。如果用户已经注册但无法登录,那就意味用户无法使用系统。例如,充了钱的游戏不能玩了、云存储不能用了……这些会对用户造成较大损失,而且登录用户数量远远大于新注册用户,影响范围更大。
软状态(Soft State)
允许系统存在中间状态,而该中间状态不会影响系统整体可用性。这里的中间状态就是CAP理论中的数据不一致。
最终一致性(Eventual Consistency)
系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。
这里的关键词是“一定时间” 和 “最终”,“一定时间”和数据的特性是强关联的,不同的数据能够容忍的不一致时间是不同的。
举一个微博系统的例子,用户账号数据最好能在1分钟内就达到一致状态,因为用户在A节点注册或者登录后,1分钟内不太可能立刻切换到另外一个节点,但10分钟后可能就重新登录到另外一个节点了;而用户发布的最新微博,可以容忍30分钟内达到一致状态,因为对于用户来说,看不到某个明星发布的最新微博,用户是无感知的,会认为明星没有发布微博。“最终”的含义就是不管多长时间,最终还是要达到一致性的状态。
BASE理论本质上是对CAP的延伸和补充,更具体地说,是对CAP中AP方案的一个补充。前面在剖析CAP理论时,提到了其实和BASE相关的两点:
CAP理论是忽略延时的,而实际应用中延时是无法避免的
这一点就意味着完美的CP场景是不存在的,即使是几毫秒的数据复制延迟,在这几毫秒时间间隔内,系统是不符合CP要求的。因此CAP中的CP方案,实际上也是实现了最终一致性,只是“一定时间”是指几毫秒而已。
AP方案中牺牲一致性只是指分区期间,而不是永远放弃一致性。
这一点其实就是BASE理论延伸的地方,分区期间牺牲一致性,但分区故障恢复后,系统应该达到最终一致性。
2. FMEA方法:排除架构可用性隐患的利器
高可用和高性能,高可用更复杂一些,主要原因在于异常的场景很多,只要有一个场景遗漏,架构设计就存在可用性隐患,而根据墨菲定律“可能出错的事情最终都会出错”,架构隐患总有一天会导致系统故障。因此,我们在进行架构设计的时候必须全面分析系统的可用性。
2.1. FMEA介绍
FMEA(Failure mode and effects analysis,故障模式与影响分析)又称为失效模式与后果分析、失效模式与效应分析、故障模式与后果分析。
FMEA是一种在各行各业都有广泛应用的可用性分析方法,通过对系统范围内潜在的故障模式加以分析,并按照严重程度进行分类,以确定失效对于系统的最终影响。
FMEA最早是在美国军方开始应用的,20世纪40年代后期,美国空军正式采用了FMEA。尽管最初是在军事领域建立的方法,但FMEA方法现在已广泛应用于各种各样的行业,包括半导体加工、餐饮服务、塑料制造、软件及医疗保健行业。FMEA之所以能够在这些差异很大的领域都得到应用,根本原因在于FMEA是一套分析和思考的方法,而不是某个领域的技能或者工具。
软件架构设计领域,FMEA并不能指导我们如何做架构设计,而是当我们设计出一个架构后,再使用FMEA对这个架构进行分析,看看架构是否还存在某些可用性的隐患。
2.2. FMEA方法
在架构设计领域,FMEA的具体分析方法是:
给出初始的架构设计图。
假设架构中某个部件发生故障。
分析此故障对系统功能造成的影响。
根据分析结果,判断架构是否需要进行优化。
FMEA分析的方法其实很简单,就是一个FMEA分析表,常见的FMEA分析表格包含下面部分。
功能点
当前的FMEA分析涉及的功能点,注意这里的“功能点”指的是从用户角度来看的,而不是从系统各个模块功能点划分来看的。
例如,对于一个用户管理系统,使用FMEA分析时 “登录”“注册”才是功能点,而用户管理系统中的数据库存储功能、Redis缓存功能不能作为FMEA分析的功能点。
故障模式
故障模式指的是系统会出现什么样的故障,包括故障点和故障形式。故障模式的描述要尽量精确,多使用量化描述,避免使用泛化的描述。例如,推荐使用“MySQL响应时间达到3秒”,而不是“MySQL响应慢”。
需要特别注意的是,这里的故障模式并不需要给出真正的故障原因,我们只需要假设出现某种故障现象即可,例如MySQL响应时间达到3秒。造成MySQL响应时间达到3秒可能的原因很多:磁盘坏道、慢查询、服务器到MySQL的连接网络故障、MySQL bug等,我们并不需要在故障模式中一一列出来,而是在后面的“故障原因”一节中列出来。因为在实际应用过程中,不管哪种原因,只要现象是一样的,对业务的影响就是一样的。
故障影响
当发生故障模式中描述的故障时,功能点具体会受到什么影响。
常见的影响有:功能点偶尔不可用、功能点完全不可用、部分用户功能点不可用、功能点响应缓慢、功能点出错等。
故障影响也需要尽量准确描述。
例如,推荐使用“20%的用户无法登录”,而不是“大部分用户无法登录”。要注意这里的数字不需要完全精确,比如21.25%这样的数据其实是没有必要的,我们只需要预估影响是20%还是40%。
严重程度
严重程度指站在业务的角度故障的影响程度,一般分为“致命/高/中/低/无”五个档次。
严重程度按照这个公式进行评估:严重程度 = 功能点重要程度 × 故障影响范围 × 功能点受损程度。
同样以用户管理系统为例:登录功能比修改用户资料要重要得多,80%的用户比20%的用户范围更大,完全无法登录比登录缓慢要更严重。因此我们可以得出如下故障模式的严重程度。
致命:超过70%用户无法登录。
高:超过30%的用户无法登录。
中:所有用户登录时间超过5秒。
低:10%的用户登录时间超过5秒。
中:所有用户都无法修改资料。
低:20%的用户无法修改头像。
对于某个故障的影响到底属于哪个档次,有时会出现一些争议。例如,“所有用户都无法修改资料”,有的人认为是高,有的人可能认为是中,这个没有绝对标准,一般建议相关人员讨论确定即可。也不建议花费太多时间争论,争执不下时架构师裁定即可。
故障原因
“故障模式”中只描述了故障的现象,并没有单独列出故障原因。主要原因在于不管什么故障原因,故障现象相同,对功能点的影响就相同。
单独将故障原因是因为:
不同的故障原因发生概率不相同
不同的故障原因检测手段不一样
不同的故障原因的处理措施不一样
故障概率
这里的概率就是指某个具体故障原因发生的概率。例如,磁盘坏道的概率、MySQL bug的概率、没有索引的概率。一般分为“高/中/低”三档即可,具体评估的时候需要有以下几点需要重点关注。
硬件
开源系统
成熟的开源系统bug率低,刚发布的开源系统bug率相比会高一些;自己已经有使用经验的开源系统bug率会低,刚开始尝试使用的开源系统bug率会高。
自研系统
和开源系统类似,成熟的自研系统故障概率会低,而新开发的系统故障概率会高。
风险程度
风险程度就是综合严重程度和故障概率来一起判断某个故障的最终等级,风险程度 = 严重程度 × 故障概率。
因此可能出现某个故障影响非常严重,但其概率很低,最终来看风险程度就低。
“某个机房业务瘫痪”对业务影响是致命的,但如果故障原因是“地震”,那概率就很低。
已有措施
针对具体的故障原因,系统现在是否提供了某些措施来应对,包括:检测告警、容错、自恢复等。
检测告警
最简单的措施就是检测故障,然后告警,系统自己不针对故障进行处理,需要人工干预。
容错
检测到故障后,系统能够通过备份手段应对。例如,MySQL主备机,当业务服务器检测到主机无法连接后,自动连接备机读取数据。
自恢复
检测到故障后,系统能够自己恢复。例如,Hadoop检测到某台机器故障后,能够将存储在这台机器的副本重新分配到其他机器。当然,这里的恢复主要还是指“业务”上的恢复,一般不太可能将真正的故障恢复。例如,Hadoop不可能将产生了磁盘坏道的磁盘修复成没有坏道的磁盘。
规避措施
规避措施指为了降低故障发生概率而做的一些事情,可以是技术手段,也可以是管理手段。
技术手段:为了避免新引入的MongoDB丢失数据,在MySQL中冗余一份。
管理手段:为了降低磁盘坏道的概率,强制统一更换服务时间超过2年的磁盘。
解决措施
解决措施指为了能够解决问题而做的一些事情,一般都是技术手段。例如
为了解决密码暴力破解,增加密码重试次数限制。
为了解决拖库导致数据泄露,将数据库中的敏感数据加密保存。
为了解决非法访问,增加白名单控制。
一般来说,如果某个故障既可以采取规避措施,又可以采取解决措施,那么我们会优先选择解决措施,毕竟能解决问题当然是最好的。但很多时候有些问题是系统自己无法解决的,例如磁盘坏道、开源系统bug,这类故障只能采取规避措施;系统能够自己解决的故障,大部分是和系统本身功能相关的。
后续规划
综合前面的分析,就可以看出哪些故障我们目前还缺乏对应的措施,哪些已有措施还不够,针对这些不足的地方,再结合风险程度进行排序,给出后续的改进规划。这些规划既可以是技术手段,也可以是管理手段;可以是规避措施,也可以是解决措施。同时需要考虑资源的投入情况,优先将风险程度高的系统隐患解决。例如
地震导致机房业务中断:这个故障模式就无法解决,只能通过备份中心规避,尽量减少影响;而机柜断电导致机房业务中断:可以通过将业务机器分散在不同机柜来规避。
敏感数据泄露:这个故障模式可以通过数据库加密的技术手段来解决。
MongoDB断电丢数据:这个故障模式可以通过将数据冗余一份在MySQL中,在故障情况下重建数据来规避影响。
2.3. FMEA实战
以一个简单的样例来模拟一次FMEA分析。假设我们设计一个最简单的用户管理系统,包含登录和注册两个功能,其初始架构是:

初始架构很简单:MySQL负责存储,Memcache(以下简称MC)负责缓存,Server负责业务处理。我们来看看这个架构通过FMEA分析后,能够有什么样的发现,下表是分析的样例

经过上表的FMEA分析,将“后续规划”列的内容汇总一下,我们最终得到了下面几条需要改进的措施:
MySQL增加备机。
MC从单机扩展为集群。
MySQL双网卡连接。
改进后的架构如下:

评论区