故事从一封凌晨三点的告警邮件开始。你在某支付公司当架构师,系统刚上线半年,凌晨告警炸了:核心交易库挂了,宕机47分钟,损失订单金额八位数。老板第二天黑着脸扔下一句:"我要它永远不死。"
你心想:永远不死那是神仙,系统总会挂。但"挂了能快速复活""挂了不影响业务""挂了不丢数据"——这三件事,就是可靠性设计的全部功夫。这一章,就是你的"保命武功秘籍"。
📊 17.1 可靠性六大指标——"死"和"修"的数学化
老板要"不死",你得先量化"死"。可靠性圈子里有六个核心概念,每一个都是一把尺子:
| 指标 | 符号/全称 | 人话 |
|---|---|---|
| 可靠度 | R(t) | t=0正常,[0,t]内不挂的概率 |
| 可用度 | A(t) | 某个时刻t能用的概率(含修好后) |
| 可维度 | M(t) | 挂了之后在规定时间内修好的概率 |
| 平均无故障时间 | MTTF | 从开机到第一次挂的期望时间 |
| 平均故障修复时间 | MTTR | 挂了到修好的平均时间 |
| 平均故障间隔时间 | MTBF | 两次故障之间的时间(含修复) |
失效率λ(单位时间挂几次)和修复率μ(单位时间修几次)是上面公式的心脏:MTTF=1/λ,MTTR=1/μ。指数分布下,从任意时刻到下次故障的期望时间都相等——这就是为啥宕机总爱在你最忙的时候来。
💥 17.2 系统故障模型——故障的"三态"和"四级"解剖
想防故障,先得分类。三个易混概念先分清:
- 🔴 失效(Failure):硬件物理改变(芯片烧了)
- 🟡 故障(Fault):因失效/干扰/设计错误/操作失误引起的硬件或软件错误状态
- 🟢 错误/差错(Error):故障在程序或数据结构里的具体位置
故障按"持续时间"分三种形态——这才是考点:
| 形态 | 特征 | 能修吗 |
|---|---|---|
| 永久性 | 连续稳定,不可恢复物理改变 | 替换/重新设计 |
| 间歇性 | 不稳定硬件/状态导致,偶发 | 替换/重新设计 |
| 瞬时性 | 暂时环境条件(电磁/电压)引起 | 不可修(硬件没坏,重跑就行) |
故障模型可在四个级别建立,级别越低处理代价越低但覆盖越少:
- 逻辑级:固定型(线恒0/恒1,接地/短路)、短路(输出=输入)、开路(输出悬空)、桥接(两条不该连的线连上)
- 数据结构级(差错表现):独立差错(1位翻转)、算术差错(数据±2ⁱ)、单向差错(向量中若干位同向改变)
- 软件故障/差错:非法转移、误转移、死循环、空间溢出、数据执行(指令计数器指向数据)、无理数据。软件不会"疲劳衰老",只跟设计有关
- 系统级:功能错误——系统输出与设计说明不一致;若无保护机构则导致系统失效
🛠️ 17.3 系统配置方法——三种容错阵型
容错=某些部件挂了系统还能正常工作。你给老板画了三套阵型:
① 单机容错:自检 + 冗余
自检:出非致命故障时自动发现、定位、隔离。需配重复部件/备份部件/多通道,常配合冗余使用。
冗余分四种:硬件冗余(加硬件)、软件冗余(不同算法/不同人写的程序)、时间冗余(指令/程序重复执行)、信息冗余(加数据位)。
两种线路要分清:
- 🔁 重复线路:多个相同元件并联同时工作,只要一个不挂系统就正常
- 📦 备份线路:备份件平时不接入,主件挂了才切过来
② 双机热备份:心跳与三模式
两台服务器+共享磁盘阵列(或各自RAID卡)+双机软件。靠"心跳"信号互通——主从按时间间隔互发状态。主机心跳断了,备机立即接管。
| 模式 | 两机状态 | 典型场景 |
|---|---|---|
| 双机热备 | active/standby,备机干等 | 证券资金/行情服务器(费资源但最稳) |
| 双机互备 | 两机各跑独立应用,互为备机 | 性能要求高时 |
| 双机双工 | 两机都active跑相同应用+负载均衡 | Web/FTP服务器 |
③ 服务器集群:一群装成一个
一组独立服务器在网络中组合成单一系统,对外一个共同名字。任一节点挂了,其应用被另一节点自动接管;应用挂了重启或被接管;客户很快连到其他服务器。共享数据存储空间,各自存OS和应用本地。
🧮 17.4 系统可靠性模型——三种算"可靠"的法子
老板问"你这系统到底有多可靠",你不能拍胸脯,得拿模型说话。三个经典模型:
① 时间模型(Shooman可靠性增长模型)
假设:t=0时软件故障数是常数,调试越久故障越少。剩余故障数 Er(τ)=E0−Ec(τ),再除以指令数I归一化。风险函数 Z(t)=C·Er(τ),可靠度 R(t)=e^(−C·Er(τ)·t),MTTF=1/(C·Er(τ))。
② 故障植入模型(Mills 1972)
思路很骚:往程序里人为植入N1个已知bug,然后让测试员测,测出k个人为bug,按比例反推固有bug数N0。最大似然估计:N0 = N1·n/k − N1(n=测出总bug数)。前提假设:固有bug和人为bug被检概率相同、人为bug均匀植入、检到立即改。
③ 数据模型(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ⁿ)ᴺ。
④ 马尔柯夫模型:状态转移的高级玩家
核心:状态 + 状态转移。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奇数,方便多数表决)。
② 信息冗余:海明码与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码。
💾 17.7 备份与恢复——最后的安全网
故障不可避免,所以得有"后悔药"。两大基础技术:数据转储和日志文件。
数据转储分两种:
- 🧊 静态转储:系统中无事务时转储,干净但需停机
- 🏃 动态转储:转储与事务并发,不影响运行,但副本不能保证完全正确有效
日志文件:把所有事务对系统的修改活动都登记下来。静态转储后可用日志重放恢复避免重跑事务;动态转储可结合副本+转储期间日志做故障恢复。
| 备份方式 | 别名 | 特点 |
|---|---|---|
| 脱机备份 | 冷备份 | 静态转储,备份全部物理文件(控制/数据/重做/归档日志/初始化);恢复步骤最少、更快更少出错;能恢复到任意时间点 |
| 联机备份 | 热备份 | 动态转储,部分备份,运行时执行;可完全时间点恢复、库一直打开省物理资源;但复杂需深懂内核、反复测试 |
🏆 本章知识地图
- 📌 六指标: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 热备份(联机动态部分)