第17章 · 趣味学习

系统的可靠性分析与设计:让你的系统"死不了"

故事从一封凌晨三点的告警邮件开始。你在某支付公司当架构师,系统刚上线半年,凌晨告警炸了:核心交易库挂了,宕机47分钟,损失订单金额八位数。老板第二天黑着脸扔下一句:"我要它永远不死。"

你心想:永远不死那是神仙,系统总会挂。但"挂了能快速复活""挂了不影响业务""挂了不丢数据"——这三件事,就是可靠性设计的全部功夫。这一章,就是你的"保命武功秘籍"。

📊 17.1 可靠性六大指标——"死"和"修"的数学化

老板要"不死",你得先量化"死"。可靠性圈子里有六个核心概念,每一个都是一把尺子:

指标符号/全称人话
可靠度R(t)t=0正常,[0,t]内不挂的概率
可用度A(t)某个时刻t能用的概率(含修好后)
可维度M(t)挂了之后在规定时间内修好的概率
平均无故障时间MTTF从开机到第一次挂的期望时间
平均故障修复时间MTTR挂了到修好的平均时间
平均故障间隔时间MTBF两次故障之间的时间(含修复)
实习
实习生
MTTF和MTBF不就是一回事吗?都是故障间隔啊?
架构师(你)
这是出题人最爱挖的坑。MTTF是"开机到第一次挂",中间没人修;MTBF是"两次故障之间",必然包含一次修复。所以铁律:MTBF = MTTF + MTTR。你的系统一年挂一次、修一天,MTTF≈365天,MTTR=1天,MTBF=366天。
🚗 把系统当出租车:MTTF=这车从新车到第一次抛锚能跑多少天;MTTR=抛锚到修好能开多少天;MTBF=这次抛锚到下次抛锚之间多少天(含修车那天)。可靠度R(t)=这周不抛锚的概率;可用度A(t)=此刻打表能不能用(抛锚过但修好了也算可用);可维度M(t)=抛锚后1小时内修好的概率。

失效率λ(单位时间挂几次)和修复率μ(单位时间修几次)是上面公式的心脏:MTTF=1/λ,MTTR=1/μ。指数分布下,从任意时刻到下次故障的期望时间都相等——这就是为啥宕机总爱在你最忙的时候来。

💥 17.2 系统故障模型——故障的"三态"和"四级"解剖

想防故障,先得分类。三个易混概念先分清:

  • 🔴 失效(Failure):硬件物理改变(芯片烧了)
  • 🟡 故障(Fault):因失效/干扰/设计错误/操作失误引起的硬件或软件错误状态
  • 🟢 错误/差错(Error):故障在程序或数据结构里的具体位置

故障按"持续时间"分三种形态——这才是考点:

形态特征能修吗
永久性连续稳定,不可恢复物理改变替换/重新设计
间歇性不稳定硬件/状态导致,偶发替换/重新设计
瞬时性暂时环境条件(电磁/电压)引起不可修(硬件没坏,重跑就行)
⚠️ 高频考点:瞬时和间歇故障是系统主要错误源。瞬时故障"不可修复"——因为硬件本身没坏,重来一次就好。这跟"永久性要换件"是完全不同的处理思路。

故障模型可在四个级别建立,级别越低处理代价越低但覆盖越少

  1. 逻辑级:固定型(线恒0/恒1,接地/短路)、短路(输出=输入)、开路(输出悬空)、桥接(两条不该连的线连上)
  2. 数据结构级(差错表现):独立差错(1位翻转)、算术差错(数据±2ⁱ)、单向差错(向量中若干位同向改变)
  3. 软件故障/差错:非法转移、误转移、死循环、空间溢出、数据执行(指令计数器指向数据)、无理数据。软件不会"疲劳衰老",只跟设计有关
  4. 系统级:功能错误——系统输出与设计说明不一致;若无保护机构则导致系统失效
🩺 四级模型像看病分诊:逻辑级=细胞级(最细,最便宜);数据结构级=器官级;软件故障级=行为级;系统级=整个人不行了。级别越低越早发现代价越小,但能查的病越少;高级模型兜底。

🛠️ 17.3 系统配置方法——三种容错阵型

容错=某些部件挂了系统还能正常工作。你给老板画了三套阵型:

① 单机容错:自检 + 冗余

自检:出非致命故障时自动发现、定位、隔离。需配重复部件/备份部件/多通道,常配合冗余使用

冗余分四种:硬件冗余(加硬件)、软件冗余(不同算法/不同人写的程序)、时间冗余(指令/程序重复执行)、信息冗余(加数据位)。

两种线路要分清:

  • 🔁 重复线路:多个相同元件并联同时工作,只要一个不挂系统就正常
  • 📦 备份线路:备份件平时不接入,主件挂了才切过来
⚡ 重复线路=三个保安同时上岗,一个摸鱼另两个还在;备份线路=一个保安上岗,另一个在休息室待命,上岗的倒了再顶上。重复线路费电但切换无缝;备份线路省资源但有切换间隙。

② 双机热备份:心跳与三模式

两台服务器+共享磁盘阵列(或各自RAID卡)+双机软件。靠"心跳"信号互通——主从按时间间隔互发状态。主机心跳断了,备机立即接管。

模式两机状态典型场景
双机热备active/standby,备机干等证券资金/行情服务器(费资源但最稳)
双机互备两机各跑独立应用,互为备机性能要求高时
双机双工两机都active跑相同应用+负载均衡Web/FTP服务器

③ 服务器集群:一群装成一个

一组独立服务器在网络中组合成单一系统,对外一个共同名字。任一节点挂了,其应用被另一节点自动接管;应用挂了重启或被接管;客户很快连到其他服务器。共享数据存储空间,各自存OS和应用本地。

🐝 集群=一群蜜蜂装成一个"超级蜂群"对外卖蜂蜜。死一只工蜂不影响整体产蜜;蜂巢(共享存储)是公共的,但每只蜂自己带干粮(本地OS)。

🧮 17.4 系统可靠性模型——三种算"可靠"的法子

老板问"你这系统到底有多可靠",你不能拍胸脯,得拿模型说话。三个经典模型:

① 时间模型(Shooman可靠性增长模型)

假设:t=0时软件故障数是常数,调试越久故障越少。剩余故障数 Er(τ)=E0−Ec(τ),再除以指令数I归一化。风险函数 Z(t)=C·Er(τ),可靠度 R(t)=e^(−C·Er(τ)·t),MTTF=1/(C·Er(τ))。

⚠️ Shooman模型难点是确定调试前的故障总数E0——你不知道一开始有多少bug,这正是希赛专家提示的考点。

② 故障植入模型(Mills 1972)

思路很骚:往程序里人为植入N1个已知bug,然后让测试员测,测出k个人为bug,按比例反推固有bug数N0。最大似然估计:N0 = N1·n/k − N1(n=测出总bug数)。前提假设:固有bug和人为bug被检概率相同、人为bug均匀植入、检到立即改。

🐟 这就像往鱼塘撒100条标记鱼,过几天捞200条里有20条标记的,按比例反推鱼塘原来约有1000条鱼。Basin 1974的两步查错法是变种——两个检测员独立查,用重合错误数η反推N0。

③ 数据模型(Nelson 1973)

预定输入集E,导致差错的输入集Ee。一次运行出错概率 P1=|Ee|/|E|,一次正常概率 R1=1−P1。n次运行不差错(可靠度) R(n)=R1ⁿ=(1−P1)ⁿ。等概率输入;不等概率则按pi加权。知道每次运行时间就能转成时间模型R(t)。

🔗 17.5 可靠度计算——串联、并联与马尔柯夫

组合模型五假设:系统只两态(运行/失效)、部件只两态、部件失效独立、系统失效当且仅当剩余资源不满足最低要求、已知各部件可靠度。

① 串联系统:一个挂全挂

任意模块失效则系统失败。Rsys = R1·R2·…·Rn(各模块可靠度乘积)。可靠度比最差的还低——木桶效应的极限版。

② 并联系统:全挂才挂

只要一个能运行系统就能运行。失效概率分布 Qsys = Q1·Q2·…·Qn,可靠度 Rsys = 1 − ∏Qi = 1 − ∏(1−Ri)。冗余越多越可靠,但收益递减。

③ 串并联系统

N个并联子系统,每个子系统又由n个元件串联。若各Rij全相等为R:Rsys = 1 − (1 − Rⁿ)ᴺ

🔌 串联=流水线,一个工位停整条线停(可靠性乘起来变低);并联=多雇几个工人干同一件事,全躺平了才停(可靠性 1−∏(1−Ri) 变高)。考试常考并联公式:3个0.9并联 = 1−0.1³ = 0.999。

④ 马尔柯夫模型:状态转移的高级玩家

核心:状态 + 状态转移。n模块系统有2ⁿ个状态。基本假设——转移概率只取决于当前状态(无记忆性)。运行→失效转移率=失效率λ,失效→运行转移率=修复率μ。

状态图分n+1层:第1层全运行(1态),第i+1层有n个模块中i个失效的各种组合,第n+1层全失效(1态)。列出微分方程组 P(t)=T·P(t),T为状态转移矩阵,这就是查普曼—科尔莫戈罗夫(Chapman-Kolmogorov)方程,常用拉普拉斯变换求解。

🎯 希赛提示:组合模型能算的马尔柯夫都能算,马尔柯夫还能算组合模型不能算的(比如带修复的)。考试遇到"带修复"或"多状态依赖"选马尔柯夫。

🛡️ 17.6 提高可靠性的措施——冗余两大流派

故障掩蔽(防故障→差错) + 系统重组(防差错→失效),是容错的两条基本途径,都建立在资源冗余上。本节聚焦硬件冗余和信息冗余。

① 硬件冗余:TMR三模冗余

三个相同模块收相同输入,结果送多数表决器——三选二,一个挂了另两个掩蔽它。无修复TMR可靠度 RTMR = Rv·(3Rm² − 2Rm³),Rm=e^(−λt)。带修复后可靠性大幅提升。表决器自己也可能挂,可对表决器也做3倍冗余。推广为N模冗余NMR(N>3奇数,方便多数表决)。

⚖️ TMR=三个裁判同时打分,取多数。一个裁判被收买(故障模块),另两个正派的能纠正结果。NMR=五个/七个裁判,更抗贿赂但更贵。火箭导航、飞机飞控都是这套。

② 信息冗余:海明码与CRC

海明校验码(Hamming 1950):k个数据位+r个校验位,码距均匀拉大。每位数据从属多个重叠奇偶组,根据哪些校验位出错可定位到具体哪位出错并取反纠错——检二错纠一错。它是一种(n,k)线性纠错码,用奇偶校验矩阵PCM描述,是(n−k)×n的0/1矩阵。

构造m位码字海明码四步:定最小校验位数k→编m+k位新码字选k校验位满足奇偶→接收方做k个奇偶检查→全对则无错,否则错误位由检查结果唯一确定。

循环冗余校验码CRC:K位信息+R位校验,编码长N=(N,K)码。存在最高次幂R=N−K的生成多项式G(x)。生成四步:G(x)转R+1位二进制→信息码左移R位(即C(x)·2ᴿ)→对G(x)做模2除取R位余数→余数拼到空位得完整CRC码。

📦 海明码=给每件快递贴多个重叠的防伪标签,扫哪个标签坏了能定位到具体哪件被动手脚,还能自动把这件"纠正"回来(纠一错)。CRC=给整箱货算一个"校验码"印章,到货重算一次对得上就基本没丢没坏——查错能力强但一般不纠错,广泛用于移动通信和磁盘存储。

💾 17.7 备份与恢复——最后的安全网

故障不可避免,所以得有"后悔药"。两大基础技术:数据转储日志文件

数据转储分两种:

  • 🧊 静态转储:系统中无事务时转储,干净但需停机
  • 🏃 动态转储:转储与事务并发,不影响运行,但副本不能保证完全正确有效

日志文件:把所有事务对系统的修改活动都登记下来。静态转储后可用日志重放恢复避免重跑事务;动态转储可结合副本+转储期间日志做故障恢复。

备份方式别名特点
脱机备份冷备份静态转储,备份全部物理文件(控制/数据/重做/归档日志/初始化);恢复步骤最少、更快更少出错;能恢复到任意时间点
联机备份热备份动态转储,部分备份,运行时执行;可完全时间点恢复、库一直打开省物理资源;但复杂需深懂内核、反复测试
🧊 冷备份=关门盘点,账算得最清但店铺没法营业;热备份=边营业边盘点,不影响生意但账目复杂、容易遗漏。两者都+好重做日志,才能把数据恢复到任意时间点——这就是"时间旅行"的底气。
⚠️ 易踩坑:动态转储"不能保证副本中数据正确有效"是考点——因为它和事务并发,可能在转储瞬间读到中间状态。补救办法就是配合日志文件。

🏆 本章知识地图

第17章核心知识点:
  • 📌 六指标:R(t)可靠度 / A(t)可用度 / M(t)可维度 / MTTF=1/λ / MTTR=1/μ / MTBF=MTTF+MTTR
  • 📌 故障三态:永久/间歇/瞬时(瞬时不可修因为硬件没坏);四级模型:逻辑→数据结构→软件→系统,级别越低代价越低覆盖越少
  • 📌 配置三阵型:单机(自检+硬件/软件/时间/信息冗余,重复vs备份线路) / 双机热备(心跳+热备/互备/双工三模式) / 集群(单一系统共享存储)
  • 📌 三模型:Shooman时间(难定E0) / Mills故障植入(N0=N1·n/k−N1) / Nelson数据(R(n)=(1−P1)ⁿ)
  • 📌 串联R=∏Ri / 并联R=1−∏(1−Ri) / 串并联R=1−(1−Rⁿ)ᴺ / 马尔柯夫能算组合算不了的(带修复)
  • 📌 TMR三模冗余 RTMR=Rv(3Rm²−2Rm³);NMR奇数N>3;海明码纠一错检二错;CRC模2除取余
  • 📌 备份:静态/动态转储 + 日志;冷备份(脱机静态全量) vs 热备份(联机动态部分)
🎮 实战场景:回到老板那句"永远不死"。你的方案:核心库双机热备(心跳+active/standby)+RAID磁盘阵列(信息冗余)+每日冷备份+实时日志+集群多节点接管+关键交易TMR表决。一年后MTBF从几小时干到几千小时,老板终于能睡个安稳觉。